-
-
[分享]SoftWrap 6.x之三:IAT修复之VB
-
发表于: 2007-4-25 14:31 7822
-
【文章标题】: SoftWrap 6.x之三:IAT修复之VB
【文章作者】: wynney
【软件名称】: XP Smoker 4.4
【使用工具】: OD、CodeCaver
--------------------------------------------------------------------------------
【详细过程】
一、前言
SoftWrap的输入表加密很有特色,倒是跟ASProtect的Stolen Code有点类似了。我们知道,一般程序有以下几种IAT格式
1、Jmp Dword ptr ds:[API] '6字节
2、Call Dword ptr ds:[API] '6字节
3、mov eax, Dword ptr ds:[API] ->5字节
4、mov REG,Dword ptr ds:[API] ->6字节[eax外的寄存器,且esp、edx基本不被使用]
而SoftWrap加密之后分别被改成这种形式
1、Call DWORD PTR DS:[addr1] '6字节
2、Call DWORD PTR DS:[addr2] '6字节
3、Call addr3 '5字节
4、Call addr4 '5字节+1个字节的寄存器类型识别指令
上面最难恢复的是第4种,因为我们需要分析出他所对应的一个表,例如,在某某情况是要恢复成ebx,另外某个情况需要恢复成ecx。。。。。同时需要注意的是3和4是分开的情况
然而,VB的程序只有1种情况,就是Jmp Dword ptr ds:[API]被改成了Call DWORD PTR DS:[addr],这样就大大的减小了我们的难度。本文介绍的是如何去恢复Jmp Dword ptr ds:[API]类型,为后面讲解如何恢复这4种类型铺个路。
二、去OEP溜达
1、设置异常,忽略特权和指定异常外的所有异常
4次Shift+F9,出现试用框,点Try Now,中断后继续Shift+F9两次,在Code段下内存访问断点[不可以F2],Shift+F9,两次,即可到达OEP了。
………………………………
004081F4 FF15 80224E00 call dword ptr [4E2280] ; xpsmoker.004E4E39
004081FA FF15 80224E00 call dword ptr [4E2280] ; xpsmoker.004E4E39
00408200 FF15 80224E00 call dword ptr [4E2280] ; xpsmoker.004E4E39
00408206 FF15 80224E00 call dword ptr [4E2280] ; xpsmoker.004E4E39
0040820C FF15 80224E00 call dword ptr [4E2280] ; xpsmoker.004E4E39
00408212 FF15 80224E00 call dword ptr [4E2280] ; xpsmoker.004E4E39
00408218 68 78844000 push 00408478 ; OEP
0040821D E8 F0FFFFFF call 00408212
可以看到所有的指针全部改成了call dword ptr [4E2280]
随便找一个指针,Enter进去吧
004E4E39 9C pushfd
004E4E3A 50 push eax
004E4E3B 53 push ebx
004E4E3C 8B5C24 0C mov ebx, dword ptr [esp+C]
004E4E40 53 push ebx
004E4E41 83EB 06 sub ebx, 6
004E4E44 68 11270000 push 2711
004E4E49 68 00000801 push 1080000 ;虚拟内存地址
004E4E4E C3 retn
01080000 55 push ebp ; API加密段首,记住①
01080001 56 push esi
01080002 57 push edi
01080003 51 push ecx
01080004 52 push edx
01080005 50 push eax
01080006 BD 66274E00 mov ebp, 4E2766
0108000B 016C24 18 add dword ptr [esp+18], ebp
0108000F 2B9D 962A0000 sub ebx, dword ptr [ebp+2A96]
三、获取输入表
Ctrl+G:VirtualAlloc,在段尾F2[直接bp VirtualAlloc会被检测到],shift+F9,中断后返回
Ctrl+B:85 C0 0F 84 ?? ?? ?? ?? F6 C3 02 74 21 FF B5 ?? ?? ?? ?? 6A 10 50 FF B5 ?? ?? ?? ?? FF B5 ?? ?? ?? ??
004E463A 85C0 test eax, eax ; 找到这里
004E463C 0F84 89000000 je 004E46CB
004E4642 F6C3 02 test bl, 2 ; F2[he有时断不下来],Shft+F9,删除断点,看寄存器
004E4645 74 21 je short 004E4668
004E4647 FFB5 DF1C0000 push dword ptr [ebp+1CDF]
004E464D 6A 10 push 10
004E464F 50 push eax
004E4650 FFB5 DF1C0000 push dword ptr [ebp+1CDF]
004E4656 FFB5 E31C0000 push dword ptr [ebp+1CE3]
004E465C E8 FAF7FFFF call 004E3E5B
EAX 6600A019 MSVBVM60.DllFunctionCall
ECX 00000000
EDX CBF65AD9
EBX FC50432D
ESP 0012FF8C ASCII "賈鏊"
EBP 004E2766 xpsmoker.004E2766
ESI 004E5E50 xpsmoker.004E5E50
EDI 004E67EC xpsmoker.004E67EC
Eax里面出现的是IAT了,你可以在004E4642多中断几次,可以看到eax里面的IAT,呵呵
好了,我们现在来写Patch代码,找一片空白[不会被使用的],大小要足够。
我用的是申请的空间[非程序所有的空间、这就意味着后面用ImportREC修复的时候需要用高级指令查找],我申请的是3F0000,10000大小
设置3F0000为存放基址的位置,3F0004为IAT地址指针,3F0008为存放IAT的起始地址
[003F0000]=ECX -->第一中断后ecx的值,一般是0
[003F0004]=003F0008 -->IAT地址指针
003F0000 00 00 00 00 08 00 3F 00 .... .?.
003F0008 00 00 00 00 00 00 00 00 ........
003F0010 00 00 00 00 00 00 00 00 ........
004E4642 3A0D 00003F00 cmp cl, byte ptr [3F0000] 004E4648 74 0E je short 004E4658 004E464A FE05 00003F00 inc byte ptr [3F0000] 004E4650 66:8305 04003F0>add word ptr [3F0004], 4 004E4658 8B1D 04003F00 mov ebx, dword ptr [3F0004] 004E465E 8903 mov dword ptr [ebx], eax 004E4660 66:8305 04003F0>add word ptr [3F0004], 4 3A 0D 00 00 3F 00 74 0E FE 05 00 00 3F 00 66 83 05 04 00 3F 00 04 8B 1D 04 00 3F 00 89 03 66 83 05 04 00 3F 00 04
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
- [注意]天草 魔鬼实地训练(0716更新照片) 37725
- [求助]为啥没有邀请码? 4069
- [注意]北京某外企招聘开发工程师 15969
- [分享]做了两个语音视频, 壳的全程分析, 高手飘过吧 128742