首页
社区
课程
招聘
脱tElock+Asprotect+UPX和DLL的壳
发表于: 2005-3-13 22:25 4026

脱tElock+Asprotect+UPX和DLL的壳

2005-3-13 22:25
4026
【破解作者】 落魄浪子
【作者邮箱】 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直播授课

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
2
辛苦
DLL需要修复一下重定位表
2005-3-14 09:09
0
游客
登录 | 注册 方可回帖
返回
//