• 标 题:模拟跟踪+修复方法之ACProtect脱壳——完美卸载XP V9.12
  • 作 者:fly
  • 时 间:2003年12月16日 12:04
  • 链 接:http://bbs.pediy.com

模拟跟踪+修复方法之ACProtect脱壳——完美卸载XP V9.12
 
 
 
下载页面:  http://www.skycn.com/soft/6169.html
软件大小:  4316 KB
软件语言:  简体中文
软件类别:  国产软件 / 共享版 / 卸载清除
应用平台:  Win9x/NT/2000/XP
加入时间:  2003-11-06
下载次数:  332693
推荐等级:  **** 

【软件简介】:软件共有3个小程序,分别是:磁盘垃圾清理软件、软件安装监视器、软件卸载工具,是一套功能比较强大的安装/卸载/清理工具,新版更加全面的系统监视,让软件安装的一举一动历历在目,二次清理技术,软件卸载后将不留任何垃圾,磁盘垃圾清理的数量更多,软件运行更加稳定。

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

【调试环境】:WinXP、flyODBG、PEiD、LordPE、ImportREC 1.4.2+、WinHex

————————————————————————————————— 
【脱壳过程】:
          
         

先说几句多余的话:请正确认识加密与解密(仅指技术研究)的关系——矛与盾——解密的发展无疑是促进了加密的进步!就偶个人以及偶所知道的朋友来说,学习CRACK只是个人兴趣,不为稻梁谋!否则也不会写破解笔记。

崇尚自由、共享!  :-)


1、偶使用的调试器:Ollydbg Anti ACProtect For XP 修改版 —— flyODBG 
         下载页面:http://tongtian.net/pediybbs/viewtopic.php?t=1532 

2、反跟踪可以参考:梦幻Ollydbg —— 浅谈 ACProtect V1.09 Pro 的反跟踪And脱壳
         相关页面:http://tongtian.net/pediybbs/viewtopic.php?t=1525


用  Run Trace 方法来脱壳,可以让偶们节省一些脱壳中F7单步走的时间,难点是在何处使用模拟跟踪以及如何设置较佳的跟踪条件;这些只有根据具体的情况具体分析了。

ACProtect运用了变形技术,使得许多代码在脱壳后丢失。为了找到修复方法,偶曾经对 jingulong 兄说过偶准备3天3夜来分析,后来偶用了1天的时间终于成功。

这次的试炼品是:完美卸载XP V9.12的NetClean.exe  昨天升级为 V9.13 了,偶写这篇V9.12脱壳笔记,作者不会太在意吧?笔记所写只是偶的一点ACProtect脱壳思路,ACProtect是一款优秀的壳,以后碰到的几率不会少的。

—————————————————————————————————
一、模拟跟踪   寻找OEP


用IsDebug 1.4插件去掉flyODBG的调试器标志。设置 忽略 除了“内存访问异常”之外的所有其他异常选项。


004AE000     60                   pushad//进入OD后断在这!
004AE001     79 05                jns short NetClean.004AE008

F9运行,程序中断在异常处,这个int 1异常算是ACProtect的典型异常啦 :-D

004B3E96     CD 01                int 1//ACProtect的典型异常
004B3E98     40                   inc eax//此处下断,SHIFT+F9断在这!CTRL+F9执行到返回!
004B3E99     40                   inc eax
004B3E9A     0BC0                 or eax,eax
004B3E9C     0F85 B6000000        jnz NetClean.004B3F58
    …… ……省 略…… ……
004B3F99     61                   popad
004B3F9A     61                   popad
004B3F9B     C3                   retn//返回到 004B7CC2

————————————————————————

004B7CC2     F9                   stc
004B7CC3     E9 04000000          jmp NetClean.004B7CCC

004B7CCC     83ED 01              sub ebp,1
004B7CCF     0F85 41FFFFFF        jnz NetClean.004B7C16//F4下去
004B7CD5     EB 01                jmp short NetClean.004B7CD8

004B7CD8     E8 BDB3FFFF          call NetClean.004B309A//F8带过
004B7CDD     E9 0B000000          jmp NetClean.004B7CED


OK,偶现在开始使用模拟跟踪!下命令:TC EIP<004B0000    当然,可以一步步F7走,也有更简便的方法,偶这里只是学习一下Run Trace方法。如果你有大把的时间,等数小时后程序会自动暂停在OEP处的。要想快点则需要手动干预一下!有2点需要注意:

1、jnz等的向上循环手动F4下去跳出循环
2、CALL的地址比程序当前地址低的可以F8带过,不需要TC进入

