首页
社区
课程
招聘
寂寞轰炸:再次小窥 VMProtect 虚拟机
发表于: 2007-1-1 23:21 47443

寂寞轰炸:再次小窥 VMProtect 虚拟机

2007-1-1 23:21
47443

VMProtect 的虚拟机



最近被寂寞轰炸,元旦快完蛋了,分析一下 VMProtect吧


可能不准确,但是可以作为初级读本来了解这个保护



==========================


        Abstact


==========================



1 -        既然是 VM,就有自己的 CONTEXT,而 VMCONTEXT 是线程相关的(安全、可重入)


        每个未注册的线程进入 VM 会在 VM 的线程槽中用 ThreadID 注册一个槽


        然后用此槽号来访问 VMSEG_DATA 中对应的 VMCONTEXT



2 -        有一个主循环解码 OPCODE


        可以设断开发一个类似WKT DBGR的工具



3 -        类似于 VC PCODE 或者 MMX 指令


        所有数据(包括运算结果的符号)都通过堆栈传递



4 -        跟VM数据区交换的同一指令在 DispatchDescriptor 中有很多描述,比如vpop


        其中某些位指出了偏移量



5 -        运算指令总是结束后pushf


        这样在VM解码的过程中不会丢失符号



6 -        指令解释器的序列不同的文件不一样,但看起来指令的特征不会变(想象FLIRT)


        同一个VICTIM可以识别出来生成一个MAP来调试!这一点很重要!!!!



7 -        指令解释器的代码基本不变,但涉及立即数操作的


        会加入随机的解码算法,但应该可以根据首尾特征来判断虚拟指令



8 -        一些指令的 BYTE 立即数被扩展成了 WORD,但只利用 BYTE 位



9 -        VM 跟 x86 不对应,很多垃圾,也许我指分析到了最浅的一层


        我深刻地感到,也许还有VM中的VM?



==========================


        Example


==========================



很晕!以我加了一个混乱OEP的notepad.exe为例



!!!注记符是我起的,不要太在意,可以按浮点指令理解



进入VM的代码样式为:



        push        key0


        push        VMSEG_CODE//代码段


        jmp        VMP_MAIN



此例一开始堆栈环境为



[00000000]


[EDI]


[EFlags]


[ESI]


[EAX]


[EBP]


[EDX]


[ECX]


[EBX]


[EAX]


[VMSEG_CODE]


[key0]//这里为E95243D1



        vpop//这个指令是一个系列的,OPCODE & 3C 也就是111100为1的位表示在VMSEG_DATA中的偏移


        ...


        vpop//将上面的寄存器弹到VM CONTEXT中去



        vpush        B2C49D2C


        vadd//注意这个指令运算后pushfd,运算结果为9C16E0FD


        vpop//保存符号


        vpop//保存结果


        vpushw//压入0001


        vpushv//0001入栈C


        vpushv//9C16E0FD入栈B


        vpushv//9C16E0FD入栈A


        vshld//shld A,B,C,保存结果&符号


        vpop//保存符号



        ...好多



===============================


        List


===============================



我用猜的方法命名了一些指令,都以v开头,



后来有点规则混乱但是没有改,涉及到跟VMDATA传输的以vv开头



如果是求值操作结尾为pd/w/b,其中b可能被扩展成WORD样子push了



我也混乱了,不说了,这是一张表,详细的请看 idb



pcode_dispatch_table           dd offset vvpop


.vmp0:010174FD                                         


.vmp0:01017501                 dd offset vshr


.vmp0:01017505                 dd offset loc_10174EF


.vmp0:01017509                 dd offset loc_10174AD


.vmp0:0101750D                 dd offset vvpop         


.vmp0:01017511                 dd offset loc_10174D1


.vmp0:01017515                 dd offset vpopw


.vmp0:01017519                 dd offset vpushpb


.vmp0:0101751D                 dd offset vvpop         


.vmp0:01017521                 dd offset vpushvesp


.vmp0:01017525                 dd offset vpopcs


.vmp0:01017529                 dd offset vpushvesp


.vmp0:0101752D                 dd offset vvpop         


.vmp0:01017531                 dd offset vpushb2d


.vmp0:01017535                 dd offset loc_10174EF


.vmp0:01017539                 dd offset vpushimm32


.vmp0:0101753D                 dd offset vvpop         


.vmp0:01017541                 dd offset vnaw


.vmp0:01017545                 dd offset vaddp


.vmp0:01017549                 dd offset vpoppd


.vmp0:0101754D                 dd offset vvpop         


.vmp0:01017551                 dd offset vaddb


.vmp0:01017555                 dd offset vvpushpw


.vmp0:01017559                 dd offset vpopcs


.vmp0:0101755D                 dd offset vvpop         


.vmp0:01017561                 dd offset vshlb


.vmp0:01017565                 dd offset loc_10178FD


.vmp0:01017569                 dd offset vpushdwptr


.vmp0:0101756D                 dd offset vvpop         


.vmp0:01017571                 dd offset loc_10174AD


.vmp0:01017575                 dd offset vpushw


.vmp0:01017579                 dd offset vaddw


.vmp0:0101757D                 dd offset vvpop         


.vmp0:01017581                 dd offset vshld


.vmp0:01017585                 dd offset vsetesp


.vmp0:01017589                 dd offset vnna         


.vmp0:0101758D                 dd offset vvpop         


.vmp0:01017591                 dd offset vshr


.vmp0:01017595                 dd offset vvpushb


.vmp0:01017599                 dd offset vaddp


.vmp0:0101759D                 dd offset vvpop         


.vmp0:010175A1                 dd offset loc_1017400


.vmp0:010175A5                 dd offset vvpushpw


.vmp0:010175A9                 dd offset vpushimm32


