13.5.2 Dump映像文件
出处:电子工业出版社
13.5.2 Dump映像文件
停在OEP后,运行LordPE,在进程窗口中选择loaddll.exe进程,在下方窗口中的EdrLib.dll模块上单击右键,执行“dump full”菜单命令,将文件抓取并保存到文件里,如图13.45所示。
(点击查看大图)图13.45 抓取DLL内存映像
1.重定位后抓取映像
对于DLL文件来说,Windows系统没有办法保证每一次运行时提供相同的基地址。如果DLL基址所在内存空间被占用或该区域不够大,系统会寻找另一个地址空间的区域来映射DLL,此时外壳将对DLL执行某些重定位操作。从图13.43得知,此时DLL被映射到内存的地址是E20000h,与EdrLib.dll默认的基址400000h不同,被重定位项所指向的地方是已经重定位了的代码数据。
如果没有被重定位,一条访问内存的语句应是这样的:
00401253 833D 68AD4000 00 cmp dword ptr [40AD68], 0重定位后,直接访问内存的地址被修正了,语句变成如下:
00E21253 833D 68ADE200 00 cmp dword ptr [E2AD68], 0
为了保证重定位后脱壳后的程序能正常运行,必须修正基址为当前环境的值,本例就是E20000h(见图13.46)。如果被重定位的基址小于默认基址,不可用此法。
2.重定位前抓取映像
上一节修改脱壳文件的基址虽也能解决问题,但问题解决得不是很完美,如果脱壳文件的代码和加壳前一样就完美了。为了得到与加壳前一样的文件,可以在DLL载入时跟进外壳,找到重定位的代码,跳过它,让DLL不被重定位。
(点击查看大图)图13.46 修正ImageBase
003E01F6 mov esi, dword ptr [ebp+299] ;取原重定位表的RVA
003E01FC or esi, esi
003E01FE je short 003E0233 ;判断需不需要重定位
003E0200 add esi, dword ptr [ebp+351]
003E0206 mov edi, dword ptr [ebp+351]
在3E01FEh这句强行跳转,不让外壳对代码进行重定位,来到OEP后,就可直接抓取内存映像了。本例中,由于此时代码段数据已完全恢复,也可以在此处直接抓取内存映像。
本例外壳代码较短,单步跟踪能很快找到重定位处理代码,如果外壳比较复杂,就得花点技巧找到重定位处理代码。首先得选取一个重定位的数据,直接对内存地址操作的指令肯定需要重定位。来到OEP后,分析一下相关代码,选取一句会被重定位的语句。例如:
00E21253 833D 68ADE200 00 cmp dword ptr [E2AD68], 0
E21255h这个地址处的数据E2AD68h是被重定位了的。因此,重新加载EdrLib.dll,等代码段解压完毕,在数据窗口对E21253h设内存写断点,即可中断在重定位表处理的代码上。
还可用下两次内存访问断点来寻找重定位处理代码。本实例会依次对.text、rdata、.data、.rsrc区块进行解压处理,所以,可以先在.rdata等区块下内存访问断点,中断后,此时代码段已解压,接着再对代码段(.text块)下内存访问断点,当外壳对代码点进行重定位操作时,即可中断。