【破解作者】 clide2000[DFCG][OCN]
【作者邮箱】 54arma@sina.com
【使用工具】 OD;LoadPe;ImportREC
【破解平台】 Win9x/NT/2000/XP
【软件名称】 unpackme
【下载地址】 见附件,里面是unpackme与我脱好的dump文件
附件:unpackme29.rar
【软件简介】 一个PEX 0.99 -> bart/CrackPl加壳的记事本,在练习时发现他加密码了几个函数,用ImportREC无法直接修复,故把此笔记与大家
分享,高手莫笑.^_^
【软件大小】 37K
【加壳方式】 PEX 0.99 -> bart/CrackPl
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
【破解内容】
首先,OD加载,并忽略所有异常,启动IsDebugPresent
0040C000 > /E9 F5000000 jmp unpackme.0040C0FA
0040C005 |0D 0AC4C4C4 or eax, C4C4C40A
0040C00A |C4C4 les eax, esp ; Illegal use of register
0040C00C |C4C4 les eax, esp ; Illegal use of register
0040C00E |C4C4 les eax, esp ; Illegal use of register
0040C010 |C4C4 les eax, esp ; Illegal use of register
0040C012 |C4C4 les eax, esp ; Illegal use of register
0040C014 |C4C4 les eax, esp ; Illegal use of register
一避过IAT的加密
在命令行下 bp VirtualAlloc,F9运行,中断于此,然后F8单步执行
77E5AC72 > 55 push ebp
77E5AC73 8BEC mov ebp, esp
77E5AC75 FF75 14 push dword ptr ss:[ebp+14]
77E5AC78 FF75 10 push dword ptr ss:[ebp+10]
77E5AC7B FF75 0C push dword ptr ss:[ebp+C]
77E5AC7E FF75 08 push dword ptr ss:[ebp+8]
77E5AC81 6A FF push -1
77E5AC83 E8 9CFFFFFF call kernel32.VirtualAllocEx
77E5AC88 5D pop ebp
77E5AC89 C2 1000 retn 10 ;当F8到这里时,注意EAX的值,里面放的是申请成功的内存地址
在我的机子上当时是这样的
EAX 003A0000 ;注意,就是这里,记住这个值,一会要用的.即3a0000
ECX 77E5AC6F kernel32.77E5AC6F
EDX 7FFE0304
EBX 0000B473
ESP 0012FF80
EBP 00009E34
ESI 00000000
EDI 00000000
下面,先下bc VirtualAlloc,清除之前的断点,然后下he 3A0000,即在申请成功的内存首地址处下硬件执行断点,F9运行
中断于:
003A0000 95 xchg eax, ebp
003A0001 E8 01000000 call 003A0007
003A0006 C7 ??? ; Unknown command
003A0007 5D pop ebp
003A0008 81ED D0254000 sub ebp, 4025D0
003A000E 8D95 212A4000 lea edx, dword ptr ss:[ebp+402A21]
003A0014 6A 07 push 7
003A0016 59 pop ecx
003A0017 8B1A mov ebx, dword ptr ds:[edx]
003A0019 03DD add ebx, ebp
003A001B 0103 add dword ptr ds:[ebx], eax
003A001D 83C2 04 add edx, 4
003A0020 ^ E2 F5 loopd short 003A0017
003A0022 81C6 73040000 add esi, 473
现在,先清楚上面下的硬件断点,然后下bp GetProcAddress,F9运行,会中断在
77E5B332 > 55 push ebp
77E5B333 8BEC mov ebp, esp
77E5B335 51 push ecx
77E5B336 51 push ecx
77E5B337 53 push ebx
77E5B338 57 push edi
77E5B339 8B7D 0C mov edi, dword ptr ss:[ebp+C]
77E5B33C BB FFFF0000 mov ebx, 0FFFF
77E5B341 3BFB cmp edi, ebx
77E5B343 ^ 0F86 894BFFFF jbe kernel32.77E4FED2
77E5B349 57 push edi
好了,77E5B332 > 55 push ebp
77E5B333 8BEC mov ebp, esp
77E5B335 51 push ecx
77E5B336 51 push ecx
77E5B337 53 push ebx
77E5B338 57 push edi
77E5B339 8B7D 0C mov edi, dword ptr ss:[ebp+C]
77E5B33C BB FFFF0000 mov ebx, 0FFFF
77E5B341 3BFB cmp edi, ebx
77E5B343 ^ 0F86 894BFFFF jbe kernel32.77E4FED2
77E5B349 57 push edi
好了,77E5B332 > 55 push ebp
77E5B333 8BEC mov ebp, esp
77E5B335 51 push ecx
77E5B336 51 push ecx
77E5B337 53 push ebx
77E5B338 57 push edi
77E5B339 8B7D 0C mov edi, dword ptr ss:[ebp+C]
77E5B33C BB FFFF0000 mov ebx, 0FFFF
77E5B341 3BFB cmp edi, ebx
77E5B343 ^ 0F86 894BFFFF jbe kernel32.77E4FED2
77E5B349 57 push edi
好了,77E5B332 > 55 push ebp
77E5B333 8BEC mov ebp, esp
77E5B335 51 push ecx
77E5B336 51 push ecx
77E5B337 53 push ebx
77E5B338 57 push edi
77E5B339 8B7D 0C mov edi, dword ptr ss:[ebp+C]
77E5B33C BB FFFF0000 mov ebx, 0FFFF
77E5B341 3BFB cmp edi, ebx
77E5B343 ^ 0F86 894BFFFF jbe kernel32.77E4FED2
77E5B349 57 push edi
好了bc GetProcAddress,取消上面的断点,接着就Alt+M,在3A0000段上下内存访问断点,F9运行
这次会中断在
003A00F2 85C0 test eax, eax ; SHELL32.#584
003A00F4 0F84 C5020000 je 003A03BF
003A00FA E8 01000000 call 003A0100
003A00FF 6959 DF BD6C2940 imul ebx, dword ptr ds:[ecx-21], 40296CBD
003A0106 00DF add bh, bl
003A0108 AD lods dword ptr ds:[esi]
003A0109 6C ins byte ptr es:[edi], dx ; I/O command
003A010A 2940 00 sub dword ptr ds:[eax], eax
003A010D EB 03 jmp short 003A0112
003A010F C7848B E88B0200 0>mov dword ptr ds:[ebx+ecx*4+28BE8], C703EB00
好了说了半天,终于要找到了
Ctrl+s,搜索以下这段代码.(和fly等大侠们学的,没事就爱用搜的^_^)
add esp, 4
mov ebx, 40C385
lea ecx, dword ptr ss:[ebp+4025CB]
add ebx, dword ptr ds:[ecx]
cmp dword ptr ds:[ecx], 9B4
jnb 003A02FF
哈哈,一下就找到这里了
003A0221 83C4 04 add esp, 4
003A0224 BB 85C34000 mov ebx, 40C385
003A0229 8D8D CB254000 lea ecx, dword ptr ss:[ebp+4025CB]
003A022F 0319 add ebx, dword ptr ds:[ecx]
003A0231 8139 B4090000 cmp dword ptr ds:[ecx], 9B4
003A0237 0F83 C2000000 jnb 003A02FF ;Magic Jump,把这改成jmp,就可以跳过对IAT的加密了
003A023D 53 push ebx
003A023E E8 01000000 call 003A0244
修改好以后,先取消之前的内存访问断点,最后Alt+M,在401000段上下内存访问断点,F9运行
一下子就到了OEP了
004010CC 55 db 55 ; CHAR 'U'
004010CD 8B db 8B
004010CE EC db EC
004010CF 83 db 83
004010D0 EC db EC
004010D1 44 db 44 ; CHAR 'D'
004010D2 56 db 56 ; CHAR 'V'
004010D3 FF db FF
004010D4 15 db 15
004010D5 E0 db E0
004010D6 63 db 63 ; CHAR 'c'
004010D7 40 db 40 ; CHAR '@'
看起很乱吗,那是因为还没有分析呀,Ctrl+A,这之后再看看,是不是很熟悉了.
004010CC /. 55 push ebp
004010CD |. 8BEC mov ebp, esp
004010CF |. 83EC 44 sub esp, 44
004010D2 |. 56 push esi
004010D3 |. FF15 E0634000 call dword ptr ds:[4063E0] ; unpackme.0040C5C0
004010D9 |. 8BF0 mov esi, eax
004010DB |. 8A00 mov al, byte ptr ds:[eax]
004010DD |. 3C 22 cmp al, 22
二dump和修复
现在就可以用LoadPe去dump文件,用ImportREC修复了
用ImportREC抓取IAT时,oep填10cc(地球人都知道了,呵呵),点搜点,最后cut掉无用了垃圾内容,修复即可.
--------------------------------------------------------------------------------
【破解总结】
写的很乱,谢谢你看完这篇文章。没啥说的了,只是觉得如果能很好的运用VirtrualAlloc、GetProcAddress等API,就可以使脱壳变得轻松些。]
在此对csjwaman,jwh51,fly等经常帮助、指点我的兄弟表示感谢。
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!