| 
注册时间2005-7-22
阅读权限20
最后登录1970-1-1UID2466 以武会友  
 
 该用户从未签到 | 
 
| 【脱壳作者】 windycandy 
 【使用工具】 PEiD、ODbyDYK v1.10、ImportREC1.6 Final
 
 【脱壳平台】 Win XP
 
 【软件名称】 MC++的crackme
 
 【软件大小】 25.5K
 
 【加壳方式】 tElock 0.99 -> tE!
 
 【脱壳声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
 
 --------------------------------------------------------------------------------
 
 【脱壳内容】
 
 
 [tElock 0.99 -> tE!]
 signature = E9 5E DF FF FF 00 00 00
 ep_only = true
 
 脱壳过程
 
 1.找OEP
 
 OD载入程序,设置除了忽略kernel32异常之外,其他异常全部不忽略
 
 (注:有些程序可以用2次内存断点来快速到达OEP,但是这种方法好象并不通用,
 个人认为用二哥进阶教程脱tElock 0.98 -> tE!方法比较稳当)
 
 入口代码:
 
 0040A09D m>^\E9 5EDFFFFF     jmp mc++.00408000
 0040A0A2     0000            add byte ptr ds:[eax],al
 0040A0A4     0055 E6         add byte ptr ss:[ebp-1A],dl
 0040A0A7     9D              popfd
 0040A0A8     EC              in al,dx
 0040A0A9     E5 A0           in eax,0A0
 0040A0AB     0000            add byte ptr ds:[eax],al
 0040A0AD     0000            add byte ptr ds:[eax],al
 
 shift+f9运行,经过16次左右异常后到最后一次异常处
 
 00409C74     FE03            inc byte ptr ds:[ebx]----------这里
 00409C76   ^ EB E8           jmp short mc++.00409C60
 00409C78     B8 9B14501B     mov eax,1B50149B
 00409C7D     E8 0C000000     call mc++.00409C8E
 00409C82     15 9D15501B     adc eax,1B50159D
 00409C87     E9 09000000     jmp mc++.00409C95
 00409C8C     33C1            xor eax,ecx
 00409C8E     C1E8 C9         shr eax,0C9
 00409C91     C3              retn
 00409C92     48              dec eax
 00409C93     33C1            xor eax,ecx
 00409C95     1BC7            sbb eax,edi
 00409C97     2BD2            sub edx,edx
 00409C99     64:8F02         pop dword ptr fs:[edx]
 
 看堆栈的值:
 
 0012FF78   0012FFE0  指针到下一个 SEH 记录
 0012FF7C   00409C66  SE 句柄-------------------注意这里
 0012FF80   00000000
 0012FF84   00000000
 0012FF88   00006A24
 0012FF8C   0012FFA0
 
 在CPU窗口ctrl+G到:409C66
 
 00409C66     8B6424 08       mov esp,dword ptr ss:[esp+8]-----到这里,F2下断
 00409C6A     EB 0C           jmp short mc++.00409C78
 00409C6C     33DB            xor ebx,ebx
 00409C6E     64:FF33         push dword ptr fs:[ebx]
 
 shift+F9断在409C66处,取消断点
 
 将鼠标向上拖到代码的最顶上处
 
 00408000     000400          add byte ptr ds:[eax+eax],al----------看这行的地址值
 00408003     00DB            add bl,bl
 00408005     CC              int3
 00408006     B3 B7           mov bl,0B7
 00408008     4D              dec ebp
 00408009     5A              pop edx
 0040800A     90              nop
 0040800B     0003            add byte ptr ds:[ebx],al
 0040800D     0000            add byte ptr ds:[eax],al
 
 于是在命令行下:tc eip<408000,中断在OEP处
 
 004013FB   /.  55            push ebp---------------断在这里
 004013FC   |.  8BEC          mov ebp,esp
 004013FE   |.  6A FF         push -1
 00401400   |.  68 B8404000   push mc++.004040B8
 00401405   |.  68 301F4000   push mc++.00401F30                    ;  SE 句柄安装
 0040140A   |.  64:A1 0000000>mov eax,dword ptr fs:[0]
 00401410   |.  50            push eax
 00401411   |.  64:8925 00000>mov dword ptr fs:[0],esp
 00401418   |.  83EC 58       sub esp,58
 0040141B   |.  53            push ebx
 0040141C   |.  56            push esi
 0040141D   |.  57            push edi
 
 2.获得IAT起始地址及修复
 
 用OD插件将其dump出来,不关OD,打开ImportREC,OEP:13FB,自动搜索,得到无效指针(有些程序获得
 到部分有效指针),这时无论是用ImportREC的level 1还是level 2、level 3及tElock插件都无法搜索到
 有效的函数,IAT已经被加密了,注意RAV的值:00004000先记下(IAT起始地址)。下面开始我们的解密
 IAT之旅:
 
 ctrl+f2重新载入加壳程序,OD设置忽略所有异常,再添加以下几个异常C0000005(ACCESS VIOLATION)、
 C000001D(ILLEGALINSTRUCTION)、C000001E(INVALID LOCK SEQUENCE)、C0000096(PRIVILEGED INSTRUCTION)
 
 ctrl+g到:404000(IAT起始地址+基址)
 
 00404000     96              xchg eax,esi-------------到这里
 00404001     DE64F4 07       fisub word ptr ss:[esp+esi*8+7]
 00404005     CB              retf
 00404006     92              xchg eax,edx
 00404007     8910            mov dword ptr ds:[eax],edx
 00404009     36:0962 47      or dword ptr ss:[edx+47],esp
 0040400D     9C              pushfd
 
 在404000下内存写入断点,shift+f9中断
 
 0040914A     AA              stos byte ptr es:[edi]---------断在这里
 0040914B     69D2 A5B0CD4B   imul edx,edx,4BCDB0A5
 00409151     F9              stc
 00409152     72 02           jb short mc++.00409156
 00409154     CD20 D1C269DB   vxdjump DB69C2D1
 0040915A     70 1F           jo short mc++.0040917B
 0040915C     EE              out dx,al
 0040915D     6A 03           push 3
 0040915F     DA49 0F         fimul dword ptr ds:[ecx+F]
 00409162     8F              ???                                   ; 未知命令
 00409163     5B              pop ebx
 00409164     FFFF            ???                                   ; 未知命令
 
 再ctl+s找
 
 pushad
 sub eax, eax
 inc eax
 cmp dword ptr ds:[edi], 0
 lea edi,dword ptr ds:[edi+4]
 
 找到这里
 
 004097E8     48              dec eax
 004097E9     75 36           jnz short mc++.00409821
 004097EB     60              pushad-------------------------这里
 004097EC     2BC0            sub eax,eax
 004097EE     40              inc eax
 004097EF     833F 00         cmp dword ptr ds:[edi],0
 004097F2     8D7F 04         lea edi,dword ptr ds:[edi+4]
 004097F5   ^ 75 F7           jnz short mc++.004097EE
 004097F7     48              dec eax
 004097F8     74 1F           je short mc++.00409819
 004097FA     8BD8            mov ebx,eax
 
 
 向上找到如下代码处
 
 004096EF     C3              retn
 004096F0     8985 4B374000   mov dword ptr ss:[ebp+40374B],eax
 004096F6     8D85 942E4000   lea eax,dword ptr ss:[ebp+402E94]
 004096FC     60              pushad
 004096FD     33C9            xor ecx,ecx
 004096FF     2AF6            sub dh,dh
 00409701     8A13            mov dl,byte ptr ds:[ebx]
 00409703     F6C2 40         test dl,40
 00409706     74 03           je short mc++.0040970B
 00409708     80E2 5F         and dl,5F
 0040970B     0AD2            or dl,dl
 0040970D     74 1E           je short mc++.0040972D-----★magic jump/修改为:jmp 0040972D
 0040970F     43              inc ebx
 00409710     FEC6            inc dh
 00409712     41              inc ecx
 00409713     3A5408 FF       cmp dl,byte ptr ds:[eax+ecx-1]
 00409717   ^ 74 E8           je short mc++.00409701
 00409719     3A5408 08       cmp dl,byte ptr ds:[eax+ecx+8]
 0040971D   ^ 74 E2           je short mc++.00409701
 0040971F     3A5408 12       cmp dl,byte ptr ds:[eax+ecx+12]
 00409723   ^ 74 DC           je short mc++.00409701
 00409725     3A5408 1D       cmp dl,byte ptr ds:[eax+ecx+1D]
 00409729   ^ 74 D6           je short mc++.00409701
 0040972B   ^ EB D0           jmp short mc++.004096FD
 0040972D     0AF6            or dh,dh
 0040972F     895424 1C       mov dword ptr ss:[esp+1C],edx
 00409733     61              popad
 
 将magic jump修改后,alt+m在code段下内存访问断点
 
 
 00400000    00001000 (4096.)   00400000          PE header   Imag  01001002   R   RWE
 
 00401000    00003000 (12288.)  00400000   text   code        Imag 01001002    R   RWE----下内存访问断点
 
 
 shift+f9到OEP,到这里所有的IAT已经解密完毕,可以进行修复了。不关OD,打开ImportREC,OEP:13FB,自动搜索,
 现在看看找到了什么?得到所有的指针都含情脉脉,对你暗送秋天里的菠菜啊(赵本山经典语),所有效指针全部
 有效,修复抓取文件,OK,修复后的程序正常运行!!!
 
 附件包含:本文、crackme及unpacked
 
 --------------------------------------------------------------------------------
 【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
 
 [ 本帖最后由 windycandy 于 2006-3-19 01:35 编辑 ]
 | 
 
x本帖子中包含更多资源您需要 登录 才可以下载或查看,没有账号?加入我们 
  |