吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4818|回复: 4
收起左侧

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

[复制链接]
lovelili008 发表于 2010-8-14 13:17
【详细过程】
    嘿嘿,我又来了。按照惯例在分析前先要闲话几句,直接进入主题太没意思了。 当然我不会太过于罗嗦的。
    上篇文章用了很长的篇幅才将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 [ecx+esi-1], al;开始第一步解密
       0041ABF3    EB 07           jmp     short 0041ABFC

       0041ABFF    004C31 FF       add     byte ptr [ecx+esi-1], cl;开始第二步解密(cl是第二步解密key)
       0041AC03    49              dec     ecx                     ;ecx-1
       0041AC04    9C              pushfd                          ;这里是根据经过上个指令后ecx是否为0来计算出41AC31处指令跳转的地址
       0041AC05    C12C24 06       shr     dword ptr [esp], 6
       0041AC09    F71424          not     dword ptr [esp]
       0041AC0C    832424 01       and     dword ptr [esp], 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 [esp+8]
       0041AC20    8D8428 8B4F4000 lea     eax, dword ptr [eax+ebp+404F8B]
       0041AC27    894424 08       mov     dword ptr [esp+8], eax
       0041AC2B    5A              pop     edx
       0041AC2C    58              pop     eax
       0041AC2D    8D6424 04       lea     esp, dword ptr [esp+4]
       0041AC31    FF6424 FC       jmp     dword ptr [esp-4]      ;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 [esp], 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:[edi], byte ptr [esi]  ;开始从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 [408574], 1  ;看到这条指令,这种形式是将原始代码处的指令全部照搬到PE头中
   
   
   分析到这里,Code Redirection的过程就分析完毕吧。想必原理也明白了,这是不是比起前面加密的过程是不是简单多了。
   嘿嘿。 本篇分析文章就此收工~~~~~~~~

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| lovelili008 发表于 2010-8-14 13:17
sf自己做了。。。。。。不要抢哦
hejining 发表于 2010-8-14 13:27
小糊涂虫 发表于 2010-8-14 13:34
xie83544109 发表于 2010-8-14 13:41
[s:187]
这壳难度很大,目前还没搞定
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 07:03

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表