今天要脱的是PEncrypt 4.0加的壳,是一个记事本程序,这个记事本程序比较奇怪,令我的修复出现了一点点小的波折。
加壳的记事本程序下载地址: [点击浏览该文件:PEncrypt V4.0.rar]
首先PEID查壳,显示:PEncrypt 4.0 Gamma / 4.0 Phi -> junkcode [Overlay],有附加数据。然后用ollydbg载入,设置“调试选项”,在“异常”中,把所所有的勾都去掉,不要忽略异常。然后按shift+F9忽略异常运行,应该是按3次,这个记事本就运行了。
记事本运行后,重新载入。按shift+F9两次,程序会停在0040CCD2处。
0040CCD0 9D popfd
0040CCD1 90 nop
0040CCD2 4B dec ebx
0040CCD3 6F outs dx, dword ptr es:[edi]
0040CCD4 6368 69 arpl word ptr [eax+69], bp
0040CCD7 8B4424 04 mov eax, dword ptr [esp+4]
0040CCDB 8B00 mov eax, dword ptr [eax]
0040CCDD 3D 04000080 cmp eax, 80000004
查看堆栈:
0012FFBC 0012FFE0 指向下一个 SEH 记录的指针
0012FFC0 0040CCD7 SE处理程序
0012FFC4 7C817077 返回到 kernel32.7C817077
0012FFC8 7C809C98 kernel32.MultiByteToWideChar
可以看到“SE处理程序”的值为“0040CCD7“,那么在反汇编代码窗口中按CTRL+G,输入0040CCD7,来到此行代码并按F2下断点。其实也不用按CTRL+G,这行代码就在下面,直接就看到了。
下完断点后,按shift+F9运行,程序中断,然后取消断点,一直向下单步跟踪。最终来到0040CD2D这行代码,这是一个大跳转,直接跳到OEP。最后单步跟踪一步,就来到OEP了。然后dump脱壳即可。
0040CD23 AB stos dword ptr es:[edi]
0040CD24 ^ E2 FA loopd short 0040CD20
0040CD26 9D popfd
0040CD27 61 popad
0040CD28 BD CC104000 mov ebp, 004010CC
0040CD2D - FFE5 jmp ebp ; PEncrypt.004010CC
0040CD2F 0000 add byte ptr [eax], al
0040CD31 0000 add byte ptr [eax], al
修复的问题。
脱壳后程序不能运行,提示“无法找到组件”的错误,而不能正常运行。
使用ImpRec工具修复后,仍然不能正常运行。比较郁闷,用lordPE重建也不能正常运行。
后来想起来了加壳的程序好像有附加数据,于是用Hex workshop打开文件,通过PEID可知,最后一个区段的偏移是C000,大小为1522,那么附加数据就是从D522开始。可用Hex workshop打开后,文件到D522就结束了,所以根本就没有附加数据,所以这个文件映像大小是有误的。
然后打开脱壳后dump出来的问,最后一个区段的起始位置是D000,大小是C00。而来到D000时,很明显这里不是一个区段的起始位置,如下图所示。所以这个文件的区段位置不对,需要修复。
打开lordPE,刚开始用LordPE修复没有成功,是因为在修复选项中,我只选择了“使PE有效”,现在选中“重新排列文件”,排列方式选“标准”即可。保存选项后,再用LordPE修复,这样修复后的文件就有效了,也能正常运行了。
所以dump脱壳后,根本不需要使用ImpRec来修复IAT,只需要用LordPE重排区段的位置即可。