且行且远
分类: 逆向手札 由 ssfighter 于 2007年2月24日 发表

今天在PYG上面看到有人问大嘴日语7.0这个软件怎么脱壳,下载下来试着脱了一下。但这个软件在我自己电脑上运行一直就不是很正常,总是弹出提示说参数不正确,我也不知道怎么回事,而这个脱壳后的程序基本运行正常,至于具体有没有问题就不得而知了,hoho:)

首先,PEiD查壳,结果是EXEStealth 2.75a -> WebtoolMaster。用OD载入,设置忽略除“内存访问异常”所有异常。F9运行之后,再按四次Shift+F9后停在这儿(至于为什么要按四次Shift+F9就不说了):
007B8016 8908 mov dword ptr [eax], ecx

观察堆栈:
0012FFBC FFFFFFFF SEH 链尾部
0012FFC0 00E27458 SE处理程序

在E27458处下断点,Shift+F9运行,断下后取消断点,运行至retn。再回到7B8016处,此时这里代码如下:
007B8016 - E9 60F46600 jmp 00E2747B

观察状态寄存器,如果此时TF寄存器的值是1的话就把它置为0,再F8,来到这里:
00E2747B B8 DD61E2F0 mov eax, F0E261DD
00E27480 64:8F05 00000000 pop dword ptr fs:[0]
00E27487 83C4 04 add esp, 4
00E2748A 55 push ebp

Ctrl+F搜索jmp eax命令,F4到这里:
00BC0001 60 pushad
00BC0002 E8 03000000 call 00BC000A
00BC0007 - E9 EB045D45 jmp 461904F7

好像是AsPack的壳,用ESP定律:
00BC03BA 68 10D19500 push 0095D110
00BC03BF C3 retn

再F8,又跳到一层壳:
0095D110 60 pushad
0095D111 BE 00807B00 mov esi, 007B8000
0095D116 8DBE 0090C4FF lea edi, dword ptr [esi+FFC49000]
0095D11C 57 push edi
0095D11D 83CD FF or ebp, FFFFFFFF
0095D120 EB 10 jmp short 0095D132

好像是UPX的壳,仍然用ESP定律搞定之,最后来到OEP:
006AD3B0 55 push ebp
006AD3B1 8BEC mov ebp, esp
006AD3B3 83C4 F0 add esp, -10

这时可以用LordPE来Dump这个程序了,注意Dump之前要先修正一下镜像大小。但此时直接修复IAT不能运行,少一个Data.dat文件,在OD中按Alt+M观察内存,这个Data.dat竟然是一个DLL文件,这个文件在data目录下面,我们知道Windows检查导入的DLL文件是检查两个目录,一个是文件所在目录,另一个是%system32%目录,所以只要把data目录下面的data.dat文件拷贝到和文件一个目录就可以用这个DLL库了,不需要再自己写代码来调用LoadLibraryA进行定位。
此时用ImportRec来修复IAT的话会发现两个无效指针,但我没有仔细看,不知道这两个指针(实际上指向同一个地址)是干什么用的,所以直接用补区段的方法搞定之。在原来的程序中,按Alt+M进入内存窗口,对BmJapanese到data.dat之间的几个没有名的区段全按F2设置访问断点(不是所有的区段都能下),运行程序,发现1B50000、1B70000、1C10000三个区段被断下,用LordPE的区域转存功能Dump这几个区段,然后加到dumped.exe后面,注意要修正区段的相对地址,然后重建PE,再用ImportRec修正IAT即可,注意这时就不要剪切无效指针了。



发表评论

昵称:  (必须)
邮件:  (必须)
网址: 
评论: