lovelili008 发表于 2010-8-14 13:17

Pespin 1.32全保护手工分析之三Code Redirection

【详细过程】
    嘿嘿,我又来了。按照惯例在分析前先要闲话几句,直接进入主题太没意思了。 当然我不会太过于罗嗦的。
    上篇文章用了很长的篇幅才将API Redirection 的过程以及修复方法分析完成。其实原本我也不想长篇大论的
可是要将API Redirection 原理讲透,不把每个细节都考虑到的话,会让人看的不明不白还不如不分析了。所以嘛
分析分析着就出来那么长的篇幅了,对不住看的人了,说实话写这分析文章真的很累,不光我看懂还要让看的人懂。
嘿嘿,API Redirection 的过程分析还是小菜呢,如果最后Nanomite的过程,以及修复比这还要复杂,分7种方式
来替换原始程序的代码。每种方式的代码也是很长的一段,所以大家要做有耐心,玩破解学脱壳,耐心是非常重要的
好了,闲话就话到这了。我们进入主题吧!
    大家有没有疑问,我为什么要把Code Redirection的分析放到了Antidump/Remove OEP 前面来讲了呢。嗯 ,是的
因为按壳的流程就是这样子走的,既然都说是F7+F8+F9 走下来的,那么就得按照此壳的流程一步一步的来了.如果明白
了,那么我们继续今天的旅程吧!接着上回后面来讲吧
      0041AAB9   /EB 07         jmp   short 0041AAC2          ;上回patch完代码后在这下硬断,F9(有写好的脚本跑到这吧)
       0041AAC2^\EB F8         jmp   short 0041AABC          ;F7一直走
       0041ABB5    B8 12E5ED24   mov   eax, 24EDE512         ;F7一直走到这,继续F7 eax=0x24EDE512
       0041ABBA    E8 03000000   call    0041ABC2                ;F7

       0041ABCB    BB 8F319700   mov   ebx, 97318F             ;ebx=0x97318F   
       0041ABD0    2BC3            sub   eax, ebx                ;eax=0x24EDE512-0x97318F=0x2456B383
       0041ABD2    3D A1168525   cmp   eax, 258516A1         ;比较,如果相等表示没有代码搬到PE头(即Code Redirection)
       0041ABD7    EB 04         jmp   short 0041ABDD
       0041ABDD^\EB FB         jmp   short 0041ABDA
       0041ABDA   /EB 04         jmp   short 0041ABE0
       0041ABE0   /74 79         je      short 0041AC5B          ;上面如果相等这里就跳去0041AC5B 最终会到达伪OEP
       0041ABE2    BE 62DF4100   mov   esi, 0041DF62         ;
       0041ABE7    B9 3F020000   mov   ecx, 23F                ;下面开始解密41DF62--41DF62+23F-1=41E1A0之间的数据
       0041ABEC    51            push    ecx                     ;解密后的数据就是即将要搬到PE头的代码(即原始程序被Code Redirection的代码)
       0041ABED    B0 9E         mov   al, 9E                  ;第一步解密key
       0041ABEF    304431 FF       xor   byte ptr , al;开始第一步解密
       0041ABF3    EB 07         jmp   short 0041ABFC

       0041ABFF    004C31 FF       add   byte ptr , cl;开始第二步解密(cl是第二步解密key)
       0041AC03    49            dec   ecx                     ;ecx-1
       0041AC04    9C            pushfd                        ;这里是根据经过上个指令后ecx是否为0来计算出41AC31处指令跳转的地址
       0041AC05    C12C24 06       shr   dword ptr , 6
       0041AC09    F71424          not   dword ptr
       0041AC0C    832424 01       and   dword ptr , 1
       0041AC10    50            push    eax
       0041AC11    52            push    edx
       0041AC12    B8 72B2DC12   mov   eax, 12DCB272
       0041AC17    05 444D23ED   add   eax, ED234D44
       0041AC1C    F76424 08       mul   dword ptr
       0041AC20    8D8428 8B4F4000 lea   eax, dword ptr
       0041AC27    894424 08       mov   dword ptr , eax
       0041AC2B    5A            pop   edx
       0041AC2C    58            pop   eax
       0041AC2D    8D6424 04       lea   esp, dword ptr
       0041AC31    FF6424 FC       jmp   dword ptr       ;0x41ABEF(ecx>0) 0x41AC39(ecx=0) 这个设条件断点 ecx==0 F9
       0041AC39    59            pop   ecx                  ;F7走
       0041AC3A    E8 03000000   call    0041AC42
       0041AC42^\EB FB         jmp   short 0041AC3F
       0041AC3F   /EB 04         jmp   short 0041AC45
       0041AC45    830424 0C       add   dword ptr , 0C
       0041AC49    C3            retn                           ;返回0x41AC4B
       0041AC4B    BF E0014000   mov   edi, 004001E0          ;edi=0x4001E0 一会搬代码到PE头开始的地址(记下这值,写脚本修复有用)
       0041AC50    EB 04         jmp   short 0041AC56
       0041AC56^\EB FB         jmp   short 0041AC53
       0041AC53   /EB 04         jmp   short 0041AC59
       0041AC59    F3:A4         rep   movs byte ptr es:, byte ptr ;开始从41DF62(size=23F)搬数据到4001E0(size=23F)

       0041AC5B    2BC9            sub   ecx, ecx                        ;F7走

       0041ACB4    61            popad                                 ;F7一路跑到,这就是伪OEP
       0041ACB5    F7D2            not   edx
       0041ACB7    39C2            cmp   edx, eax
       0041ACB9    F7C0 74E7F921   test    eax, 21F9E774
   