.vmp0:010175AD                 dd offset vvpop         


.vmp0:010175B1                 dd offset vpushpd


.vmp0:010175B5                 dd offset vshlb


.vmp0:010175B9                 dd offset vpushw


.vmp0:010175BD                 dd offset vvpop         


.vmp0:010175C1                 dd offset vpushw2d


.vmp0:010175C5                 dd offset vshlw


.vmp0:010175C9                 dd offset loc_10174EF


.vmp0:010175CD                 dd offset vvpop         


.vmp0:010175D1                 dd offset vpushsp


.vmp0:010175D5                 dd offset vpushwi


.vmp0:010175D9                 dd offset vpushpw


.vmp0:010175DD                 dd offset vvpop         


.vmp0:010175E1                 dd offset vpushb2d


.vmp0:010175E5                 dd offset vnna         


.vmp0:010175E9                 dd offset vpopw


.vmp0:010175ED                 dd offset vvpop         


.vmp0:010175F1                 dd offset vpushvesp


.vmp0:010175F5                 dd offset vpoppd


.vmp0:010175F9                 dd offset vnaw


.vmp0:010175FD                 dd offset vvpush


.vmp0:01017601                 dd offset vvsetb


.vmp0:01017605                 dd offset vpushw2d


.vmp0:01017609                 dd offset vnnab


.vmp0:0101760D                 dd offset vvpush


.vmp0:01017611                 dd offset vhalt


.vmp0:01017615                 dd offset loc_101740C


.vmp0:01017619                 dd offset vpopcs


.vmp0:0101761D                 dd offset vvpush


.vmp0:01017621                 dd offset vpushpd


.vmp0:01017625                 dd offset vpushw2d


.vmp0:01017629                 dd offset vshlb


.vmp0:0101762D                 dd offset vvpush


.vmp0:01017631                 dd offset vshr


.vmp0:01017635                 dd offset vshl


.vmp0:01017639                 dd offset loc_10174D1


.vmp0:0101763D                 dd offset vvpush


.vmp0:01017641                 dd offset vpushpd


.vmp0:01017645                 dd offset loc_10174D1


.vmp0:01017649                 dd offset vpushwi


.vmp0:0101764D                 dd offset vvpush


.vmp0:01017651                 dd offset vpushw


.vmp0:01017655                 dd offset vpopsp


.vmp0:01017659                 dd offset vstob


.vmp0:0101765D                 dd offset vvpush


[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (62)
雪    币: 116
活跃值: (220)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
2
不懂,学习
2007-1-1 23:29
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
3
我也不懂,一起学习
2007-1-1 23:30
0
雪    币: 158
活跃值: (43)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
高深.慢慢学习..
2007-1-2 00:02
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谁懂的话解释一下
2007-1-2 00:37
0
雪    币: 229
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
完全不懂
2007-1-2 01:18
0
雪    币: 277
活跃值: (312)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
7
不懂 不学
2007-1-2 07:40
0
雪    币: 342
活跃值: (318)
能力值: ( LV12,RANK:740 )
在线值:
发帖
回帖
粉丝
8
forgot, xxx.rar...
学习.
2007-1-2 09:43
0
雪    币: 304
活跃值: (82)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
9
够xxx的了。
2007-1-2 10:01
0
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
10
等有精力再学习

to forgot,有本书
<Virtual Machines versatile platforms for systems and processes>牛得很,电工有E文版卖
2007-1-2 10:15
0
雪    币: 301
活跃值: (300)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
11
唉,看不懂,先收藏着吧
2007-1-2 10:20
0
雪    币: 51
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
完全不懂!学习!
2007-1-2 10:30
0
雪    币: 213
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
高深.有嚼头..
2007-1-2 10:54
0
雪    币: 427
活跃值: (412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
是否是最新版是否打开的全部选项,你就知道什么是BT了。  最新版VM最高保护程度下改进很大
2007-1-2 11:42
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
功能如此强大,精彩超乎想象
2007-1-2 11:52
0
雪    币: 216
活跃值: (379)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
16
有意思,好好研究下~
2007-1-2 12:15
0
雪    币: 440
活跃值: (907)
能力值: ( LV9,RANK:690 )
在线值:
发帖
回帖
粉丝
17
最初由 鸡蛋壳 发布
是否是最新版是否打开的全部选项,你就知道什么是BT了。 最新版VM最高保护程度下改进很大


神秘嘉宾
语出惊人
2007-1-2 12:37
0
雪    币: 254
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
18
似乎有个英文单词打错了
2007-1-2 12:51
0
雪    币: 214
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
19
支持做一个脱壳机
2007-1-2 15:10
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
20
深邃,有机会学习学习!
2007-1-2 15:20
0
雪    币: 1223
活跃值: (469)
能力值: (RANK:460 )
在线值:
发帖
回帖
粉丝
21
牛阿,学习阿
2007-1-2 21:59
0
雪    币: 214
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
22
Originally posted by girl
支持做一个脱壳机

这个猛
2007-1-4 18:12
0
雪    币: 213
活跃值: (96)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
23
2007-1-4 18:45
0
雪    币: 217
活跃值: (15)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
24
支持
2007-1-5 09:43
0
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
25
看了点,似乎就明白了这了点点:

貌似一条VM指令,如果分成N条离散地这里是X86 opcode(主要是堆栈opcode和运算opcode),那就可以吧一个VM_CALL解析成一个x86.opcode_call

一条VM指令如果又分成一层VM去解释.乃至于N层.那就捏了!

forgot在来一篇,如何"猜测"VM虚拟指令,也就是解析VM opcode.谁相信你是猜测.,偶扎就猜不来捏!
期待复杂地VM,偶不懂捏!

2007-1-5 10:19
0
游客
登录 | 注册 方可回帖
返回