[关闭]
@devilogic 2015-12-21T17:07:57.000000Z 字数 1925 阅读 1588

关于壳的定义与评估

devilogic


  1. 一个人的自言自语,不可过于认真对待

如何定义一个软件保护壳,什么才叫一个保护壳,至少从字面意义上理解,就是在软件外边套了一层保护罩,防治与外界直接的接触。这种字面上的理解其实很直接,形式上也很像。

软件保护壳离不开运行环境,这里运行环境方面有两个部分组成,一是体系结构,也就是CPU是如何设计的,这关系到了,壳代码的运行,另外一方面就是承载这些代码的文件格式,而文件格式又是与操作系统有关系的。壳也是一个软件系统,也要符合当前操作系统。为了更形式化以上所述,让我们定义表示文件格式,而表示体系结构,这样两个概念形成一个被称为的集合。任何有意义的软件其实都要符合这个。让我们形式化这个叙述。存在一个函数,以及一组数据序列,当在上有定义,这里的可以看成是符合人预期的运行效果,可以当做符合的一种编码形式。也就是说在存在一个函数使得。这里的意义在于我们用一些更理论化的东西定义软件系统,目的为了更方便的讨论壳。

壳也是一个软件系统,它的输入是被保护目标本身所形成的一组序列,而存在一个函数,这里的也同样是符合的一种编码形式,使得。它们在运行后的形式上是一致性的。

因为我们是为了评估一个壳的好坏,对于一个软件系统而言,无疑是从两个方面来考虑一个是性能,一个是质量,对于前者其表现形式就是当加壳后的运行效率以及兼容性,对于后者无疑就是破解者所花费的时间。这里定义两者为。那么这里其实就可以给定一个评估壳的定义了。

壳是这样一个六元组。一个有实用价值的壳最起码要满足期望的当时,

让我们进一步的来研究函数,这个函数同一样,只不过是程序本身最初的编码形式,而是加壳后的编码形式,在逻辑上等价是说明这两个函数关系最简明的说明,即

我之前对壳的三个阶段,有一个归纳,来表示壳的三种不同等级,划分的标准是从实现壳的难度来划分的。

  1. 壳运行完毕后退出。再不接管被保护程序的控制权
  2. 壳运行完毕后,将控制权交给被保护程序本身,当在程序运行到某个点时,重新获得控制权
  3. 壳将输入序列在符合的前提下,将其转化成另外一种序列使得

让我们解释一下上面三种阶段。第一种当壳完成解密目标代码时,它将不会再次控制程序,被保护程序的明文将在内存中展开。在此之前,壳可以调用一切系统手段来防治黑客的调试与逆向。

第二中阶段,可以实现分段式的加解密。壳运行完毕后,并不会消失而仍然会在程序运行到某个点时再次启动,这里所说的不会消失,并不是指的在壳首次运行阶段以开辟线程式的方式与被保护程序并行化运行,而是与被保护程序串行化的运行。例如:使用插入一致可导入异常机制的代码,在运行期间触发异常,而在壳首次运行期间,注册了对应的异常处理函数。不是程序员的读者可自行忽略这个例如,它指是为了让叙述更直观而已

第三个阶段,其实最简单的解释是,将被保护程序当做源代码,而壳是一种二进制编译器,将这种特殊的源代码重新编译成逻辑等价的代码。这种代码会使得黑客的逆向时间更长。一个典型的例子是虚拟机保护技术。

这里讨论的是壳的一些通用的性质,与系统相关的一些技术点应用,不在这里讨论,也无讨论的必要性。

让我们再从壳制作的角度来看下,要想编写壳,首先要拆解文件格式,无论是Windows上的PE还是Linux上的ELF。而Android上的DEX文件。前两者更纯粹一些,其编码指令是运行在真实CPU上的,而Android是运行在一个称为Dalvik虚拟的体系结构之上。前两者是符合一般壳的制作流程,首先拆解文件格式,随后附加壳代码到原始指令序列,重新组装文件格式。而Android的做法是采用更偏系统的方式来采取保护,对本身的文件格式并无过大的改动。但是其形式又符合了我对壳的定义,姑且就算作是壳吧。这里无需太过矫情。再拆解文件格式之后,下一个阶段则是对指令序列的重写组合,实现所谓逻辑上等价。我们定义这两者前者称作,后者称作。每个壳一般都存在第一个函数,而后者不是必须的。也许其中还可以有一个函数来单纯的表示密码学算法。所以对于,我们可以定义两种形式。

,而加强版本的是

就写到这里吧,临睡前写的。时间仓促,不是非常严谨,很多更具体的东西也没有讨论。困了~~~

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注