扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
【软件简介】:SoftLocx comprises of an OCX control for developers wishing to integrate copy protection directly into supporting development languages. With the OCX, protection is achieved with 4 property settings and one line of code. Softlocx contains functionality to e-commerce enable and/or network protect software, and includes a code wizard for quick generation of protection code in your desired development language.
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
【调试环境】:Win2000、Ollydbg V1.10、PEiD、LordPE、WinHex
—————————————————————————————————
【脱壳过程】:
SoftLocx 现在不多见了,PEiD显示:Crunch/PE Heuristic -> Bit-Arts用其加壳的EXE文件脱壳不难,加壳的OCX和DLL文件脱壳多了步寻找重定位表数据。
下面用Softlocx V5.0.0.6主程序自带的Softlocx5.ocx来演示一下脱壳过程。
Ollydbg无法“正常”中断在Softlocx5.ocx的EP,所以稍微改了一下思路。
—————————————————————————————————
一、退出时获得OEP
设置Ollydbg忽略所有异常选项。载入Softlocx5.ocx,F9运行,DLL加载完毕。
现在关闭Ollydbg DLL Loader的小窗口,Ollydbg暂停在壳入口。
这里和ASProtect加壳的dll一样,DLL卸载时会再次中断在外壳入口处!
Code:
70079000 55 push ebp
//暂停在这里
70079001 E8 00000000 call Softlocx.70079006
70079006 5D pop ebp
70079007 83ED 06 sub ebp,6
7007900A 8BC5 mov eax,ebp
7007900C 55 push ebp
7007900D 60 pushad
7007900E 89AD 8A340000 mov dword ptr ss:[ebp+348A],ebp
70079014 2B85 65340000 sub eax,dword ptr ss:[ebp+3465]
7007901A 8985 19250000 mov dword ptr ss:[ebp+2519],eax
70079020 55 push ebp
70079021 BB CD1E0000 mov ebx,1ECD
70079026 03DD add ebx,ebp
70079028 53 push ebx
70079029 64:67:FF36 0000 push dword ptr fs:[0]
7007902F 64:67:8926 0000 mov dword ptr fs:[0],esp
70079035 80BD 90360000 00 cmp byte ptr ss:[ebp+3690],0
7007903C 75 09 jnz short Softlocx.70079047
//跳转
7007903E C685 90360000 01 mov byte ptr ss:[ebp+3690],1
70079045 EB 15 jmp short Softlocx.7007905C
70079047 64:67:8F06 0000 pop dword ptr fs:[0]
7007904D 83C4 08 add esp,8
70079050 61 popad
70079051 5D pop ebp
70079052 8B85 86340000 mov eax,dword ptr ss:[ebp+3486]
70079058 5D pop ebp
70079059 FFE0 jmp eax ; Softlocx.70026848
//飞向光明之巅! ^O^
—————————————————————————————————
二、重定位表信息
Code:
现在下断:BP VirtualFree
然后Ctrl+F2重新载入这个OCX,直接中断在VirtualFree处
0006FB64 700797A5 /CALL 到 VirtualFree 来自 7007979F
0006FB68 007A0000 |Address = 007A0000
0006FB6C 00000000 |Size = 0
0006FB70 00008000 \FreeType = MEM_RELEASE
暂停断点,Alt+F9返回。
Ctrl+S在“整个段块”搜索命令序列:
Code:
sub ecx,8
shr ecx,1
这2条命令对于所有用Softlocx V5.0.0.6加壳的程序来说都是固定的。
找到在7007AE1F处,在其上的7007ADFE处下断。F9运行,中断下来。
Code:
7007ADFE 8BB5 6E340000 mov esi,dword ptr ss:[ebp+346E]
//[ebp+346E]=[7007C46E]=0006F000 ★ 重定位表RVA!
7007AE04 8B95 19250000 mov edx,dword ptr ss:[ebp+2519]
7007AE0A 03F2 add esi,edx
7007AE0C 8B85 15250000 mov eax,dword ptr ss:[ebp+2515]
7007AE12 2BD0 sub edx,eax
//检测是否需要重定位处理 ★
7007AE14 74 6C je short 7007AE82
//可以在这里改标志位Z=1,使其跳转,这样脱壳后就不需要修改基址了。
//这个OCX不需要重定位,但是为了确定重定位表Size,所以改标志位Z=0,使其进行处理
7007AE16 8B06 mov eax,dword ptr ds:[esi]
7007AE18 0BC0 or eax,eax
7007AE1A 74 66 je short 7007AE82
//改标志位Z=0,使其进行处理。处理结束则跳转,在7007AE82处下断
7007AE1C 8B4E 04 mov ecx,dword ptr ds:[esi+4]
7007AE1F 83E9 08 sub ecx,8
7007AE22 D1E9 shr ecx,1
7007AE24 8BBD 19250000 mov edi,dword ptr ss:[ebp+2519]
7007AE2A 03F8 add edi,eax
7007AE2C 83C6 08 add esi,8
7007AE2F 0FB706 movzx eax,word ptr ds:[esi]
7007AE32 C1C8 0C ror eax,0C
7007AE35 FEC8 dec al
7007AE37 78 42 js short 7007AE7B
7007AE39 2C 02 sub al,2
7007AE3B 74 38 je short 7007AE75
7007AE3D EB 3C jmp short 7007AE7B
7007AE3F C1E8 14 shr eax,14
7007AE42 66:011C07 add word ptr ds:[edi+eax],bx
7007AE46 EB 33 jmp short 7007AE7B
7007AE48 C1E8 14 shr eax,14
7007AE4B 66:011407 add word ptr ds:[edi+eax],dx
7007AE4F EB 2A jmp short 7007AE7B
7007AE51 52 push edx
7007AE52 C1E8 14 shr eax,14
7007AE55 8BD8 mov ebx,eax
7007AE57 C1E0 10 shl eax,10
7007AE5A 8A16 mov dl,byte ptr ds:[esi]
7007AE5C 66:81E2 FF0F and dx,0FFF
7007AE61 66:8BC2 mov ax,dx
7007AE64 5A pop edx
7007AE65 8D8410 00800000 lea eax,dword ptr ds:[eax+edx+8000]
7007AE6C 89041F mov dword ptr ds:[edi+ebx],eax
7007AE6F 83C6 02 add esi,2
7007AE72 49 dec ecx
7007AE73 EB 06 jmp short 7007AE7B
7007AE75 C1E8 14 shr eax,14
7007AE78 011407 add dword ptr ds:[edi+eax],edx
7007AE7B 83C6 02 add esi,2
7007AE7E E2 AF loopd short 7007AE2F
7007AE80 EB 94 jmp short 7007AE16
//循环
7007AE82 60 pushad
//中断在这里时,ESI=7007533C ★ 结束地址+2
重定位表信息:
RVA=0006F000
Size=7007533C-7006F000-2=633A
—————————————————————————————————
三、IAT、Dump
恢复VirtualFree的断点,F9运行,再次中断在VirtualFree处
Code:
0006FB64 7007D118 /CALL 到 VirtualFree 来自 7007D112
0006FB68 00790000 |Address = 00790000
0006FB6C 00000000 |Size = 0
0006FB70 00008000 \FreeType = MEM_RELEASE
取消断点,Alt+F9返回。
Code:
7007D112 FF95 32220000 call dword ptr ss:[ebp+2232]
7007D118 8B95 19250000 mov edx,dword ptr ss:[ebp+2519]
//返回这里
7007D11E 8BB5 72340000 mov esi,dword ptr ss:[ebp+3472]
//[ebp+3472]=[7007C472]=00058B28 ★ IAT RVA!
//此时代码解密完毕,输入表是完整的,没有被破坏,所以就在这里用LordPE完全Dump出这个OCX!★
其实下面跳OEP也很容易跟踪:
Code:
7007D226 80BD 4D190000 01 cmp byte ptr ss:[ebp+194D],1
7007D22D 74 39 je short 7007D268
7007D268 80BD 4D190000 01 cmp byte ptr ss:[ebp+194D],1
7007D26F 74 29 je short Softlocx.7007D29A
7007D29A 64:67:8F06 0000 pop dword ptr fs:[0]
7007D2A0 83C4 08 add esp,8
7007D2A3 8B85 19250000 mov eax,dword ptr ss:[ebp+2519]
7007D2A9 0185 86340000 add dword ptr ss:[ebp+3486],eax
7007D2AF FFA5 603D0000 jmp dword ptr ss:[ebp+3D60]; Softlocx.700790E4
700790E4 61 popad
700790E5 5D pop ebp
700790E6 8B85 86340000 mov eax,dword ptr ss:[ebp+3486]
700790EC 5D pop ebp
700790ED FFE0 jmp eax ; Softlocx.70026848
//飞向光明之巅! ^O^
Code:
70026848 55 push ebp
//OEP ★
70026849 8BEC mov ebp,esp
7002684B 53 push ebx
7002684C 8B5D 08 mov ebx,dword ptr ss:[ebp+8]
7002684F 56 push esi
70026850 8B75 0C mov esi,dword ptr ss:[ebp+C]
70026853 57 push edi
70026854 8B7D 10 mov edi,dword ptr ss:[ebp+10]
70026857 85F6 test esi,esi
70026859 75 09 jnz short Softlocx.70026864
7002685B 833D 48320670 00 cmp dword ptr ds:[70063248],0
70026862 EB 26 jmp short Softlocx.7002688A
—————————————————————————————————
四、PE修正
用LordPE修正dumped_.dll:
重定位表RVA=0006F000、大小=633A
修正IAT RVA=00058B28
修正OEP RVA=00026848
保存之。
如果还想做的完美点,可以删除最后一个壳区段,再把输出表数据挪到空白地方即可。
OK,脱壳完成啦。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。