14.2 开发环境的伪造

14.1 节介绍了PEiD分析开发环境(编译器版本)的相关流程,本节将结合14.1节知识,将Microsoft Visual Studio 2005所编写的“Hello World!”程序伪造成VC++6.0所编写的,给程序套上一个面具,以“蒙蔽”PEiD。

那么,如何将用Microsoft Visual Studio 2005编写的程序伪装成VC++6.0所编写的程序呢?找到PEiD检查PE文件的相关流程即可。根据14.1节的分析,PEiD的检查流程如下:

1)检查oep是否合法。

2)提取oep地址处相关的机器码,用于特征码的比较。

3)检查“.rdata”节是否存在。

4)检查oep是否处于“.text”节中。

在这几个步骤中,最重要的一个步骤是特征码比较,因此作伪装时需要伪造机器码。那么PEiD检查VC++6.0的机器码的相关特征都有哪些呢?通过14.1节的分析可得到如下答案:

oep+0x0 对应机器码 0x55

oep+0x 1 对应机器码 0x8B

oep+0x 2 对应机器码 0xEC

oep+0x 3 对应机器码 0x6A

oep+0x 4 对应机器码 0xFF

oep+0x 5 对应机器码 0x68

oep+0x A 对应机器码 0x68

oep+0x F 对应机器码 0x64

oep+0x 10 对应机器码 0xA1

oep+0x 11 对应机器码 0x00

oep+0x16 对应机器码 0x64

oep+0x18 对应机器码 0x00

oep+0x1D 对应机器码 0x83

oep+0x1E 对应机器码 0xEC

有了这些机器码以及对应oep的位置,就可以开始伪造机器码的第一步了。先使用OllyDBG打开要伪造的目标程序,如图14-9所示。

图 14-9 伪造程序oep

打开后,代码停留在地址0x004012C2处,这个地址是目标程序的oep。由于PEiD需要对oep处的机器码进行检查,因此首要任务是将这些参与检查的机器码进行伪造。直接修改oep处的代码是不可行的,因为这样会破坏原有程序中的机器码,极有可能影响程序的运行。因此,需要在程序中找到一段空白处,并将对比机器码填写进去。不能随意使用这个空白处,必须要在“.text”节指定的范围内使用,否则,即便通过了机器码与特征码的检查,也无法通过后期VC++6.0的判定过程。经过分析后,在伪造程序中找到了符合要求的空白代码处,将已知的对比机器码填写到此段空白处,如图14-10所示。

在图14-10中,此段代码中不仅伪造了VC++6.0的oep特征,还在oep检查结束后对环境进行了还原,在仿造oep的最后执行了“CALL 0x004012C2”,将程序重新调整回真正的oep处,使其可以正常运行。

以上只是将机器码指令写入伪造程序的内存中,并没有写到文件中,如何使用OllyDBG将修改过的分析文件重新写入文件中呢?在数据窗口中,单击鼠标右键,弹出选择菜单,如图14-11所示。

在弹出的右键选择菜单中选择“复制到可执行文件”选项,这时OllyDBG弹出了文件操作窗口;在此窗口中再次右击,选择保存文件选项;在弹出的文件保存窗口中填写保存后的新名称,这样就完成了oep的仿造。

执行完以上操作后,伪造VC++6.0的编译信息的最重要步骤就完成了。这时还需要检查在伪造程序中是否存在“.rdata”节,如果不存在,还需添加“.rdata”节。我们伪造的示例程序是由Microsoft Visual Studio 2005所编写的,“.rdata”节已经存在,不需要手工添加。

前期工作都已经做好了,接下来需要重新调整oep的地址到0x00401810处,此地址根据图14-10得到。使用WinHex打开伪造程序,如图14-12所示。

图 14-10 伪造oep入口

图 14-11 右键选择菜单

图 14-12 oep所在文件地址

根据图14-12,当前oep指向的地址为0x000012C2,所在文件的偏移地址为0x00000110。将原oep的地址(0x000012C2)修改为我们伪造的新oep地址(0x00001810),这个地址值是RVA值。

这时伪造工作已经完成,程序经过“包装”后戴上了崭新的面具。PEiD的各项检查均已实现,oep已经被仿造、处于“.text”节中,只待PEiD的检查。使用PEiD加载伪造程序,结果如图14-13所示。

图 14-13 PEiD加载伪造后的Microsoft Visual Studio 2005程序

在图14-13中,又见到了熟悉的字符串信息“Microsoft Visual C++6.0”,这表示我们已经伪造成功。这时的入口地址已经变成了我们所修改的0x00001810。

其他开发环境的伪造方法与此大同小异,都需要掌握PEiD的分析流程,以及相关特征码的比较,然后仿造出PEiD所要检查的相关特征信息。