论坛: 编程破解 标题: [转帖]ESP定律+一锅端――另类ACProtectV1.20壳的简便脱壳+修复方法 复制本贴地址    
作者: yongmin [yongmin]    论坛用户   登录
下载地址:  http://www.ultraprotect.com/acpr_pro.exe
软件大小:  1.6M
软件语言:  英文
应用平台:  Win9x/NT/2000/XP

【软件简介】:ACProtect is an application that allows you to protect Windows executable files against piracy,using public keys encryption algorithms (RSA) to create and verify the registration keys and unlock some RSA key locked code,it has embedded cryptor against dump and unpacker.it also has many anti debug tricks.  And you can use it to  create  evaluation and trial application versions. with specialized API system, mutual communication between loader and application is also can be achieved.

【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!

【调试环境】:WinXP、flyODBG修改版、PEiD、LordPE、ImportREC
   
―――――――――――――――――――――――――――――――――
【脱壳过程】:
             
         
     
ACProtect 现在的最新版本是 V1.20 [2004-02-08] 专业版,升级很快。发觉ACProtect对Delphi的程序支持较好,以后Delphi的软件会有很多用ACProtect加壳的。这次的试炼品是ACProtect自带的ACP_Feedback.exe, Delphi的东东。

     
具体避开反跟踪请参考以前的相关笔记。或者用这个修改版就可以正常调试了。
flyODBG 1.10 汉化修改版 下载页面:(Ollydbg 1.10修正了某些程序无法暂停在入口的问题) http://tongtian.net/pediybbs/viewtopic.php?p=20047

好几天没写东西了,容易的大家都写了,难的又脱不了,够无奈的。滚滚长江东逝水,浪花淘尽多少Cracker?如果还不努力学习,我这菜鸟就更要被淘汰了。

―――――――――――――――――――――――――――――――――
一、ESP定律:快速寻找 伪OEP
   
   
老规矩:用IsDebug 1.4插件去掉Ollydbg的调试器标志。忽略除了“int3异常”之外的所有其他异常选项。

何谓 伪OEP ?这里的伪是假、伪装的意思,因为有Stolen Code作怪,所以从壳中返回程序的地方并不是真正的OEP。
何谓 ESP定律?这是胡诌的,也就是说这个词是我信口开河的,各位方家不必较真呀。 :-) 用这个ESP定律能快速找到大部分ACProtect 1.20加壳程序的伪OEP!下个版本作者应该会想办法对付这个方法的,呵呵。ACProtect会越来越强大的!

觉得有不少壳在壳入口和进入OEP时的ESP值是很有规律的。其实 VolX 老兄在很早的时候脱 Videofixer 3.23 英文版时就曾经妙用过;exetool上也有人说过。因为单步或者TC跟踪ACProtect都很浪费时间,所以无聊的时候又看了几遍ACProtect,找到了一个稍微快点的方法。这个方法比我以前的方法要好很多,对于其他的壳或许也有借鉴的价值,权衡几番还是发了出来。在此也希望有些兄弟能够谅解!



CODE:[Copy to clipboard]
0040A000    60                  pushad//进入OD后停在这
0040A001    F9                  stc//ACProtect V1.20以前的版本则利用入口pushad后的ESP值!
0040A002    D3FD                sar ebp,cl
0040A004    0F80 01000000        jo Feedback.0040A00B
0040A00A    FC                  cld
0040A00B    FC                  cld
0040A00C    49                  dec ecx
0040A00D    C1DB FE              rcr ebx,0FE
0040A010    85CF                test edi,ecx
0040A012    72 03                jb short Feedback.0040A017
0040A014    73 01                jnb short Feedback.0040A017
0040A016    7A 81                jpe short Feedback.00409F99//ACProtect V1.20典型入口代码
F9运行,确定弹出的未注册提示。程序会中断在int3异常处。


CODE:[Copy to clipboard]
00418A7A    CC                  int3//ACProtect V1.20 典型异常
00418A7B    90                  nop
00418A7C    64:67:8F06 0000      pop dword ptr fs:[0]
00418A82    83C4 04              add esp,4
00418A85    60                  pushad
00418A86    E8 00000000          call Feedback.00418A8B
00418A8B    5E                  pop esi
00418A8C    83EE 06              sub esi,6
00418A8F    B9 5B000000          mov ecx,5B
00418A94    29CE                sub esi,ecx
00418A96    BA 5A630BF7          mov edx,F70B635A
00418A9B    C1E9 02              shr ecx,2
00418A9E    83E9 02              sub ecx,2
00418AA1    83F9 00              cmp ecx,0
00418AA4    7C 1A                jl short Feedback.00418AC0
00418AA6    8B048E              mov eax,dword ptr ds:[esi+ecx*4]
00418AA9    8B5C8E 04            mov ebx,dword ptr ds:[esi+ecx*4+4]
00418AAD    33C3                xor eax,ebx
00418AAF    C1C8 1B              ror eax,1B
00418AB2    03C2                add eax,edx
00418AB4    81EA 3403B581        sub edx,81B50334
00418ABA    89048E              mov dword ptr ds:[esi+ecx*4],eax
00418ABD    49                  dec ecx
00418ABE    EB E1                jmp short Feedback.00418AA1
00418AC0    61                  popad
00418AC1    61                  popad
00418AC2    C3                  retn//直接在此处下断,Shift+F9断在这。F7走1步



