【脱壳作者】 windycandy
【作者邮箱】 nickson@163.com
【使用工具】 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,修复后的程序正常运行!!!
附件包含(这里传不上,去DFCG找):本文、crackme及unpacked
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!