第十八章 加壳和脱壳
加壳可执行文件的俩个主要目的是缩减程序的大小,阻碍对加壳程序的探测和分析。
1.剖析加壳
恶意代码加壳后,分析人员通常只能获得加壳文件,而不能检测原始程序及加壳器。
要脱壳一个可执行文件,我们必须解开加壳所执行的操作,首先,我们需要理解加壳
器的工作原理。
所有加壳器都是将一个可执行文件作为输入,输出一个新的可执行文件。被加壳的可
执行文件经过压缩,加密或者其他转换,目的是使它们难以被识别,难以被逆向工程分析。
多数加壳器用压缩算法压缩原始文件。设计加壳器的目的是让程序难以分析,加壳器通过加
密原始可执行文件并且实施一些反逆向技术实现,如对抗反汇编,反汇编和反虚拟机等等。
要保持原程序功能,加壳程序需要存储程序中的导入函数表信息。这些信息可以用任何格式
存储,它们之间有几个共同的策略,重构程序的导入函数表是以恶具有挑战性且费时的操作,
但这对分析程序功能十分必要。
<1> 脱壳存根。 执行了以下三个步骤:
[1].将原始程序脱壳到内存中
[2].解析原始可执行文件的所有导入函数。
[3].将可执行程序转移到原始的程序入口点(OEP)Original Entry Point
<2> 加载可执行文件 当加载一个标准的可执行文件时,加载器会首先读取硬盘上可执行文件的
PE头部信息,然后根据PE头部信息为可执行文件的各个节分配内存。然后,加载器将这些节复
制到分配的内存空间中。
<3> 解析导入函数表
<4> 尾部跳转 一旦脱壳存根完成脱壳,他就必须转到OEP运行。转到OEP的指令通常被叫做尾部
跳转指令。jump指令是最简单且最流行的转移指令。多数恶意的加壳程序试图使用ret或者call指令
来隐藏这种行为。有时,恶意代码会使用操作系统转移控制的函数来掩盖尾部跳转。
2.识别加壳程序
<1>.加壳程序的标志。
- 导入函数很少,导入函数仅有loadlibrary和getProcAddress。
- 当使用IDA Pro打开程序时,通过分析,只有少量代码被识别。
- 当使用Ollydbg打开程序时,会有程序可能被加壳的警告。
- 程序的节名