页面

2011年5月29日星期日

干掉PGP自解压压缩文档自效应

前两天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呵呵,成功干掉了!
  哈哈 ,快断电了,准备睡觉咯!

没有评论:

发表评论