最近项目用到了vmprotected对dll插件进行加壳,在测试阶段使用peid0.95进行检测是否加壳,使用完毕了,一脸懵逼。突然想起来,就查资料了解记录一下吧
一。什么是壳
一段专门负责保护软件不被非法修改和反编译的程序。一般先于程序运行,拿到控制权,然后完成保护软件的任务。
二。壳的加载过程
加壳工具是指压缩可执行文件EXE或DLL的工具。加壳过的可执行程序执行的实际是外壳程序,外壳程序负责把用户原来的程序在内存中解压缩,并把控制权交还给解开后的真正程序,这一切工作都是在内存中运行的
壳修改了原程序的执行文件的组织结构,从而能够比原程序代码提前获得控制权,并且不会影响原程序的正常运行
一般壳的装载过程:
1)获取壳自己所需要使用的API地址
如果用PE编辑工具查看加壳后的文件,会发现未加壳的文件和加壳后的文件的输入表不一样,加壳后的输入表一般所引入的DLL和API函数很少,其它API一般只在壳的代码中用显式链接方式动态加载这些API函数
2)解密原程序的各个区块(Section)的数据
壳一般都会加密原程序文件的各个区块。当程序执行外壳时会对这些区块数据解密,让程序能正常运行
注意:壳是按区块加密,按区块解密,并且把解密的区块按照区块的定义放在合适的内存位置
3)重定位
文件执行时将被映像到指定内存地址中,这个初始内存地址称为基地址(ImageBase)。
对于DLL的动态链接库文件来说,Windows系统没有办法保证每一次DLL运行时提供相同的基地址。这样“重定位”就很重要了。
此时壳中也需要提供进行“重定位”的代码,否则原程序中的代码是无法正常运行起来的。从这点来说,加壳的DLL比加壳的EXE更难修正。
4)HOOK-API
程序文件中的输入表的作用是让Windows系统在程序运行时提供API的实际地址给程序使用。在程序的第一行代码执行之前,Windows系统就完成了这个工作。
壳一般都修改了原程序文件的输入表,然后自己模仿Windows系统的工作来填充输入表中相关的数据。在填充过程中,外壳就可填充HOOK-API的代码的地址,这样就可间接地获得程序的控制权。
5)跳转到程序原入口点(OEP)
从这个时候起壳就把控制权交还给原程序了,一般的壳在这里会有明显的一个“分界线”。但现在的猛壳己没这界限了,壳里有肉,肉里有壳。
三。压缩引擎
加壳软件选择压缩引擎有一个特点:在保证压缩比的条件下,压缩速度慢点关系不大,但解压速度一定要快
四。检测加壳工具PEID
各种开发语言都有固定的启动代码部分,利用这点就可识别出是何种语言编编译的。样,不同的壳也有其特征码,利用这点就可识别是被何种壳所加密。
有些外壳程序为了欺骗PEiD等文件识别软件,会伪造启动代码部分,如将入口代码改成与Visual
所以,文件识别工具所给出的结果只是个参考,文件是否被加壳处理过,还得跟踪分析程序代码才可得知。