首页
社区
课程
招聘
[旧帖] [原创]PeSpinv0.3脱壳 0.00雪花
发表于: 2008-1-17 17:39 2376

[旧帖] [原创]PeSpinv0.3脱壳 0.00雪花

2008-1-17 17:39
2376
【文章标题】: PeSpinv0.3脱壳
【文章作者】: 我不是高手
【作者邮箱】: --
【作者主页】: --
【作者QQ号】: --
【软件名称】: 用PeSpinv0.3主程序给PeSpinv0.3主程序加壳后的文件
【使用工具】: OllyDbg
【操作平台】: XP+SP2
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  目标程序是我用用PeSpinv0.3主程序给PeSpinv0.3主程序加壳后的文件,加壳方式是默认的!
  
  0040D087 > /EB 01           jmp     short 0040D08A                     //OD载入后停在这里
  0040D089   |68 60E80000     push    0E860
  0040D08E    0000            add     byte ptr [eax], al
  0040D090    8B1C24          mov     ebx, dword ptr [esp]
  
  注意:
  请设置一下OD,选项--调试选项,除了"忽略在KERNEL32中的内存访问异常"这个打勾外,其他的都不要打!
  然后按F9!
  第一次异常:
  
  0040D273    F3:AE           repe    scas byte ptr es:[edi]
  SHIFT+F9,第2次异常
  0040D3DD    F6F3            div     bl
  SHIFT+F9,第3次异常
  0040E944    FB              sti
  SHIFT+F9,第2次异常
  0040E944    4B              sti
  SHIFT+F9,第5次异常
  0040E908    D7              xlat    byte ptr [ebx+al]
  SHIFT+F9,第6次异常
  0040D5AA    8918            mov     dword ptr [eax], ebx
  SHIFT+F9,第7次异常
  004001C1    FFFF            ???                                      ; 未知命令
  
  再shift+f9的话程序就运行了,所以我们在第7次的时候查看堆栈。
  SE句柄=0040E553                                                      //到这个地址下断,SHIFR+F9
  
  0040E553    2BDB            sub     ebx, ebx                         //停在这里
  0040E555    8B6424 08       mov     esp, dword ptr [esp+8]
  0040E559    64:8F03         pop     dword ptr fs:[ebx]
  
  CTRL+B,查找"81 7E 10 ?? ?? ?? ?? 0F 84"
  0040DA17    817E 10 00D00000     cmp     dword ptr [esi+10], 0D000   //找到这里,在这里下断,SHIFT+F9   
  0040DA1E    0F84 82010000        je      0040DBA6                    //输入表处理完毕就跳
