加壳与脱壳1.什么是壳?2.加壳与脱壳3.加壳的加载过程4.脱壳的实现过程壳什么是壳?在一些计算机软件里也有一段专门负责保护软件不被非法修改或反编译的程序。它们一般都是先于程序运行,拿到控制权,然后完成它们保护软件的任务。由于这段程序和自然界的壳在功能上有很多相同的地方,基于命名的规则,就把这样的程序称为“壳”了。什么是壳?壳的加载过程1.获取壳自己所需要使用的API地址如果用PE编辑工具查看加壳后的文件,会发现未加壳的文件和加壳后的文件的输入表不一样,加壳后的输入表一般所引入的DLL和API函数很少,甚至只有Kernel32.dll以及GetProcAddress这个API函数。壳实际上还需要其他的API函数来完成它的工作,为了隐藏这些API,它一般只在壳的代码中用显式链接方式动态加载这些API函数壳的加载过程2.解密原程序的各个区块(Section)的数据壳出于保护原程序代码和数据的目的,一般都会加密原程序文件的各个区块。在程序执行时外壳将会对这些区块数据解密,以让程序能正常运行。壳一般按区块加密的,那么在解密时也按区块解密,并且把解密的区块数据按照区块的定义放在合适的内存位置。壳的加载过程3.重定位文件执行时将被映像到指定内存地址中,这个初始内存地址成为基地址。对于EXE的程序文件来说,Windows系统会尽量满足,所以加壳软件把源程序文件中用于保存重定位信息的区块干脆也删除了。壳的加载过程4.HOOK-API程序文件中的输入表的作用是让Windows系统在程序运行时提供API的实际地址给程序使用。在程序的第一行代码执行之前,Windows系统就完成了这个工作。壳一般都修改了原程序文件的输入表,然后自己模仿Windows系统的工作来填充输入表中相关的数据。壳的加载过程5.跳转到程序原入口点(OEP)从这个时候起壳就把控制权交还给原程序了,一般的壳在这里会有明显的一个“分界线”。但现在的猛壳己没这界限了,壳里有肉,肉里有壳。常见的加壳工具1.压缩壳(主要目的是减小程序体积)ASPackUPX等等2.加密壳ASProtectXtreme-Protector等等脱壳一般的压缩壳,都有专用的脱壳机,或者用万能脱壳机也可以,如:procdump。而加密壳一般很少有脱壳机,必须手动脱壳手动脱壳----三步1.查找程序的真正入口点(OEP)2.抓取内存映像文件3.输入表重建注:OEP是OriginalEntryPoint缩写查找OEP1.根据跨段指令寻找OEP2.根据堆栈平衡原理找OEP3.根据变异语言特点找OEP4.用内存断点找OEP注:使用OllyIce实现抓取内存映像文件外壳程序解压还原后就会跳到OEP处执行,此时内存映像文件是己解压的程序。这时就可抓取内存映像文件了(该过程称为Dump)。注:使用LordPE实现输入表重建程序总是需要与系统打交道,与系统交道的途径是API,而API的地址已经替换成了壳的HOOK-API的地址,那程序每一次与系统打交道,都会让壳的代码获得一次控制权。重建输入表的关键是获得没加密的IAT,一般的做法是跟踪加壳程序对IAT处理过程,修改相关指令,不让外壳加密IAT。注:使用ImportREC实现谢谢!!!