CODE:[Copy to clipboard]
0041BF97    66:C1D9 5E          rcr cx,5E//返回这里。此时 ESP=0012FF84  ★
0041BF9B    66:8BD1              mov dx,cx
0041BF9E    81F7 6B108A77        xor edi,778A106B
0041BFA4    50                  push eax
0041BFA5    E8 01000000          call Feedback.0041BFAB
OK,现在 ESP定律 上场!8)  去转存窗口,Ctrl+G:0012FF84  到达0012FF84内存处


CODE:[Copy to clipboard]
0012FF84  00 00 00 00                                      ....
取消以前的断点。在0012FF84处的4个字节上下 硬件访问->Word 断点  F9运行,断下!
     
注意:对于 ACProtect V1.20[2004-02-08]以前的版本,则有的需要利用在入口处pushad后的ESP值!


CODE:[Copy to clipboard]
00427B4F    8F05 58AC4000        pop dword ptr ds:[40AC58]//中断第1次。可以取消断点了
00427B55    FF35 58AC4000        push dword ptr ds:[40AC58]
00427B5B    8915 40AC4000        mov dword ptr ds:[40AC40],edx
00427B61    FF35 40AC4000        push dword ptr ds:[40AC40]
00427B67    8F05 3CAC4000        pop dword ptr ds:[40AC3C]
00427B6D    8B35 3CAC4000        mov esi,dword ptr ds:[40AC3C]
00427B73    90                  nop
00427B74    90                  nop
00427B75    90                  nop
00427B76    90                  nop
00427B77    60                  pushad
00427B78    E8 5FF6FEFF          call Feedback.004171DC
00427B7D    8B85 6EEC4100        mov eax,dword ptr ss:[ebp+41EC6E]
00427B83    0385 26D04000        add eax,dword ptr ss:[ebp+40D026]
                                  //EAX=00002168 + 00400000=00402168  这就是伪OEP值  :-)
00427B89    8985 6EEC4100        mov dword ptr ss:[ebp+41EC6E],eax
                                  //[ebp+41EC6E]=[00427C6E]    这个就是 飞天一跃 的地方
00427B8F    61                  popad
00427B90    8935 38AC4000        mov dword ptr ds:[40AC38],esi
00427B96    FF35 38AC4000        push dword ptr ds:[40AC38]
00427B9C    8B0424              mov eax,dword ptr ss:[esp]
00427B9F    8F05 34AC4000        pop dword ptr ds:[40AC34]
00427BA5    8F05 54AC4000        pop dword ptr ds:[40AC54]
00427BAB    FF35 54AC4000        push dword ptr ds:[40AC54]
00427BB1    5E                  pop esi
00427BB2    8F05 74AC4000        pop dword ptr ds:[40AC74]
00427BB8    60                  pushad
00427BB9    E8 1EF6FEFF          call Feedback.004171DC
00427BBE    C685 2BEC4100 E8    mov byte ptr ss:[ebp+41EC2B],0E8
00427BC5    61                  popad
00427BC6    8905 30AC4000        mov dword ptr ds:[40AC30],eax
00427BCC    FF35 30AC4000        push dword ptr ds:[40AC30]
00427BD2    68 74AC4000          push Feedback.0040AC74
00427BD7    58                  pop eax
00427BD8    8B10                mov edx,dword ptr ds:[eax]
00427BDA    8F05 2CAC4000        pop dword ptr ds:[40AC2C]
00427BE0    8B05 2CAC4000        mov eax,dword ptr ds:[40AC2C]  ; Feedback.0040211C
                                  //mov eax,0040211C 有点特别,伪OEP处的EAX就是这个值 :-)