=======================================================================================
跟踪程序发现如下代码:
0040D87B    57              push    edi                                 
0040D87C    51              push    ecx                                                  
0040D87D    BF 565E4000     mov     edi, 00405E56                     //edi=00405e56                                 
0040D882    B9 50010000     mov     ecx, 150
0040D887    3917            cmp     dword ptr [edi], edx             //和Firstthunk比较  
0040D889    74 03           je      short 0040D88E
0040D88B    47              inc     edi
0040D88C  ^ E2 F9           loopd   short 0040D887                   //循环
0040D88E    807F FF E9      cmp     byte ptr [edi-1], 0E9            //比较是不是E9
0040D892    75 0A           jnz     short 0040D89E     
0040D894    83C7 04         add     edi, 4
0040D897    2BC7            sub     eax, edi                         //函数地址减edi
0040D899    8947 FC         mov     dword ptr [edi-4], eax           //这样就出错拉~!
0040D89C    EB 02           jmp     short 0040D8A0
0040D89E    8902            mov     dword ptr [edx], eax             //把正确的函数地址写到Firstthunk
0040D8A0    59              pop     ecx
0040D8A1    5F              pop     edi
0040D8A2    C3              retn
edi是程序的IAT表,这段数据是有规律的:
E9-FIRSTTHUNK-FF                                                   
FF25-FIRSTTHUNK                                                     //这种形式我们将得到正确的一张跳转表
=======================================================================================  
  现在我们找一段空白的代码处,我找到如下的地方:
  0040EC71    0000                 add     byte ptr [eax], al
  0040EC73    0000                 add     byte ptr [eax], al
  0040EC75    0000                 add     byte ptr [eax], al
  0040EC77    0000                 add     byte ptr [eax], al           //原来的
  0040EC79    0000                 add     byte ptr [eax], al
  0040EC7B    0000                 add     byte ptr [eax], al
  0040EC7D    0000                 add     byte ptr [eax], al
  0040EC7F    0000                 add     byte ptr [eax], al
  0040EC81    0000                 add     byte ptr [eax], al
  0040EC83    0000                 add     byte ptr [eax], al
  
  写如我自己的代码:
  0040EC71    50              push    eax                                   //这里右键--此处为新的EIP
  0040EC72    BF 565E4000     mov     edi, 00405E56
  0040EC77    B9 50010000     mov     ecx, 150
  0040EC7C    803F E9         cmp     byte ptr [edi], 0E9
  0040EC7F    75 0D           jnz     short 0040EC8E
  0040EC81    8B47 01         mov     eax, dword ptr [edi+1]
  0040EC84    C607 FF         mov     byte ptr [edi], 0FF                   //修改后的
  0040EC87    C647 01 25      mov     byte ptr [edi+1], 25
  0040EC8B    8947 02         mov     dword ptr [edi+2], eax
  0040EC8E    47              inc     edi
  0040EC8F  ^ E2 EB           loopd   short 0040EC7C
  0040EC91    58              pop     eax                                  //这里F4完成循环
  0040EC92    90              nop
  0040EC93    90              nop
  
  CTRL+G到0040DA1E,右键--此处为新的EIP,下断,F9直到跳转成功!
  0040DBA6    F9                   stc
  0040DBA7    72 05                jb      short 0040DBAE
  0040DBA9    E8 D00A0000          call    0040E67E
  0040DBAE    EB 01                jmp     short 0040DBB1
  0040DBB0    FF8D BD372740        dec     dword ptr [ebp+402737BD]
  0040DBB6    00EB                 add     bl, ch
  0040DBB8    0168 F3              add     dword ptr [eax-D], ebp
  0040DBBB    0F31                 rdtsc                                    //注意这个
  0040DBBD    50                   push    eax
  0040DBBE    F3:                  prefix rep:
  0040DBBF    0F31                 rdtsc                                    //rdtsc检验
  。。。。。。。。。。。。。。省略N句代码。。。。。。。。。。。。。。。
  0040DBD7    3D FF0F0000          cmp     eax, 0FFF
  0040DBDC    76 1A                jbe     short 0040DBF8                   //到这里修改zf=1,另跳转实现
  。。。。。。。。。。。。。。省略N句代码。。。。。。。。。。。。。。。
  0040DC0C    61                   popad
  0040DC0D  - E9 E47EFFFF          jmp     00405AF6                         //跳到OEP
  
  
  
  00405AF6    2BC0                 sub     eax, eax                            //OEP,在这里dump程序
  00405AF8    68 255B4000          push    00405B25                            ; ASCII "PE_SPIN_v03"
  00405AFD    50                   push    eax
  00405AFE    50                   push    eax
  00405AFF    E8 6A030000          call    00405E6E                            ; jmp 到 kernel32.CreateMutexA
  00405B04    E8 8F030000          call    00405E98                            ; jmp 到 ntdll.RtlGetLastWin32Error
  00405B09    3D B7000000          cmp     eax, 0B7
  00405B0E    75 21                jnz     short 00405B31
  
  
  dump后的程序可以正常运行,脱壳成功!
  
  
  
  
  
--------------------------------------------------------------------------------
【经验总结】
  这个壳的难点应该是避开IAT加密吧~!由于是默认的加壳方式,所以没有stolen code。
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于xxxxxx论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2008年01月17日 16:59:28

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//