| 加壳软件的实现原理篇 |
|
|
|
|
|
Author: x0R |
|
|
Heap |
|
|
|
Heap |
棕色:代表HEAP区,也就是动态分配的内存区域. |
|
|
|
Protected Program |
|
Program |
蓝色:代表被加密后的源程序代码区 |
|
|
|
|
En/Decrypt |
红色:代表"保护程序代码",也就是所谓的壳. |
|
|
|
Encrypt/Decrypt |
|
|
|
|
Protected Program |
|
|
|
图1说明了一个较安全加壳后的程序,这样的壳程序有较好的保护措施, 会对IAT进行加密处理,加入了大量Anti-Debug代码防止调试程序进程分析与脱壳,加壳的时候会先对源程序的代码进行分析,然后进行关键代码替换与加密,替换的过程中会生相应的解密代码插入到程序中,加壳后的程序执行时候是分段解密执行的,而且解码的过程是在堆完成的,这样做是为了增加代码还原的难度,原程序的一些被替换的代码会在HEAP执行后然后JMP到被解码的程序处在执行。现在很多壳都用了这样的方法。 有些加壳程序没有在程序中"插入/替换"加/解密代码,只将自身包括在原程序的外面(就好比鸡蛋一样,外面是壳,里面是蛋黄).这样的保护程序并不安全,只要找到了关键的跳转OEP指令就可以轻松脱壳. |
|
|
|
|
|
|
|
|
|
Encrypt/Decrypt |
|
|
Protected Program |
|
|
|
|
|
|
Encrypt/Decrypt |
|
|
|
|
|
|
图1(保护型壳) |
|
|
|
Heap |
|
|
|
Heap |
棕色:代表HEAP区,也就是动态分配的内存区域. |
|
|
|
|
Decode |
绿色:代表解码程序(解压)。 |
|
Decode |
|
|
|
Compressed |
蓝色:代表被压缩后原程序代码区。 |
|
|
|
Compressed Code |
|
|
|
|
|
|
|
图2表示的是一个压缩壳压缩后的程序,程序在执行的时候首先会将解压代码自身进行解码,放入堆中,然后在对原程序进行解压。一般这种壳的保护都不是很强,很容易脱。只要找到OEP就可以直接DUMP,而且这类壳大部分对IAT没有进行处理,典型的壳有ASPACK |
|
|
|
|
|
|
|
|
|
|
|
图2(压缩型壳) |
|
|
|
Heap |
|
|
|
Heap |
棕色:代表HEAP区,也就是动态分配的内存区域. |
|
Decode |
|
|
|
Decode |
绿色:代表解码程序(解压)。 |
|
|
|
|
Protected |
蓝色:代表用密码加密后的后原程序代码区。 |
|
Protected Code |
|
|
|
|
|
|
|
|
|
图3表示的是被密码型加壳工具加壳后的程序。此类加壳程序一般应用在共享软件的注册。加壳程序根据用户输入的密码以相应的算法对程序代码区进行加密工作,当程序执行的时候会提示用户输入口令或注册码。如果破解者强行更改密码检测指令,会导致程序不正确的执行,因为被加密的代码并没有用相应的口令进行解码。程序没有被还原。 |
|
|
|
|
|
|
|
|
|
|
|
图3(密码型壳) |
|
|
| 以上所介绍的都是典型加壳方式,希望能对研究壳的初学者有些帮助。也许有些概念性的名词和别人定义不同,以上完全属于个人对壳的定义。必定每个人对概念的定义都不同,因为思想抽象层的层面都不同。 |
|
|
|
|
|
|
| |