00427BE6    90                  nop
00427BE7    90                  nop
00427BE8    90                  nop
00427BE9    90                  nop
00427BEA    90                  nop
00427BEB    90                  nop
00427BEC    90                  nop
00427BED    90                  nop
00427BEE    60                  pushad
00427BEF    E8 E8F5FEFF          call Feedback.004171DC
00427BF4    C785 2CEC4100FF25000 mov dword ptr ss:[ebp+41EC2C],25FF
00427BFE    8D85 6EEC4100        lea eax,dword ptr ss:[ebp+41EC6E]
00427C04    8985 2EEC4100        mov dword ptr ss:[ebp+41EC2E],eax
00427C0A    E8 CDF5FEFF          call Feedback.004171DC
00427C0F    8DBD 8CE94100        lea edi,dword ptr ss:[ebp+41E98C]
00427C15    8D8D 20EC4100        lea ecx,dword ptr ss:[ebp+41EC20]
00427C1B    2BCF                sub ecx,edi
00427C1D    C1E9 02              shr ecx,2
00427C20    E8 55F3FEFF          call Feedback.00416F7A
00427C25    AB                  stos dword ptr es:[edi]//清理刚才的战场
00427C26    E2 F8                loopd short Feedback.00427C20
00427C28    61                  popad//F4到这里跳出LOOP
00427C29    EB 01                jmp short Feedback.00427C2C



CODE:[Copy to clipboard]00427C2C    FF25 6E7C4200        jmp dword ptr ds:[427C6E] ;00402168//GO!飞向光明之巅!:-)



CODE:[Copy to clipboard]00402168    E8 43FCFFFF          call Feedback.00401DB0//伪OEP  在这儿用LordPE后完全DUMP进程
0040216D    68 D0214000          push Feedback.004021D0; ASCII "ACProtect Feedback From"
00402172    6A 00                push 0
00402174    6A 00                push 0
00402176    E8 F9FCFFFF          call Feedback.00401E74
注意:在00402168伪OEP处记下寄存器和堆栈情况! ★
   
   
―――――――――――――――――――――――――――――――――
二、修复输入表


CODE:[Copy to clipboard]既然ImportREC能够很好的对付ACProtect,我就偷懒了。 重新运行Feedback.exe,运行ImportREC,选择这个进程。把OEP改为00002168,点IT AutoSearch,点“Get Import”,用“追踪层次3”全部修复无效函数。FixDump!
―――――――――――――――――――――――――――――――――
三、仿真 Stolen Code,一锅端 的方法修复变形代码
   
   
想从 ACProtect 1.2 中找到未被“改造”的Stolen Code有点麻烦,索性就根据伪OEP处的寄存器、堆栈情况以及上面的代码来手动仿真吧。谁有更好的方法请多指教。
   
   
在00402168伪OEP处Ollydbg中看到寄存器和堆栈的情况是:


CODE:[Copy to clipboard]EAX=0040211C  //这就是在00427BE0处看到的值
EBX=7FFDF000
EBP=0012FFC0
ESP=0012FFAC

0012FFAC    7FFDF000
0012FFB0    00000000
0012FFB4    00000024
0012FFB8    7FFDF000
0012FFBC    7FFDF000
0012FFC0    0012FFF0
0012FFC4    77E5EB69  返回到 kernel32.77E5EB69
――――――――――――――――――――――――
简单看了几种其他的 Delphi 6.0-7.0 程序的OEP处代码:


CODE:[Copy to clipboard]   
push ebp
mov  ebp,esp
add  esp,-XX
mov  eax,00XXXXXX



CODE:[Copy to clipboard]
push ebp
mov  ebp,esp
add  esp,-XX
xor  eax,eax
mov  dword ptr ss:[ebp-10],eax
mov  eax,00XXXXXX
――――――――――――――――――――――――
   
当然,上面修复输入表后的程序还是无法运行的,Stolen Code和变形代码还没有修复。ACProtect 1.2 的变形程度更严重了。这部分让人头疼,现在学习了 heXer 和 jingulong 两位脱神的一锅端方法居然奇兵突出轻松解决!感谢二位老师的教诲!当然,任何方法都不是万能的,灵活运用才是关键!用这个方法可以搞定一些 ACProtect 1.2 加壳的程序,还有某些程序是不行的,生搬硬套是不可取的。

用Ollydbg载入dumped_.exe,开始偶们的 一锅端 修复!Ctrl+G:0040A000  这是原先ACProtect加壳的入口。

猜、猜、猜…… 呵呵,结合寄存器、堆栈和壳中代码情况,仿真Stolen Code如下:


CODE:[Copy to clipboard]0040A000    55                  push ebp
0040A001    8BEC                mov ebp,esp
0040A003    83C4 F0              add esp,-10
0040A006    53                  push ebx
0040A007    B8 1C214000          mov eax,dumped_.0040211C
0040A00C    E9 5781FFFF          jmp dumped_.00402168//跳向伪OEP
把这些修改代码 复制入可执行文件,另存为 修正-dumped_.exe。用LordPE修改其入口点=0000A000
因为利用了原perplex区段,所以不可以删除这个区段;可以用File Scanner简单优化一下。
   
运行一下,如何?OK了!  8)
BTW:某些程序经过以上处理后会存在无法跨系统平台运行的问题。

地主 发表时间: 06-11-03 10:33

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号