到手一个vmp壳,如图,应该是一个 vmp 1.x版本的壳。
撸到OEP后,在进一步的修复IAT输入表过程中遇到了一时间无法解决的问题。
以前也没脱过相应的VMP壳以及需要写脚本修复IAT输入表单的壳,所以以下的脚本编写以及壳的脱法,都是从网络上各个帖子中一点一点分析,以及总结出来的。
[如有错误,望大佬指正,学习的机会很甚重要,不胜感激!]
脚本编写思路
1、将VMP对IAT的调用以及操作的进行加密的call 找出来
2、定位VMP解密后对IAT以及API地址进行操作的代码,将我们需要的信息记录
3、对相应的IAT地址等对程序代码进行写入还原真实地址,然后进行重复2-3步骤,直到IAT修复完成
问题来了,我需要编写的脚本在第二步骤卡住了。我无法让脚本定位到这些vmp解密后调用的代码,未找到相应特征,规律,一时间无法解决。
先上我找到的一些进行操作的代码吧。
[Asm] 纯文本查看 复制代码 0086239C 870424 xchg dword ptr ss:[esp],eax
0086239F 60 pushad
008623A0 66:0FB6C2 movzx ax,dl
008623A4 60 pushad
008623A5 B8 156C4300 mov eax,Main.00436C15 eax ,第一次进行操作
008623AA ^ E9 F0E6F5FF jmp Main.007C0A9F
007C0A9F 8B80 662D4200 mov eax,dword ptr ds:[eax+0x422D66] 第二次进行操作
007C0AA5 ^ E9 3751FDFF jmp Main.00795BE1
00795BE1 E8 686C0500 call Main.007EC84E
007EC84E /E9 60C00400 jmp Main.008388B3
008388B3 8D80 CE307320 lea eax,dword ptr ds:[eax+0x207330CE] 计算出真实api地址,存到eax
008388B9 ^ E9 63B5FBFF jmp Main.007F3E21
007F3E21 874424 44 xchg dword ptr ss:[esp+0x44],eax 将api地址写入到iat地址中 , 关键代码
007F3E25 57 push edi ; Main.00636BD0
007F3E26 FF7424 48 push dword ptr ss:[esp+0x48]
007F3E2A C2 4C00 retn 0x4C
[Asm] 纯文本查看 复制代码 007DE13B 895424 1C mov dword ptr ss:[esp+0x1C],edx ; ntdll.KiFastSystemCallRet
007DE13F 894C24 04 mov dword ptr ss:[esp+0x4],ecx
007DE143 5A pop edx ; Main.00795BE6
007DE144 BA EB954200 mov edx,Main.004295EB edx ,第一次进行赋值
007DE149 9C pushfd
007DE14A 9C pushfd
007DE14B 60 pushad
007DE14C 8B92 53DD4000 mov edx,dword ptr ds:[edx+0x40DD53] 第二次进行操作
007DE152 55 push ebp
007DE153 E8 59E20700 call Main.0085C3B1
0085C3B1 ^\E9 923DFAFF jmp Main.00800148
00800148 68 34DBBE34 push 0x34BEDB34
0080014D 8D92 C7F218B7 lea edx,dword ptr ds:[edx-0x48E70D39] 第三次得出api地址
00800153 ^ E9 5463FFFF jmp Main.007F64AC
007F64AC E8 EB61FFFF call Main.007EC69C
007EC69C 9C pushfd
007EC69D 894C24 0C mov dword ptr ss:[esp+0xC],ecx
007EC6A1 875424 50 xchg dword ptr ss:[esp+0x50],edx ; ntdll.KiFastSystemCallRet 写入过程,关键
007EC6A5 887424 04 mov byte ptr ss:[esp+0x4],dh
007EC6A9 893424 mov dword ptr ss:[esp],esi
007EC6AC FF7424 50 push dword ptr ss:[esp+0x50]
007EC6B0 C2 5400 retn 0x54
[Asm] 纯文本查看 复制代码 007CE36D BB ED9A4500 mov ebx,Main.00459AED ////
007CE372 C74424 04 4B9F5>mov dword ptr ss:[esp+0x4],0x155A9F4B
007CE37A E9 2CE00100 jmp Main.007EC3AB
007EC3AB 8B9B 137E3E00 mov ebx,dword ptr ds:[ebx+0x3E7E13] /////
007EC3B1 FF3424 push dword ptr ss:[esp]
007EC3B4 8D9B 8DAE9EF3 lea ebx,dword ptr ds:[ebx-0xC615173] /////
007EC3BA E9 8E790100 jmp Main.00803D4D
00803D4D 880C24 mov byte ptr ss:[esp],cl
00803D50 875C24 3C xchg dword ptr ss:[esp+0x3C],ebx ////
00803D54 9C pushfd
00803D55 51 push ecx
00803D56 68 D80E9E6D push 0x6D9E0ED8
00803D5B FF7424 48 push dword ptr ss:[esp+0x48]
00803D5F C2 4C00 retn 0x4C
[Asm] 纯文本查看 复制代码 007E3873 66:0FCE bswap si
007E3876 BE CA944600 mov esi,Main.004694CA ///
007E387B E9 F69F0000 jmp Main.007ED876
007ED876 FF3424 push dword ptr ss:[esp]
007ED879 8BB6 C1863600 mov esi,dword ptr ds:[esi+0x3686C1] ; Main.006A9610 /////
007ED87F 9C pushfd
007ED880 E8 0D270400 call Main.0082FF92
0082FF92 896424 04 mov dword ptr ss:[esp+0x4],esp
0082FF96 8DB6 BE8E97A3 lea esi,dword ptr ds:[esi-0x5C687142] /////
0082FF9C 9C pushfd
0082FF9D 68 2BC161AC push 0xAC61C12B
0082FFA2 877424 3C xchg dword ptr ss:[esp+0x3C],esi /////
0082FFA6 FF7424 04 push dword ptr ss:[esp+0x4] ; Main.007DE158
0082FFAA FF7424 40 push dword ptr ss:[esp+0x40]
0082FFAE C2 4400 retn 0x44
[Asm] 纯文本查看 复制代码 007E13AA 9C pushfd
007E13AB 0FBEDA movsx ebx,dl
007E13AE 8D99 631BE38D lea ebx,dword ptr ds:[ecx-0x721CE49D]
007E13B4 BB 818A4200 mov ebx,Main.00428A81 /////
007E13B9 9C pushfd
007E13BA C70424 39FA3FA7 mov dword ptr ss:[esp],0xA73FFA39
007E13C1 E8 D91E0700 call Main.0085329F
0085329F 9C pushfd
008532A0 8B9B 5A0E3D00 mov ebx,dword ptr ds:[ebx+0x3D0E5A] /////
008532A6 68 20627128 push 0x28716220
008532AB FF3424 push dword ptr ss:[esp]
008532AE ^ E9 ACA0FDFF jmp Main.0082D35F
0082D35F 8D9B 1030684B lea ebx,dword ptr ds:[ebx+0x4B683010] ////
0082D365 C64424 04 51 mov byte ptr ss:[esp+0x4],0x51
0082D36A 9C pushfd
0082D36B E9 B0C40200 jmp Main.00859820
00859820 51 push ecx
00859821 875C24 50 xchg dword ptr ss:[esp+0x50],ebx /////
00859825 886C24 0C mov byte ptr ss:[esp+0xC],ch
00859829 C60424 E0 mov byte ptr ss:[esp],0xE0
0085982D FF7424 50 push dword ptr ss:[esp+0x50]
00859831 C2 5400 retn 0x54
[Asm] 纯文本查看 复制代码 007967AB B9 F6AF4700 mov ecx,Main.0047AFF6 ////
007967B0 9C pushfd
007967B1 C60424 EB mov byte ptr ss:[esp],0xEB
007967B5 FF3424 push dword ptr ss:[esp]
007967B8 8B89 AD603B00 mov ecx,dword ptr ds:[ecx+0x3B60AD] ////
007967BE 60 pushad
007967BF 9C pushfd
007967C0 9C pushfd
007967C1 E8 CD680000 call Main.0079D093
0079D093 8D89 D1B1148C lea ecx,dword ptr ds:[ecx-0x73EB4E2F] ////
0079D099 9C pushfd
0079D09A E8 7BAA0200 call Main.007C7B1A
007C7B1A 874C24 44 xchg dword ptr ss:[esp+0x44],ecx /////
007C7B1E 68 299EF656 push 0x56F69E29
007C7B23 9C pushfd
007C7B24 FF7424 4C push dword ptr ss:[esp+0x4C] ; Main.00467DED
007C7B28 C2 5000 retn 0x50
问题目前就是这样了,不知道怎么让脚本在漫漫代码中定位到这些进行关键操作的代码 ,有试过下对代码层等的内存访问或者写入断点,都跑飞了。
如果有,写过相应脚本的大佬希望能指出,不胜感激。看了别人的成品脚本,也是到了如何定位这块代码过程中不甚很懂。 |