复制代码通过上面的分析,可以知道的是壳将原始程序的某些代码搬到了PE头中4001E0的位置,大小为0x23F字节
   那下面让我们去看一下原始程序代码中是哪些地方的代码给搬走了?壳是如何找到搬动的代码?
   跑到伪OEP后,我们ctrl+G 输入4018F7 (这个地址是我先前搜索好的,大家要搜的话可以CTRL+B输入 E8??????FF 即可)
   搜到的指令如下:
   
   
      //大家看到CALL后的地址没,对了。这就是上面分析将代码搬到PE头中4001E0的位置。我们在指令上回车看看。
      004018F7    E8 E4E8FFFF   call    004001E0   ;在这,回车
      004001E0- E9 2D220000   jmp   00402412   ;进入这里,看这条指令后面的地址,指向原始代码所在的内存段,再回车看看
      00402412    33C0            xor   eax, eax   ;没发现异常
      00402414    6A 00         push    0
   
   
   看到这里,大家是不是已经明白了?咦!不明白是吗?暴汗,其实就是0x4018F7 处原始的代码就是call 00402412 ,只不过壳将这条
   指令搬到PE头去了,并变形成jmp 00402412然后在0x4018F7 处的代码替换成了call    004001E0指令。这只是第一种形式(call)
   还有第二种形(jmp)
   继续ctrl+G 输入 401993 (当然可以CTRL+B输入 E9??????FF 来搜索)
   搜到的指令如下:
   
   //看到没有,jmp后面的地址也是在4001E0-40041F(401E0+0x23F)之间的
   00401993- E9 90E8FFFF   jmp   00400228               ;也是这回车跳进去看看
   00400228    833D 74854000 0>cmp   dword ptr , 1;看到这条指令,这种形式是将原始代码处的指令全部照搬到PE头中
   
   
   分析到这里,Code Redirection的过程就分析完毕吧。想必原理也明白了,这是不是比起前面加密的过程是不是简单多了。
   嘿嘿。 本篇分析文章就此收工~~~~~~~~

lovelili008 发表于 2010-8-14 13:17

sf自己做了。。。。。。不要抢哦

hejining 发表于 2010-8-14 13:27

好东西 看看哈

小糊涂虫 发表于 2010-8-14 13:34

Pespin
ximo不是有做视频教程嘛。。。

xie83544109 发表于 2010-8-14 13:41


这壳难度很大,目前还没搞定
页: [1]
查看完整版本: Pespin 1.32全保护手工分析之三Code Redirection