加壳
加壳的主要目的是压缩大小和阻碍分析。加壳以后的可执行文件会将原来的可执行文件作为数据存储。
通过加密和一些反逆向技术(对抗反汇编?,反调试,反虚拟化等等)来让程序难以分析。
脱壳存根
被加壳程序中的脱壳存根由操作系统加载,然后它负责加载原始程序。
固可执行程序的入口点指向脱壳存根。
对程序进行静态分析需要先脱壳。
将原始程序脱壳到内存中
解析原始可执行文件的所有导入函数
将可执行程序转型到原始的程序入口点处 OEP
解析导入函数表
对于加壳的可执行文件,Windows加载器无法读取其真正的导入函数表。需要脱壳存根负责解析导入函数表。
最常使用方法是仅导入LoadLibrary GerProcessAddress
另一种是保留原始导入函数表
第三种为原始导入表的每一个DLL留一个导入函数。
最后一种 不需要任何导入函数,利用shellcode获得LoadLibrary GerProcessAddress
加壳前的原可执行文件
头部
导入函数表
导出函数表
.text
.data
.rsrc
加壳后的原可执行文件
头部
脱壳存根
加壳的原先代码
加载到内存的程序,入口点在脱壳存根
头部
导出函数表
.text
.data
.rsrc
脱壳存根
导入表重构 现在指向OEP
头部
导出函数表
.text
.data
.rsrc
脱壳存根
导入函数表
但值得注意的是,此时依然包含者脱壳存根。说明脱壳以后的PE文件和原始PE文件不完全一样。