当TC时间稍长时,可以查看 运行跟踪   找出上面所说的情况,手动干预一下,使模拟跟踪加快速度!


004B88FA     E8 43D6FFFF          call NetClean.004B5F42//CALL入低地址段
004B88FF     E9 03000000          jmp NetClean.004B8907//F2下断,暂停运行跟踪,F9断在这

继续 TC EIP<004B0000  如果嫌记录太长,可以 清除记录 后再TC

004B9D46     E8 F7C1FFFF          call NetClean.004B5F42
004B9D4B     D3C8                 ror eax,cl//F2下断,暂停运行跟踪,F9断在这

继续 TC EIP<004B0000  

查看 运行跟踪   发现程序在 004B9DA5 处循环太多,偶们手动来协助它吧

004B9DA5     0F85 1CFFFFFF        jnz NetClean.004B9CC7//F2下断,断下后取消断点,F4下去
004B9DAB     7E 03                jle short NetClean.004B9DB0


以下处理方法相同:

004BBEEC     E8 51A0FFFF          call NetClean.004B5F42
004BBEF1     75 01                jnz short NetClean.004BBEF4//F2下断,暂停运行跟踪,F9断在这

004BBF3B     0F85 55FFFFFF        jnz NetClean.004BBE96//F4下去
004BBF41     E8 01000000          call NetClean.004BBF47

004BDAAC     E8 9184FFFF          call NetClean.004B5F42
004BDAB1     75 02                jnz short NetClean.004BDAB5//F2下断,暂停运行跟踪,F9断在这

004BDB08     0F85 2AFFFFFF        jnz NetClean.004BDA38//F2下断,断下后取消断点,F4下去
004BDB0E     E8 01000000          call NetClean.004BDB14

004BE0DA     E8 C25EFFFF          call NetClean.004B3FA1
004BE0DF     77 01                ja short NetClean.004BE0E2//F2下断,暂停运行跟踪,F9断在这

004BE136     0F85 5AFFFFFF        jnz NetClean.004BE096//F2下断,断下后取消断点,F4下去
004BE13C     E8 01000000          call NetClean.004BE142

004BE51D     0F85 29FFFFFF        jnz NetClean.004BE44C//F2下断,断下后取消断点,F4下去
004BE523     74 03                je short NetClean.004BE528

004BE528     E8 BD5CFFFF          call NetClean.004B41EA
004BE52D     87F2                 xchg edx,esi//F2下断,暂停运行跟踪,F9断在这

004BE578     E8 245AFFFF          call NetClean.004B3FA1
004BE57D     71 01                jno short NetClean.004BE580//F2下断,暂停运行跟踪,F9断在这

004BE605     E8 904AFFFF          call NetClean.004B309A
004BE60A     0F82 03000000        jb NetClean.004BE613//F2下断,暂停运行跟踪,F9断在这

004BE632     E8 985EFFFF          call NetClean.004B44CF
004BE637     C1DA 12              rcr edx,12//F2下断,暂停运行跟踪,F9断在这

004BE63D     0F85 71FFFFFF        jnz NetClean.004BE5B4//F2下断,断下后取消断点,F4下去
004BE643     EB 01                jmp short NetClean.004BE646

    …… ……省 略…… ……

004BEA52     0F85 3BFFFFFF        jnz NetClean.004BE993//F2下断,断下后取消断点,F4下去
004BEA58     50                   push eax

004BEE16     0F85 36FFFFFF        jnz NetClean.004BED52//F2下断,断下后取消断点,F4下去
004BEE1C     E8 01000000          call NetClean.004BEE22

004BEF72     0F85 4AFFFFFF        jnz NetClean.004BEEC2//F2下断,断下后取消断点,F4下去
004BEF78     E8 01000000          call NetClean.004BEF7E

004C07B7     0F85 4CFFFFFF        jnz NetClean.004C0709//F2下断,断下后取消断点,F4下去
004C07BD     EB 01                jmp short NetClean.004C07C0

004C1B9F     0F85 34FFFFFF        jnz NetClean.004C1AD9//F2下断,断下后取消断点,F4下去
004C1BA5     50                   push eax

004C693E     0F85 55FFFFFF        jnz NetClean.004C6899//F2下断,断下后取消断点,F4下去
004C6944     50                   push eax

004C7006     0F85 3DFFFFFF        jnz NetClean.004C6F49//F2下断,断下后取消断点,F4下去
004C700C     EB 01                jmp short NetClean.004C700F

