首页
社区
课程
招聘
[转帖]脱VMProtect方法
发表于: 2010-4-16 19:35 7374

[转帖]脱VMProtect方法

2010-4-16 19:35
7374
VMProtect - CRC/Inlines by SunBeam
Hello, reversers.

Am currently trying to inline a VMProtect target and from what I could see, VMProtect uses two tricks. One is a hash (or DWORD value) of the main code sections of the protected application (along with its own code), and two, the ASProtect trick - CreateFileMapping + MapViewOfFile. Detailing what I did with observations, maybe it will help get this to its end :-)

TEST 1:

a. get application, make a copy, hex edit copy in such a way that I changed last byte from 00 to 01; saved, launched, error, corrupted

Wanted to see if changing the byte in real-time does the trick. So:

b. opened application in Olly, found last byte, changed from 01 to 00; ran app, error, corrupted

Therefore, it must be making an image of the file on the disk. Known methods - ReadFile, CreateFileMapping + MapViewOfFile. Since VMProtect is tricky, decided to break on end of each API. Ran app, result:

7C809561 C2 1800 RETN 18 // CreateFileMappingA < break

->> 0012F6BC 007FF83A RETURN to pclaw.007FF83A from pclaw.007FD391 (yeah, guess you know the target now, hehe)

7C80B9C1 C2 1400 RETN 14 // MapViewOfFile

->> 0012F6C0 007FF83A RETURN to pclaw.007FF83A from pclaw.007FD391

As you can see, returns to same "wrapper" ;-)

So, pushed this further a little bit. Time to find out the parameters for those two APIs, since the custard doesn't let me change 01 to 00 in the mapped copy T_T..

0012F6C0 007FF83A /CALL to MapViewOfFile from pclaw.007FF835
0012F6C4 00000104 |hMapObject = 00000104
0012F6C8 00000004 |AccessMode = FILE_MAP_READ
0012F6CC 00000000 |OffsetHigh = 0
0012F6D0 00000000 |OffsetLow = 0
0012F6D4 00000000 \MapSize = 0

That's why :-) Same trick as with ASProtect -> 4th parameter is FILE_MAP_READ. Let's trick the custard with 01 (FILE_MAP_COPY). Mapping done, EAX = 1010000. Scrolled to end of map, found my byte, changed to 00.

Ran.. Success :-)

Continuing in a bit with other tests ;-)  

根据上面文章的指点,我ctrl+G查找VirtualProtect,查到如下代码,下断
7C801ACE                                         90                        nop
7C801ACF                                         90                        nop
7C801AD0 kernel32.VirtualProtect                 8BFF                      mov edi,edi
7C801AD2                                         55                        push ebp
7C801AD3                                         8BEC                      mov ebp,esp
7C801AD5                                         FF75 14                   push dword ptr ss:[ebp+14]
7C801AD8                                         FF75 10                   push dword ptr ss:[ebp+10]
7C801ADB                                         FF75 0C                   push dword ptr ss:[ebp+C]
7C801ADE                                         FF75 08                   push dword ptr ss:[ebp+8]
7C801AE1                                         6A FF                     push -1
7C801AE3                                         E8 75FFFFFF               call kernel32.VirtualProtectEx
7C801AE8                                         5D                        pop ebp
7C801AE9                                         C2 1000                   retn 10
7C801AEC                                         90                        nop
7C801AED                                         90                        nop
7C801AEE                                         90                        nop
7C801AEF                                         90                        nop
7C801AF0                                         90                        nop
7C801AF1 kernel32.LoadLibraryExW                 6A 34                     push 34
7C801AF3                                         68 58E0807C               push kernel32.7C80E
058

ctrl+G查找time,得到如下代码
77C1AE82                                       ^\E9 C4FEFFFF               jmp msvcrt.77C1AD4B
77C1AE87                                         CC                        int3
77C1AE88                                         CC                        int3
77C1AE89                                         CC                        int3
77C1AE8A                                         CC                        int3
77C1AE8B                                         CC                        int3
77C1AE8C msvcrt.mktime                           8BFF                      mov edi,edi
77C1AE8E                                         55                        push ebp
77C1AE8F                                         8BEC                      mov ebp,esp
77C1AE91                                         8B45 08                   mov eax,dword ptr ss:[ebp+8]
77C1AE94                                         6A 01                     push 1
77C1AE96                                         E8 29FEFFFF               call msvcrt.77C1ACC4
77C1AE9B                                         59                        pop ecx
77C1AE9C                                         5D                        pop ebp
77C1AE9D                                         C3                        retn
77C1AE9E                                         CC                        int3
77C1AE9F                                         CC                        int3
77C1AEA0                                         CC                        int3
77C1AEA1                                         CC                        int3
77C1AEA2                                         CC                        int3
77C1AEA3 msvcrt.time                             8BFF                      mov edi,edi
77C1AEA5                                         55                        push ebp
77C1AEA6                                         8BEC                      mov ebp,esp
77C1AEA8                                         51                        push ecx
77C1AEA9                                         51                        push ecx
77C1AEAA                                         8D45 F8                   lea eax,dword ptr ss:[ebp-8]
77C1AEAD                                         50                        push eax
77C1AEAE                                         FF15 4812BE77             call dword ptr ds:[<&KERNEL32.GetSystemTimeAsFileTime>; kernel32.GetSystemTimeAsFileTime
77C1AEB4                                         8B45 F8                   mov eax,dword ptr ss:[ebp-8]
请问怎么改一下可以去掉时间验证呢

[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 2242
活跃值: (488)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
2
楼主好执着阿
2010-4-16 22:47
0
雪    币: 35
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
每次都看见你们脱VMP  就是没看见一个人写指令还原 如果这么简单就脱掉 难不成我的《甲壳2》之模拟CPU更胜一筹?
2010-4-16 23:40
0
雪    币: 1521
活跃值: (914)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这是过vmp crc校验,做Inlinepatch的方法,类似aspr做Inlinepatch方法~
2010-4-17 00:20
0
雪    币: 125
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我弄不了那家伙。太强了,对我等菜鸟来说
2010-4-22 00:47
0
游客
登录 | 注册 方可回帖
返回
//