前两天kiss突然要我帮他爆个文件,文件是“PGP自解压压缩文档”!他说他把密码给忘记了。
传过来后首先当然是请出
peid查壳咯,发现是
UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo [Overlay]的壳!一看是UPX的壳,想应该容易搞定,立刻用OD载入
根据经验
ctrl+F 再输入popad回车再运行到所选,F8单步两下就到OEP了!!!再dump出来!搞定。。
还以为这么轻松,马上运行脱壳出来的文件,居然有自效应
---------------------------
解密错误
---------------------------
检测到文件更改,可能受到病毒感染!
---------------------------
确定
---------------------------
闷了。。。后来想到之前看过的一篇文章过自效应的,于是马上又继续用OD载入!首先载入未脱壳的文件,到达OEP后不脱出来,直接下断点,执行命令BP CreateFileA回车,然后F9运行!被断下来后按下alt+F9回到程序领空!接着放下这边,再开一个OD载入脱壳后的文件,直接下BP CreateFileA断点,再F9运行,然后一样alt+F9返回程序领空!
这个时候是停在了
0040EB5F 8BF0 mov esi, eax ;停在这里的
0040EB61 3BF7 cmp esi, edi
0040EB63 75 14 jnz short 0040EB79
0040EB65 FF15 64114100 call dword ptr [411164] ; ntdll.RtlGetLastWin32Error |
到了这里后就要开始比较了,一个一个的单步!我搞的时候是首先用脱壳后的文件单步,到了跳转或者返回的地方就停下来,再用未脱壳的单步到同样的地方,再比较!
在比较过程中发现了两处不同的地方!第一处是:
未脱壳文件 |
0040120E /75 3D jnz short 0040124D ;这里跳转已经实现
00401210 |6A 06 push 6
00401212 |8D45 D0 lea eax, dword ptr [ebp-30]
00401215 |68 B8604100 push 004160B8 ; ASCII "PGPSDA"
0040121A |50 push eax
0040121B |E8 20850000 call 00409740
00401220 |83C4 0C add esp, 0C
00401223 |85C0 test eax, eax
00401225 |75 26 jnz short 0040124D
00401227 |8D85 00FEFFFF lea eax, dword ptr [ebp-200]
0040122D |68 A4604100 push 004160A4 ; ASCII ".decoder.sda.exe"
00401232 |50 push eax
00401233 |33DB xor ebx, ebx
00401235 |E8 CCFEFFFF call 00401106
0040123A |59 pop ecx
0040123B |85C0 test eax, eax
0040123D |59 pop ecx
0040123E |74 39 je short 00401279
00401240 |68 98604100 push 00416098 ; ASCII ".sda.exe"
00401245 |50 push eax
00401246 |E8 05840000 call 00409650
0040124B |59 pop ecx
0040124C |59 pop ecx
0040124D \85DB test ebx, ebx ;跳转到这里 |
脱壳后的文件 |
0040120E /75 3D jnz short 0040124D ;这里跳转未实现00401210 |6A 06 push 6
00401212 |8D45 D0 lea eax, dword ptr [ebp-30]
00401215 |68 B8604100 push 004160B8 ; pgpsda
0040121A |50 push eax
0040121B |E8 20850000 call 00409740
00401220 |83C4 0C add esp, 0C
00401223 |85C0 test eax, eax
00401225 |75 26 jnz short 0040124D
00401227 |8D85 00FEFFFF lea eax, dword ptr [ebp-200]
0040122D |68 A4604100 push 004160A4 ; .decoder.sda.exe
00401232 |50 push eax
00401233 |33DB xor ebx, ebx
00401235 |E8 CCFEFFFF call 00401106
0040123A |59 pop ecx
0040123B |85C0 test eax, eax
0040123D |59 pop ecx
0040123E |74 39 je short 00401279
00401240 |68 98604100 push 00416098 ; .sda.exe
00401245 |50 push eax
00401246 |E8 05840000 call 00409650
0040124B |59 pop ecx
0040124C |59 pop ecx
0040124D \85DB test ebx, ebx |
既然未脱壳的跳转了,那么看来也需要让未脱壳的跳转也实现,马上把
0040120E /75 3D jnz short 0040124D 这一句改成强制跳转0040120E /EB 3D jmp short 0040124D
接着继续跟踪比较,在下面这个地方又发现了不同:
未脱壳文件 |
0040129E /74 39 je short 004012D9 ;跳转已经实现
004012A0 |8D85 6CFFFFFF lea eax, dword ptr [ebp-94]
004012A6 |6A 64 push 64
004012A8 |50 push eax
004012A9 |68 DB130000 push 13DB
004012AE |FF35 A4864100 push dword ptr [4186A4] ; mp3.00400000
004012B4 |FFD6 call esi
004012B6 |68 10000100 push 10010 ; UNICODE "PROFILE=C:\Documents and Settings\All Users"
004012BB |8D85 08FFFFFF lea eax, dword ptr [ebp-F8]
004012C1 |50 push eax
004012C2 |8D85 6CFFFFFF lea eax, dword ptr [ebp-94]
004012C8 |50 push eax
004012C9 |FF75 08 push dword ptr [ebp+8]
004012CC |FF15 68124100 call dword ptr [411268] ; USER32.MessageBoxA
004012D2 |B8 2DD1FFFF mov eax, -2ED3
004012D7 |EB 7F jmp short 00401358
004012D9 \8D85 F8FCFFFF lea eax, dword ptr [ebp-308] ;跳转到这里 |
脱壳后的文件 |
0040129E /74 39 je short 004012D9 ;跳转未实现
004012A0 |8D85 6CFFFFFF lea eax, dword ptr [ebp-94]
004012A6 |6A 64 push 64
004012A8 |50 push eax
004012A9 |68 DB130000 push 13DB
004012AE |FF35 A4864100 push dword ptr [4186A4] ; unpacked.00400000
004012B4 |FFD6 call esi
004012B6 |68 10000100 push 10010 ; UNICODE "PROFILE=C:\Documents and Settings\All Users"
004012BB |8D85 08FFFFFF lea eax, dword ptr [ebp-F8]
004012C1 |50 push eax
004012C2 |8D85 6CFFFFFF lea eax, dword ptr [ebp-94]
004012C8 |50 push eax
004012C9 |FF75 08 push dword ptr [ebp+8]
004012CC |FF15 68124100 call dword ptr [<&USER32.MessageBoxA>>; USER32.MessageBoxA
004012D2 |B8 2DD1FFFF mov eax, -2ED3
004012D7 |EB 7F jmp short 00401358
004012D9 \8D85 F8FCFFFF lea eax, dword ptr [ebp-308] |
继续把脱壳后文件的0040129E /74 39 je short 004012D9 这一句改成0040129E /EB 39 jmp short 004012D9让他实现跳转,改完后继续跟踪,看还有没不同!
我跟踪后发现没不同的地方了,看来就这两个地方!接着在脱壳后的文件那右击→COPY→select all 再 右击→copy to executable→selection 接着 右击→save file保存文件!!
本来以为到这里就可以了,结果发现文件不能运行了。。。
---------------------------
unpacked_mp.exe - 应用程序错误
---------------------------
应用程序正常初始化(0xc0000005)失败。请单击“确定”,终止应用程序。
---------------------------
确定
--------------------------- 郁闷了N久。。。一直以为上面搞错了。。。过了N久突然想到脱壳的时候经常要修复文件,想到后马上打开importREC1.6载入加密文件的进程,接着在OPE处输入加密文件的oep A95E,再自动搜索IAT,接着获取输入表,发现全部都有效,马上点击修复抓取文件,选择破除自效应了的文件,提示保存成功,接着打开修复后的文件。哈哈成功运行,查壳是Microsoft Visual C++ 6.0呵呵,成功干掉了!
哈哈 ,快断电了,准备睡觉咯!
没有评论:
发表评论