004C7C88     0F85 52FFFFFF        jnz NetClean.004C7BE0//F2下断,断下后取消断点,F4下去
004C7C8E     E8 01000000          call NetClean.004C7C94


再次 TC EIP<004B0000  数分钟后程序自动停在00445E14处!查看运行跟踪就知道程序是从何处返回的。


004C8612     8B85 71B64100        mov eax,dword ptr ss:[ebp+41B671]  ; NetClean.00445E14
004C8618     0385 383F4000        add eax,dword ptr ss:[ebp+403F38]
                                  //EAX=00045E14 + 00400000=00445E14   这就是OEP值  :-)
004C861E     8985 71B64100        mov dword ptr ss:[ebp+41B671],eax  ; NetClean.00445E14
004C8624     61                   popad
004C8625     8BC5                 mov eax,ebp
004C8627     E8 9493FEFF          call NetClean.004B19C0
004C862C     FFB5 71B64100        push dword ptr ss:[ebp+41B671]     ; NetClean.00445E14
004C8632     8BE8                 mov ebp,eax
004C8634     C3                   retn  //返回 00445E14               飞向光明之巅!:-D


————————————————————————
看来这个东东没有被ACProtect壳 Stolen Code 呀  :-)


00445E14     55                   push ebp//在这儿用LordPE完全DUMP这个进程
00445E15     8BEC                 mov ebp,esp
00445E17     6A FF                push -1
00445E19     68 C0E24400          push NetClean.0044E2C0
00445E1E     68 D65F4400          push NetClean.00445FD6 
00445E23     64:A1 00000000       mov eax,dword ptr fs:[0]
00445E29     50                   push eax
00445E2A     64:8925 00000000     mov dword ptr fs:[0],esp
00445E31     83EC 68              sub esp,68
00445E34     53                   push ebx
00445E35     56                   push esi
00445E36     57                   push edi
00445E37     8965 E8              mov dword ptr ss:[ebp-18],esp
00445E3A     33DB                 xor ebx,ebx
00445E3C     895D FC              mov dword ptr ss:[ebp-4],ebx
00445E3F     6A 02                push 2
00445E41     FF15 60B74400        call dword ptr ds:[44B760]

————————————————————————

重新运行,运行ImportREC,选择这个进程。把OEP改为00045E14,点IT AutoSearch,把大小改为:A6C 点“Get Import”,只有一个函数无效,用“追踪层次3”修复之,FixDump。


—————————————————————————————————
二、修复 丢失代码


运行脱壳后的dumped_.exe当然出错啦,找到出错的地方:

004AF00B     FF25 6C5C1400        jmp dword ptr ds:[145C6C]
    …… ……省 略…… ……
004B076F     FF25 046C1400        jmp dword ptr ds:[146C04]

这一大段代码全部丢失了,现在要做的就是让程序在运行时把这段代码解压在程序内!这样脱壳后就不会丢失了。其实偶以前的笔记已经给出了解决方法,只要你细心跟踪了就能发现的。


复制NetClean.exe以防不测。用LordPE给其加个新的区段:大小00020000 ,然后用WinHex在程序末尾0007D118处粘贴00020000长度的00字节。可以在0007D118处写入某些字符以便查找,如:fly[FCG]

设置LordPE的“重建”选项,只保留“验证PE”一个选项,最后用LordPE重建“增肥”后的 NetClean.exe。

————————————————————————
用flyODBG载入“增肥”后NetClean.exe,忽略所有异常选项,取消以前的所有断点。偶们开始还原丢失代码!


004AE000     60                   pushad//进入OD后断在这!
004AE001     79 05                jns short NetClean.004AE008

★★下命令:BP GlobalAlloc+2   ★★

77E536A3     6A 1C                push 1C
77E536A5     68 D018E677          push kernel32.77E618D0//断在这!中断5次后取消断点 返回程序
77E536AA     E8 323E0000          call kernel32.77E574E1
    …… ……省 略…… ……
77E5379E     C2 0800              retn 8//返回到 004B1BAD

F9运行,在77E536A5处中断5次,返回程序。当然,对于其它用ACProtect加壳的程序,可以返回程序看是哪里对丢失代码动手脚,以确定具体的位置!

返回程序后偶们要知道刚才添加字节的具体位置:Alt+M查看内存,在整个区段搜索:fly[FCG]

004E1118  66 6C 79 5B 46 43 47 5D 00 00 00 00 00 00 00 00  fly[FCG]........

确定添加字节开始在004E1118处! :-)


