【目标程序】:SVK Protector V1.32破解版加壳的某个dll。附件中含有输入表和UnPacked以供参考。
【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
【调试环境】:WinXP、Ollydbg1.10、LordPE、DLL_Loader、ImportREC
【实例下载】:点击此处下载(或右键另存为)
—————————————————————————————————
【脱壳过程】:
DLL脱壳系列已写了几篇了,虽然没有什么太有价值的东东,也算是留点资料吧。
前些日子有朋友提出看看SVK加壳的DLL,正好看雪论坛恢复,所以写了这篇贺之。
手里只有SVK Protector V1.32 Demo破解版,和注册版加壳的dll有些方面是不同的。
关于SVK的脱壳可以参看我以前发的《伪 SVK Protector 1.32 脱壳+修复——SVK Protector DEMO 1.32 主程序》和《浅谈SVKP 1.3X壳的输入表修复——注册表医生 V2.96 脱壳+破解》。
—————————————————————————————————
一、轻松寻找SVK 1.32破解版加壳程序的OEP
设置Ollydbg忽略所有的异常选项。老规矩:用IsDebug 1.4插件去掉Ollydbg的调试器标志。
代码:
003C1000 60 pushad//进入OD后停在这 003C1001 E8 00000000 call SVKTest.003C1006 003C1006 5D pop ebp 003C1007 81ED 06000000 sub ebp,6 003C100D EB 05 jmp short SVKTest.003C1014
F9运行,程序中断在SVK Protector V1.32破解版的典型异常处!
代码:
0425137F 6285 0E0B0000 bound eax,qword ptr ss:[ebp+B0E] //SVK Protector V1.32破解版的典型异常! 04251385 EB 02 jmp short 04251389
CTR+F 在当前位置下查找命令:add edx, dword ptr ss:[ebp]
找到在0426BC7A处,F2下断。Shift+F9 运行,中断在0426BC7A处!
代码:
0426BC7A 0355 00 add edx,dword ptr ss:[ebp]; SVKTest.003B0000 //EDX=0000108C + 003B0000=003B108C ★ 这就是OEP值 :-) 0426BC7D E8 32000000 call 0426BCB4 0426BC82 C3 retn
直接下断:HE 003B108C F9运行,中断在OEP处!
代码:
003B108C EB 10 jmp short SVKTest.003B109E//OEP 003B108E 66:623A bound di,dword ptr ds:[edx] 003B1091 43 inc ebx 003B1092 2B2B sub ebp,dword ptr ds:[ebx] 003B1094 48 dec eax 003B1095 4F dec edi 003B1096 4F dec edi 003B1097 4B dec ebx 003B1098 90 nop 003B1099 E9 F8903B00 jmp 0076A196 003B109E A1 7F903B00 mov eax,dword ptr ds:[3B907F] 003B10A3 C1E0 02 shl eax,2 003B10A6 A3 83903B00 mov dword ptr ds:[3B9083],eax 003B10AB 8B4424 08 mov eax,dword ptr ss:[esp+8] 003B10AF A3 F1903B00 mov dword ptr ds:[3B90F1],eax 003B10B4 FF1485 E1903B00 call dword ptr ds:[eax*4+3B90E1]
用LordPE选中Ollydbg的loaddll.exe的进程,在下面的列表里选择SVKTest.dll,然后完整脱壳,得到dumped.dll。
以上寻找SVK 1.32破解版加壳程序的OEP的方法,既适用于EXE,也适用于DLL!
—————————————————————————————————
二、输入表
因为有SvkpIAT的ImportREC插件,所以就偷点懒了,呵呵。
从程序找几个API调用:
代码:
003B8B68 FF25 5CD03B00 jmp dword ptr ds:[3BD05C] 003B8B6E FF25 60D03B00 jmp dword ptr ds:[3BD060] …… …… 003B8C5E FF25 B4D13B00 jmp dword ptr ds:[3BD1B4] 003B8C64 FF25 B8D13B00 jmp dword ptr ds:[3BD1B8]
开始地址=3BD05C
结束地址=3BD1BC
可以看出其中有一些填充的无效数据。
如果用ImportREC的插件来修复在Ollydbg中运行的DLL会导致ImportREC失去响应,所以我们用DLL_Loader.exe加载这个DLL,然后运行ImportREC 1.42+来修复,ImportREC 1.6对某些插件支持不佳。注意:去掉ImportREC的“使用来自磁盘的PE部首”的选项!程序属性中选择“启用调试权限”!
选中DLL_Loader.exe的进程,然后点“选取DLL”,选择SVKTest.dll,填入RVA=0000D05C、大小=00000160 ,点“Get Import”,先用“追踪层次1”修复了部分函数。通过后面的值可以看出FThunk: 0000D068 NbFunc: 00000026和FThunk: 0000D1A0 NbFunc: 00000003 这些是无法数据,可以删除这2组指针。
再用“SvkpIAT”插件依次修复剩下的4个无效函数。通过以前的经验知道SVK Protector加壳的程序有几个特殊函数,如:GetVersionExA、GetModuleHandleA、GetProcAddress、ExitProcess等,特别是ExitProcess,用插件修复到这个函数时加壳程序会自动退出!几个函数依次修复如下:
代码:
0000D10C kernel32.dll 00AC ExitProcess //修复到这个函数时SVKTest.dll会自动退出,通过跟踪原加壳dll也可以判定这个是ExitProcess 0000D134 kernel32.dll 0168 GetModuleHandleA 0000D13C kernel32.dll 018A GetProcAddress 0000D150 kernel32.dll 01C8 GetVersion 0000D154 kernel32.dll 01C9 GetVersionExA
改OEP=0000108C,可以保存这个树文件了。
—————————————————————————————————
三、重定位表
SVK Protector V1.32破解版加壳dll没有加密重定位表,这省了我们很多工夫。从而使得这个壳的DLL脱壳相对来说简单了许多。
以前已经说过了,得到重定位信息的基本思路是对程序中需要重定位的代码地址处下“内存写入”断点,最终跟踪得到是哪里对这些数据进行处理的。比如这个dll可以从程序中一处需要重定位的地方:
003B109E A1 7F903B00 mov eax,dword ptr ds:[3B907F]
这里003B1010处的3B就是重定位后的地址,所以我们可以在适当的时机对003B1010处下“内存写入”断点,从而得到SVK壳对dll重定位表的处理代码部分。
不断的实践+不断的总结,寻找相对最简便的方法,这或许是脱壳和Crack的乐趣吧? :-)
现在我们重新用Ollydbg载入SVKTest.dll,按照第一部分的步骤来到SVK Protector V1.32破解版的典型异常处!
代码:
0425137F 6285 0E0B0000 bound eax,qword ptr ss:[ebp+B0E] //SVK Protector V1.32破解版的典型异常! 04251385 EB 02 jmp short 04251389
第一部分时我们是从这里开始寻找OEP的,现在我们同样可以在这里开始寻找重定位表信息!
提供一个简便寻找SVK Protector V1.32破解版加壳DLL的重定位处理代码段的方法!
Ctrl+S在当前位置下搜索命令序列:
代码:
add ecx,-8 push ebp push ebx push edx shr ecx,1
找到在0426F3EE处,我们在其上sub ebx,esi的0426F3E0处下断,Shift+F9 运行,中断在0426F3E0处!
代码:
0426F3D8 8BB5 73E10100 mov esi,dword ptr ss:[ebp+1E173] 0426F3DE 8BDF mov ebx,edi 0426F3E0 2BDE sub ebx,esi //这里其实就是检测与映像基址是否相符。不符则重定位处理! ★ //可以在这里改寄存器值EBX=ESI,这样脱壳后就不需要修改基址了。 ★ 0426F3E2 8B48 04 mov ecx,dword ptr ds:[eax+4] //注意EAX=003C0000 //重定位表RVA=003C0000-003B0000=00010000 ★ 0426F3E5 8D50 08 lea edx,dword ptr ds:[eax+8] 0426F3E8 298D 97E10100 sub dword ptr ss:[ebp+1E197],ecx 0426F3EE 83C1 F8 add ecx,-8 0426F3F1 55 push ebp 0426F3F2 53 push ebx 0426F3F3 52 push edx 0426F3F4 D1E9 shr ecx,1 0426F3F6 51 push ecx 0426F3F7 8BCF mov ecx,edi 0426F3F9 0308 add ecx,dword ptr ds:[eax] 0426F3FB 51 push ecx 0426F3FC E8 0C000000 call 0426F40D 0426F401 5D pop ebp 0426F402 83BD 97E10100 00 cmp dword ptr ss:[ebp+1E197],0 0426F409 75 D7 jnz short 0426F3E2 //重定位处理完毕后这里则不跳转 在下面下断 0426F40B 61 popad //中断在这里时EAX=003C0814 这就是重定位表的结束地址啦 ★ 0426F40C C3 retn
我们得到重定位表信息:
代码:
RVA=00010000 ,大小=003C0814-003C0000=00000814 ★
现在 CTR+F 在整个区段查找命令:add edx, dword ptr ss:[ebp]
代码:
0426BC7A 0355 00 add edx,dword ptr ss:[ebp]; SVKTest.003B0000 //EDX=0000108C + 003B0000=003B108C ★ 这就是OEP值 :-)
可以按照第一部分所示的方法走到OEP了。熟悉之后当然可以一次完成脱壳了,为了方便大家理解,所以写的详细点啦。
Dump之后就可以用ImportREC载入第二部分得到的树文件,FixDump!
—————————————————————————————————
四、PE修正、完成脱壳
用LordPE修正dumped_.dll的重定位表RVA=00010000、大小=00000814,保存之。
再用LordPE修正dumped_.dll的基址为003B0000,OK,脱壳完成啦。
如果在0426F3E0做了修改,避开了重定位处理,则不需要修改基址。
—————————————————————————————————
代码:
, _/ /| _.-~/ \_ , 青春都一晌 ( /~ / \~-._ |\ `\\ _/ \ ~\  忍把浮名 _-~~~-.)  __/;;,. \_ //' /'_,\ --~ \ ~~~- ,;;\___( (.-~~~-. 换了破解轻狂 `~ _( ,_..--\ ( ,;'' / ~-- /._`\ /~~//' /' `~\   /--.._, _ `~ " `~" " `" /~'`\ `\\~~\ " " "~' ""
Cracked By 巢水工作坊——fly [OCN][FCG][NUKE][DCM]
2004-06-13 09:00