目标程序】:tElock加壳的wjtd.dll。附件中含有原程序和脱壳文件
作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
【调试环境】:Win2000SP4、Ollydbg1.10、LordPE
【实例下载】:61.130.100.251/wjtd.rar
【脱壳过程】:
本文参考Fly大侠《用Ollydbg手脱tElock V0.98加壳的DLL》写成!
希望Fly兄多多指点
一、双重Magic Jump:避开重定位和输入表加密
设置Ollydbg忽略除了“INT3中断”“单步中断”之外的所有其它异常选项。老规矩:用IsDebug 1.4插件去掉Ollydbg的调试器标志。
代码:--------------------------------------------------------------------------------
00853BD6 E9 25E4FFFF jmp Wjtd.00852000//进入OD后停在这
00853BD0 0000 add byte ptr ds:[eax],al
Shift+F9 12次后程序运行,返回后,再按Shift+F9 10次后程序停在
00852E40 73 DC jnb short wjtd.00852E1E
现在设置Ollydbg忽略所有异常选项。Ctrl+S在“整个段块”搜索命令序列:
代码:--------------------------------------------------------------------------------
mov ebx,edx
shr ebx,10
mov eax,dword ptr ds:[esi]
--------------------------------------------------------------------------------
找到在00853195处!我们在其上的00853177处下断,Shift+F9 运行,中断
00853177 8BB5 56D34000 mov esi,dword ptr ss:[ebp+40D356]
//[ebp+40D356]=[00853CB4]=00097000 ★ 这个00097000就是重定位表的RVA!
0085317D 85F6 test esi,esi
0085317F 0F84 8B000000 je wjtd.00853210
00853185 8B95 62D34000 mov edx,dword ptr ss:[ebp+40D362]
0085318B 03F2 add esi,edx
0085318D 2B95 66D34000 sub edx,dword ptr ss:[ebp+40D366]
//这里其实就是检测与映像基址是否相符,不符则重定位处理!★
00853193 74 7B je short wjtd.00853210
//Magic Jump,可以第2次Load后在这里改标志位Z=1,使其跳转 ★
00853195 8BDA mov ebx,edx
00853197 C1EB 10 shr ebx,10
0085319A 8B06 mov eax,dword ptr ds:[esi]
0085319C 85C0 test eax,eax
0085319E 74 70 je short wjtd.00853210
008531A0 8B4E 04 mov ecx,dword ptr ds:[esi+4]
008531A3 83E9 08 sub ecx,8
008531A6 D1E9 shr ecx,1
008531A8 8BBD 62D34000 mov edi,dword ptr ss:[ebp+40D362]
008531AE 03F8 add edi,eax
008531B0 83C6 08 add esi,8
008531B3 0FB706 movzx eax,word ptr ds:[esi]
008531B6 C1C8 0C ror eax,0C
008531B9 FEC8 dec al
008531BB 78 4C js short wjtd.00853209
008531BD 74 0E je short wjtd.008531CD
008531BF FEC8 dec al
008531C1 74 13 je short wjtd.008531D6
008531C3 FEC8 dec al
008531C5 74 3C je short wjtd.00853203
008531C7 FEC8 dec al
008531C9 74 14 je short wjtd.008531DF
008531CB EB 3C jmp short wjtd.00853209
008531CD C1E8 14 shr eax,14
008531D0 66:011C07 add word ptr ds:[edi+eax],bx
008531D4 EB 33 jmp short wjtd.00853209
008531D6 C1E8 14 shr eax,14
008531D9 66:011407 add word ptr ds:[edi+eax],dx
008531DD EB 2A jmp short wjtd.00853209
008531DF 52 push edx
008531E0 C1E8 14 shr eax,14
008531E3 8BD8 mov ebx,eax
008531E5 C1E0 10 shl eax,10
008531E8 66:8B16 mov dx,word ptr ds:[esi]
008531EB 66:81E2 FF0F and dx,0FFF
008531F0 66:8BC2 mov ax,dx
008531F3 5A pop edx
008531F4 8D8410 00800000 lea eax,dword ptr ds:[eax+edx+8000]
008531FB 89041F mov dword ptr ds:[edi+ebx],eax
008531FE 46 inc esi
008531FF 46 inc esi
00853200 49 dec ecx
00853201 EB 06 jmp short wjtd.00853209
00853203 C1E8 14 shr eax,14
00853206 011407 add dword ptr ds:[edi+eax],edx
00853209 46 inc esi
0085320A 46 inc esi
0085320B 49 dec ecx
0085320C ^ 7F A5 jg short wjtd.008531B3
0085320E ^ EB 8A jmp short wjtd.0085319A
00853210 8B95 62D34000 mov edx,dword ptr ss:[ebp+40D362]
//当我们中断在00853210处时,重定位处理完毕。此时ESI=00840780,★ 就是重定位表的结束地址啦。
//得到重定位表信息:RVA=00097000,大小=840780-837000=00009780
00853216 8BB5 52D34000 mov esi,dword ptr ss:[ebp+40D352]
//[ebp+40D352]=[0853CB0]=00093000 ★ 这就是输入表的RVA啦。
0085321C 85F6 test esi,esi
0085321E 0F84 06040000 je wjtd.0085362A
//第2个Magic Jump,改标志位Z=1,使其跳转,则不加密IAT
00853224 03F2 add esi,edx
00853226 83A5 52D44000 00 and dword ptr ss:[ebp+40D452],0
0085322D 8B46 0C mov eax,dword ptr ds:[esi+C]
00853230 8366 0C 00 and dword ptr ds:[esi+C],0
00853234 85C0 test eax,eax
00853236 0F84 EE030000 je wjtd.0085362A
0085323C 03C2 add eax,edx
0085323E 8BD8 mov ebx,eax
00853240 50 push eax
00853241 FF95 D0D24000 call dword ptr ss:[ebp+40D2D0]
00853247 85C0 test eax,eax
00853249 0F85 BA000000 jnz wjtd.00853309
咱们已经得到重定位表信息了,所以可以再次载入这个DLL,重复上面的步骤,避开重定位表加密!
―――――――――――――――――――――――――――――――――
二、第2区段内存断点法:快速直达OEP
当我们修改了以上两个Magic Jump,自0085321E处跳至0083562A。
代码:--------------------------------------------------------------------------------
0085362A 8BBD 5AD34000 mov edi,dword ptr ss:[ebp+40D35A]
00853630 85FF test edi,edi
00853632 EB 03 jmp short wjtd.00853637
--------------------------------------------------------------------------------
现在我们Alt+M打开 内存查看 窗口:
在007A1000第2区段上 设置内存访问断点!Shift+F9 运行,直接中断在OEP处!
代码:--------------------------------------------------------------------------------
0082C07C 55 push ebp
0082C07D 8BEC mov ebp,esp
0082C07F 83C4 C4 add esp,-3C
0082C082 B8 ECBD4800 mov eax,48BDEC
0082C087 E8 14A2F7FF call wjtd.007A62A0
--------------------------------------------------------------------------------
用LordPE选中Ollydbg的loaddll.exe的进程,在下面的列表里选择wjtd.dll,然后完整脱壳,得到dumped.dll。
―――――――――――――――――――――――――――――――――
三、PE修正
//修正参数如下
入口点 OEP = 8C07C
输入表 RVA = 93000
重定位 RVA = 9700 大小 = 9780
OK,脱壳完成啦,运行后无错
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!