004B1B9B     B9 70170000          mov ecx,1770
004B1BA0     68 10270000          push 2710
004B1BA5     6A 40                push 40
004B1BA7     FF95 F1434000        call dword ptr ss:[ebp+4043F1]//CALL GlobalAlloc
004B1BAD     8BF8                 mov edi,eax//EAX=00145C68  把返回值改为:004E1118  狸猫换太子:-) 
004B1BAF     81C7 A00F0000        add edi,0FA0
004B1BB5     50                   push eax
004B1BB6     B9 70170000          mov ecx,1770
004B1BBB     8DB5 05204000        lea esi,dword ptr ss:[ebp+402005]
004B1BC1     F3:A4                rep movs byte ptr es:[edi],byte ptr ds:[esi]
004B1BC3     5A                   pop edx
004B1BC4     8BF2                 mov esi,edx
004B1BC6     81C6 A00F0000        add esi,0FA0
004B1BCC     8BFE                 mov edi,esi
004B1BCE     B9 70170000          mov ecx,1770
004B1BD3     AC                   lods byte ptr ds:[esi]
004B1BD4     32C3                 xor al,bl
004B1BD6     AA                   stos byte ptr es:[edi]
004B1BD7     E2 FA                loopd short NetClean.004B1BD3
004B1BD9     8BFA                 mov edi,edx
004B1BDB     B9 E8030000          mov ecx,3E8
004B1BE0     8BC2                 mov eax,edx
004B1BE2     05 A00F0000          add eax,0FA0
004B1BE7     AB                   stos dword ptr es:[edi]
004B1BE8     83C0 06              add eax,6
004B1BEB     E2 FA                loopd short NetClean.004B1BE7
004B1BED     B9 E8030000          mov ecx,3E8
004B1BF2     8DBD 05204000        lea edi,dword ptr ss:[ebp+402005]
004B1BF8     8BC2                 mov eax,edx
004B1BFA     66:C707 FF25         mov word ptr ds:[edi],25FF
004B1BFF     8947 02              mov dword ptr ds:[edi+2],eax
004B1C02     83C7 06              add edi,6
004B1C05     83C0 04              add eax,4
004B1C08     E2 F0                loopd short NetClean.004B1BFA
004B1C0A     60                   pushad
004B1C0B     E8 00000000          call NetClean.004B1C10
004B1C10     5E                   pop esi
004B1C11     83EE 06              sub esi,6
004B1C14     B9 92000000          mov ecx,92
004B1C19     29CE                 sub esi,ecx
004B1C1B     BA 5FBEACA3          mov edx,A3ACBE5F
004B1C20     C1E9 02              shr ecx,2
004B1C23     83E9 02              sub ecx,2
004B1C26     83F9 00              cmp ecx,0
004B1C29     7C 1A                jl short NetClean.004B1C45
004B1C2B     8B048E               mov eax,dword ptr ds:[esi+ecx*4]
004B1C2E     8B5C8E 04            mov ebx,dword ptr ds:[esi+ecx*4+4]
004B1C32     33C3                 xor eax,ebx
004B1C34     C1C0 11              rol eax,11
004B1C37     03C2                 add eax,edx
004B1C39     81F2 47137A8D        xor edx,8D7A1347
004B1C3F     89048E               mov dword ptr ds:[esi+ecx*4],eax
004B1C42     49                   dec ecx
004B1C43     EB E1                jmp short NetClean.004B1C26
004B1C45     61                   popad
004B1C46     61                   popad
004B1C47     C3                   retn

现在丢失代码已经全部还原在偶新增的区段内了,跑不了了  :-)

在OEP值00445E14处下内存访问断点,F9运行程序,直达入口!DUMP出程序!重新修复输入表,正常运行!


☆☆☆☆☆  三千丈红尘   苍茫人世   吾将何处翱翔  ☆☆☆☆☆


—————————————————————————————————
    
                                
         ,     _/ 
        /| _.-~/            _     ,        青春都一饷
       ( /~   /              ~-._ |
       `\  _/                   ~ )          忍把浮名 
   _-~~~-.)  )__/;;,.          _  //'
  /'_,   --~    ~~~-  ,;;___(  (.-~~~-.        换了破解轻狂
 `~ _( ,_..-- (     ,;'' /    ~--   /._` 
  /~~//'   /' `~         ) /--.._, )_  `~
  "  `~"  "      `"      /~'`    `\~~   
                         "     "   "~'  ""

    

     Cracked By 巢水工作坊——fly [OCN][FCG][NUKE]

               2003-12-15 23:00