【目标程序】:tElock加壳的EdrLib.dll。附件中含有UnPacked以供参考。
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
【调试环境】:WinXP、Ollydbg1.10、LordPE
―――――――――――――――――――――――――――――――――
【脱壳过程】:
借用《解密与解密》第二版中的话:tElock加壳的DLL的致命弱点就是输入表和重定位加密代码可以被跳过!也就是说我们只要搞定了这两个Magic Jump就行了。下面的方法和书上的操作流程有点不同,其实原理是一样的。
―――――――――――――――――――――――――――――――――
一、双重Magic Jump:避开重定位和输入表加密
设置Ollydbg忽略除了“INT3中断”之外的所有其它异常选项。老规矩:用IsDebug 1.4插件去掉Ollydbg的调试器标志。
003B8BD6 E9 25E4FFFF jmp EdrLib.003B7000//进入OD后停在这
003B8BD0 FF6424 04 jmp dword ptr ss:[esp+4]
003B708D 90 nop//第1次异常
003B7B28 90 nop//第2次异常
mov ebx,edx
shr ebx,10
mov eax,dword ptr ds:[esi]
003B8177 8BB5 56D34000 mov esi,dword ptr ss:[ebp+40D356]
//[ebp+40D356]=[003B8CB4]=00006000 ★ 这个00006000就是重定位表的RVA!
003B817D 85F6 test esi,esi
003B817F 0F84 8B000000 je EdrLib.003B8210
003B8185 8B95 62D34000 mov edx,dword ptr ss:[ebp+40D362]
003B818B 03F2 add esi,edx
003B818D 2B95 66D34000 sub edx,dword ptr ss:[ebp+40D366]
//这里其实就是检测与映像基址是否相符,不符则重定位处理!★
003B8193 74 7B je short EdrLib.003B8210
//Magic Jump,可以第2次Load后在这里改标志位Z=1,使其跳转 ★
003B8195 8BDA mov ebx,edx//找到这里!
003B8197 C1EB 10 shr ebx,10
003B819A 8B06 mov eax,dword ptr ds:[esi]
003B819C 85C0 test eax,eax
003B819E 74 70 je short EdrLib.003B8210
//重定位处理完毕后这里就跳转 在003B8210处下断
003B81A0 8B4E 04 mov ecx,dword ptr ds:[esi+4]
003B81A3 83E9 08 sub ecx,8
003B81A6 D1E9 shr ecx,1
003B81A8 8BBD 62D34000 mov edi,dword ptr ss:[ebp+40D362]
003B81AE 03F8 add edi,eax
003B81B0 83C6 08 add esi,8
003B81B3 0FB706 movzx eax,word ptr ds:[esi]
003B81B6 C1C8 0C ror eax,0C
003B81B9 FEC8 dec al
003B81BB 78 4C js short EdrLib.003B8209
003B81BD 74 0E je short EdrLib.003B81CD
003B81BF FEC8 dec al
003B81C1 74 13 je short EdrLib.003B81D6
003B81C3 FEC8 dec al
003B81C5 74 3C je short EdrLib.003B8203
003B81C7 FEC8 dec al
003B81C9 74 14 je short EdrLib.003B81DF
003B81CB EB 3C jmp short EdrLib.003B8209
003B81CD C1E8 14 shr eax,14
003B81D0 66:011C07 add word ptr ds:[edi+eax],bx
003B81D4 EB 33 jmp short EdrLib.003B8209
003B81D6 C1E8 14 shr eax,14
003B81D9 66:011407 add word ptr ds:[edi+eax],dx
003B81DD EB 2A jmp short EdrLib.003B8209
003B81DF 52 push edx
003B81E0 C1E8 14 shr eax,14
003B81E3 8BD8 mov ebx,eax
003B81E5 C1E0 10 shl eax,10
003B81E8 66:8B16 mov dx,word ptr ds:[esi]
003B81EB 66:81E2 FF0F and dx,0FFF
003B81F0 66:8BC2 mov ax,dx
003B81F3 5A pop edx
003B81F4 8D8410 00800000 lea eax,dword ptr ds:[eax+edx+8000]
003B81FB 89041F mov dword ptr ds:[edi+ebx],eax
003B81FE 46 inc esi
003B81FF 46 inc esi
003B8200 49 dec ecx
003B8201 EB 06 jmp short EdrLib.003B8209
003B8203 C1E8 14 shr eax,14
003B8206 011407 add dword ptr ds:[edi+eax],edx
003B8209 46 inc esi
003B820A 46 inc esi
003B820B 49 dec ecx
003B820C 7F A5 jg short EdrLib.003B81B3
003B820E EB 8A jmp short EdrLib.003B819A//循环处理
003B8210 8B95 62D34000 mov edx,dword ptr ss:[ebp+40D362]
//当我们中断在003B8210处时,重定位处理完毕。此时ESI=003B63B0,★ 就是重定位表的结束地址啦。
//得到重定位表信息:RVA=00006000,大小=000003B0
003B8216 8BB5 52D34000 mov esi,dword ptr ss:[ebp+40D352]
//[ebp+40D352]=[003B8CB0]=0000442C ★ 这就是输入表的RVA啦。
003B821C 85F6 test esi,esi
003B821E 0F84 06040000 je EdrLib.003B862A
//第2个Magic Jump,改标志位Z=1,使其跳转,则不加密IAT
003B8224 03F2 add esi,edx
003B8226 83A5 52D44000 00 and dword ptr ss:[ebp+40D452],0
003B822D 8B46 0C mov eax,dword ptr ds:[esi+C]
003B8230 8366 0C 00 and dword ptr ds:[esi+C],0
003B8234 85C0 test eax,eax
003B8236 0F84 EE030000 je EdrLib.003B862A
003B823C 03C2 add eax,edx
003B823E 8BD8 mov ebx,eax
003B8240 50 push eax
003B8241 FF95 D0D24000 call dword ptr ss:[ebp+40D2D0]//GetModuleHandleA
003B8247 85C0 test eax,eax
003B8249 0F85 BA000000 jnz EdrLib.003B8309
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)