【破解作者】 落魄浪子
【作者邮箱】 zxy223_szb@21cn.net
【使用工具】 FlyOD1.1
【破解平台】 Win9x/NT/2000/XP
【软件名称】 五笔快打4.0正式版
【加壳方式】 tElock 0.98b1 -> tE!+Asprotect+UPX
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
【破解内容】
设置OD异常把这两个“INT3中断”、“单步中断”打上勾。用IsDebugPresent1.4隐藏OD。
008C7BD6 w>^\E9 25E4FFFF jmp wbkd.008C6000 OD载入后停在TELOCK98壳的入口处。
008C7BDB 0000 add byte ptr ds:[eax],al
008C7BDD 0085 0DE6481E add byte ptr ss:[ebp+1E48E60D],al
008C7BE3 7C 4C jl short wbkd.008C7C31
008C7BE5 0000 add byte ptr ds:[eax],al
008C7BE7 0000 add byte ptr ds:[eax],al
008C7BE9 0000 add byte ptr ds:[eax],al
008C7BEB 0000 add byte ptr ds:[eax],al
008C7BED 003E add byte ptr ds:[esi],bh
F9运行
008C60A7 F7F3 div ebx OD断在第一个异常处
008C60A9 64:67:8F06 00>pop dword ptr fs:[0]
008C60AF 83C4 04 add esp,4
008C60B2 66:BE 4746 mov si,4647
-------------------------------------------------------------
Shift+F9 运行,记住按了多少下,我这里按了5下之后来到了这里
00FB009D 3100 xor dword ptr ds:[eax],eax Asprotect的第一个异常
00FB009F EB 01 jmp short 00FB00A2
00FB00A1 68 648F0500 push 58F64
00FB00A6 0000 add byte ptr ds:[eax],al
OD重新载入,F9运行,按4次Shift+F9。停下,CTR+S在“整个区段”查找命令:
mov edx,dword ptr ss:[ebp+40D362]
mov esi,dword ptr ss:[ebp+40D352]
008C7210 8B95 62D34000 mov edx,dword ptr ss:[ebp+40D362]
008C7216 8BB5 52D34000 mov esi,dword ptr ss:[ebp+40D352] 找到这里
008C721C 85F6 test esi,esi F2下断,中断在这里时ESI的值就是输入表的RVA
008C721E 0F84 06040000 je wbkd.008C762A
在008C721C下断,按Shift+F9断了下来,看看esi的值:003A8000,这就是IAT的位置了,然
后命令行下 D 007A8000(00400000+003A8000),看看OD的左下方,IAT就躺在这里。F8慢慢跟。
008C7309 8985 4AD34000 mov dword ptr ss:[ebp+40D34A],eax kernel32.7C800000
008C730F 8D85 28CC4000 lea eax,dword ptr ss:[ebp+40CC28] 这里返回要计算的函数名,
地址=008C7586, (ASCII "GDI32.DLLUSER32.DLLSHELL32.DLLKERNEL32.DLL")
eax=7C800000 (kernel32.7C800000)
-----------------------------------------------------------------------------
008C734C 61 popad
008C734D C685 D7CC4000 00 mov byte ptr ss:[ebp+40CCD7],0
008C7354 74 24 je short wbkd.008C737A
008C7356 80EC 08 sub ah,8
008C7359 B0 01 mov al,1
008C735B FECC dec ah
008C735D 74 04 je short wbkd.008C7363
008C735F D0E0 shl al,1
008C7361 ^ EB F8 jmp short wbkd.008C735B
008C7363 8AA5 52CC4000 mov ah,byte ptr ss:[ebp+40CC52]
008C7369 0885 52CC4000 or byte ptr ss:[ebp+40CC52],al
008C736F 84C4 test ah,al
008C7371 75 07 jnz short wbkd.008C737A
008C7373 808D D7CC4000 01 or byte ptr ss:[ebp+40CCD7],1\
008C737A 33C0 xor eax,eax |
008C737C 8803 mov byte ptr ds:[ebx],al | 这些NOP掉,就不会破坏IAT
008C737E 43 inc ebx |
008C737F 3803 cmp byte ptr ds:[ebx],al |
008C7381 ^ 75 F7 jnz short wbkd.008C737A /
--------------------略过代码---------------------------------------
008C7567 81E3 FFFFFF7F and ebx,7FFFFFFF
008C756D 53 push ebx
008C756E FFB5 4AD34000 push dword ptr ss:[ebp+40D34A]
008C7574 FF95 E0BA4000 call dword ptr ss:[ebp+40BAE0]
008C757A 40 inc eax
008C757B 48 dec eax
008C757C 75 33 jnz short wbkd.008C75B1 这里跳去处理函数
--------------------略过代码---------------------------------------
008C75B1 8907 mov dword ptr ds:[edi],eax ;kernel32 HeapDestroy 还原函数,把正确的函数保存到EDI的内存地址
008C75B3 58 pop eax
008C75B4 48 dec eax
008C75B5 74 0D je short wbkd.008C75C4 这里改成EB0D
008C75B7 40 inc eax
008C75B8 F8 clc
008C75B9 66:8943 FE mov word ptr ds:[ebx-2],ax
008C75BD 8803 mov byte ptr ds:[ebx],al
008C75BF 43 inc ebx
008C75C0 3803 cmp byte ptr ds:[ebx],al
008C75C2 ^ 75 F9 jnz short wbkd.008C75BD
008C75C4 8385 4ED34000 04 add dword ptr ss:[ebp+40D34E],4
008C75CB ^ E9 BAFDFFFF jmp wbkd.008C738A
008C75D0 83C6 14 add esi,14
008C75D3 8B95 62D34000 mov edx,dword ptr ss:[ebp+40D362]
008C75D9 ^ E9 48FCFFFF jmp wbkd.008C7226
008C75DE 61 popad
008C75DF C3 retn
好了,现在IAT没有被破坏了,清除008C721C处的断点,Shift+F9运行。
00FB009D 3100 xor dword ptr ds:[eax],eax Asprotect的第一个异常
00FB009F EB 01 jmp short 00FB00A2
00FB00A1 68 648F0500 push 58F64
00FB00A6 0000 add byte ptr ds:[eax],al
继续Shift+F9按18下,来到 Asprotect的最后一个异常
00FAFC2A 3100 xor dword ptr ds:[eax],eax Asprotect的最后一个异常
00FAFC2C 64:8F05 00000>pop dword ptr fs:[0]
00FAFC33 58 pop eax
00FAFC34 833D 3439FB00>cmp dword ptr ds:[FB3934],0
00FAFC3B 74 14 je short 00FAFC51
00FAFC3D 6A 0C push 0C
00FAFC3F B9 3439FB00 mov ecx,0FB3934
00FAFC44 8D45 F8 lea eax,dword ptr ss:[ebp-8]
00FAFC47 BA 04000000 mov edx,4
00FAFC4C E8 4BC7FFFF call 00FAC39C
00FAFC51 FF75 FC push dword ptr ss:[ebp-4]
00FAFC54 FF75 F8 push dword ptr ss:[ebp-8]
00FAFC57 8B45 F4 mov eax,dword ptr ss:[ebp-C]
00FAFC5A 8338 00 cmp dword ptr ds:[eax],0
00FAFC5D 74 01 je short 00FAFC60
00FAFC5F 50 push eax
00FAFC60 FF75 F0 push dword ptr ss:[ebp-10]
00FAFC63 FF65 EC jmp dword ptr ss:[ebp-14]
00FAFC66 5F pop edi
00FAFC67 5E pop esi
00FAFC68 5B pop ebx
00FAFC69 8BE5 mov esp,ebp
00FAFC6B 5D pop ebp
00FAFC6C C3 retn
然后在转存窗口Alt+M打开内存镜像
内存映射,项目 19
地址=00401000
大小=0005A000 (368640.)
Owner=wbkd 00400000
区段=.UPX1
包含=code
类型=Imag 01001002
访问=R
初始访问=RWE
下内存访问断点,Shift+F9运行。
00FC2B91 FE01 inc byte ptr ds:[ecx] OD断在这里
00FC2B93 ^ EB E8 jmp short 00FC2B7D
00FC2B95 0BC2 or eax,edx
00FC2B97 BE 00000000 mov esi,0
00FC2B9C 64:8F06 pop dword ptr fs:[esi]
继续按Shift+F9两次
00450727 55 push ebp 呵呵,这就是OEP,快用LordPE完全脱壳这个进程
00450728 8BEC mov ebp,esp
0045072A 6A FF push -1
0045072C 68 88B04500 push wbkd.0045B088
00450731 68 80004500 push wbkd.00450080
00450736 64:A1 0000000>mov eax,dword ptr fs:[0]
0045073C 50 push eax
0045073D 64:8925 00000>mov dword ptr fs:[0],esp
00450744 83EC 58 sub esp,58
00450747 53 push ebx
00450748 56 push esi
00450749 57 push edi
0045074A 8965 E8 mov dword ptr ss:[ebp-18],esp
这时不要退出OD启动,然后启动ImportREC1.6,OEP填00450727-00400000=00050727,RVA填003A8000,大小3000,点获取输入表。用追踪级别一。最后还有几百个无用的函数,剪掉。FIXDUMP.运行下脱壳修复后的文件。OK,成功。但是点试用,程序出退。用OD载入脱壳后的
文件,晕,怎么还在ASPROTECT的壳里呢?经分析后发现问题出在WBKDFUN.DLL上,它加的是
ASProtect 1.2 / 1.2c-> Alexey Solodovnikov壳,好我就脱了它。用OD载入WBKDFUN.DLL
,OD设置除内存异常外的全部异常。
10012001 w> 60 pushad 载入后停在了这里
10012002 E8 1B000000 call wbkdfun1.10012022
10012007 - E9 FC8DB50F jmp 1FB6AE08
1001200C 06 push es
1001200D 0000 add byte ptr ds:[eax],al
F9运行
0093009D 3100 xor dword ptr ds:[eax],eax ASProtect的第一个异常
0093009F EB 01 jmp short 009300A2
009300A1 68 648F0500 push 58F64
009300A6 0000 add byte ptr ds:[eax],al
Shift+F9运行,不断的按Shift+F9运行,直到堆栈中看到下面的信息。
0006D01C 0006D024 指针到下一个 SEH 记录
0006D020 00930217 SE 句柄
0006D024 0006F9BC 指针到下一个 SEH 记录
0006D028 00930A6F SE 句柄
0006D02C 0006F874
0006D030 00920000
0006D034 00900000
0006D038 00930038
0006D03C 00000000
0006D040 00941F50 ASCII "gmuMCADwzbU="
在转存窗口Alt+m打开内存镜像,在DLL的第二区段下内存访问断点。
内存映射,项目 35
地址=10001000
大小=00008000 (32768.)
Owner=wbkdfun1 10000000
区段=
包含=code
类型=Imag 01001002
访问=R
初始访问=RWE
Shift+F9运行
10001CF0 w> 8B4424 04 mov eax,dword ptr ss:[esp+4] 中断在这里
10001CF4 A3 90B00010 mov dword ptr ds:[1000B090],eax
10001CF9 C2 0400 retn 4
继续不断的Shift+F9运行,直到来到下面这里。
10001CB0 w> 8B4424 04 mov eax,dword ptr ss:[esp+4] 试用天数
10001CB4 8B4C24 08 mov ecx,dword ptr ss:[esp+8] 剩余天数
10001CB8 A3 88B00010 mov dword ptr ds:[1000B088],eax
10001CBD 890D 8CB00010 mov dword ptr ds:[1000B08C],ecx
10001CC3 C2 0800 retn 8
我们来处理一下让它永不过期。
10001CB0 >- E9 5ED10000 jmp wbkdfun.1000EE13 跳到自已的代码处执行,因为在原地址改字节不够。
1000EE13 B8 3B9AC9FF mov eax,FFC99A3B
1000EE18 B9 3B9AC9FF mov ecx,FFC99A3B
1000EE1D A3 88B00010 mov dword ptr ds:[1000B088],eax
1000EE22 890D 8CB00010 mov dword ptr ds:[1000B08C],ecx
1000EE28 C2 0800 retn 8
继续Shift+F9运行
10004CE0 55 push ebp 这就是OEP,脱了它吧
10004CE1 8BEC mov ebp,esp
10004CE3 53 push ebx
10004CE4 8B5D 08 mov ebx,dword ptr ss:[ebp+8]
10004CE7 56 push esi
10004CE8 8B75 0C mov esi,dword ptr ss:[ebp+C]
10004CEB 57 push edi
10004CEC 8B7D 10 mov edi,dword ptr ss:[ebp+10]
10004CEF 85F6 test esi,esi
10004CF1 75 09 jnz short wbkdfun.10004CFC
启动LordPE,选LOADDLL.EXE,在它下面选中WBKDFUN.DLL,选完全脱壳这个进程。启动Import REConstructor1.6,选LOADDLL.EXE,选取DLL.选WBKDFUN.DLL,OEP填100000000-10004CE0=00004CE0,用追踪级别一,有一个无用的剪掉,FIXDUMP.
最后注程序还有一个无用的功能CALL,NOP掉,OK,成功。但是却不能跨平台运行。看来
还得学一学。呵呵,高手见笑了。
0040241A E8 DBD80400 call <jmp.&wbkdfun.#28> NOP掉
还有校验
00402A44 . FF15 DC8B7A00 call dword ptr ds:[<&kernel32.#348>] ; \GetFileSize
00402A4A 3D 80D21100 cmp eax,11D280 这里改成MOV EAX,11D000
00402A4F . A3 E4337A00 mov dword ptr ds:[7A33E4],eax
00402A54 . 76 19 jbe short dumped_.00402A6F
------------------------------------------------------------------------
00403736 . 3D B7000000 cmp eax,0B7
0040373B 74 10 je short dumped_.0040374D 改成JMP
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课