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

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

2007-1-1 23:21
47316

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
.vmp0:01017661                 dd offset vvpushb
.vmp0:01017665                 dd offset vpopcs
.vmp0:01017669                 dd offset vpushdwptr
.vmp0:0101766D                 dd offset vvpush
.vmp0:01017671                 dd offset vshlb
.vmp0:01017675                 dd offset vpushpb
.vmp0:01017679                 dd offset loc_10174EF
.vmp0:0101767D                 dd offset vvpush
.vmp0:01017681                 dd offset vpushsp
.vmp0:01017685                 dd offset vaddw
.vmp0:01017689                 dd offset vpopsp
.vmp0:0101768D                 dd offset vvpush
.vmp0:01017691                 dd offset loc_10174AD
.vmp0:01017695                 dd offset vvpushpw
.vmp0:01017699                 dd offset loc_101740C
.vmp0:0101769D                 dd offset vvpush
.vmp0:010176A1                 dd offset loc_10174AD
.vmp0:010176A5                 dd offset vpoppw
.vmp0:010176A9                 dd offset vstopb
.vmp0:010176AD                 dd offset vvpush
.vmp0:010176B1                 dd offset vd2w
.vmp0:010176B5                 dd offset loc_10174EF
.vmp0:010176B9                 dd offset vvpushb
.vmp0:010176BD                 dd offset vvpush
.vmp0:010176C1                 dd offset vd2w
.vmp0:010176C5                 dd offset vpushpd
.vmp0:010176C9                 dd offset vpushsp
.vmp0:010176CD                 dd offset vvpush
.vmp0:010176D1                 dd offset vaddb
.vmp0:010176D5                 dd offset vpushimm32
.vmp0:010176D9                 dd offset vhalt
.vmp0:010176DD                 dd offset vvpush
.vmp0:010176E1                 dd offset vpushpb
.vmp0:010176E5                 dd offset loc_10174D1
.vmp0:010176E9                 dd offset vstob
.vmp0:010176ED                 dd offset vvpush
.vmp0:010176F1                 dd offset vhalt
.vmp0:010176F5                 dd offset vpushpw
.vmp0:010176F9                 dd offset vpopw
.vmp0:010176FD                 dd offset loc_10174AD
.vmp0:01017701                 dd offset vpushwi
.vmp0:01017705                 dd offset vnna         
.vmp0:01017709                 dd offset vstob
.vmp0:0101770D                 dd offset vshlb
.vmp0:01017711                 dd offset loc_101740C
.vmp0:01017715                 dd offset vpushw2d
.vmp0:01017719                 dd offset vshl
.vmp0:0101771D                 dd offset vvpushb
.vmp0:01017721                 dd offset vpushw2d
.vmp0:01017725                 dd offset vpushsp
.vmp0:01017729                 dd offset vpushpd
.vmp0:0101772D                 dd offset vnaw
.vmp0:01017731                 dd offset vpushdwptr
.vmp0:01017735                 dd offset vpushw
.vmp0:01017739                 dd offset vpopcs
.vmp0:0101773D                 dd offset loc_101740C
.vmp0:01017741                 dd offset vshlb
.vmp0:01017745                 dd offset vshld
.vmp0:01017749                 dd offset loc_1017400
.vmp0:0101774D                 dd offset loc_10174AD
.vmp0:01017751                 dd offset vpopcs
.vmp0:01017755                 dd offset loc_10178FD
.vmp0:01017759                 dd offset vpushw2d
.vmp0:0101775D                 dd offset vnna         
.vmp0:01017761                 dd offset loc_101740C
.vmp0:01017765                 dd offset vpushpb
.vmp0:01017769                 dd offset vd2w
.vmp0:0101776D                 dd offset vsetesp
.vmp0:01017771                 dd offset vhalt
.vmp0:01017775                 dd offset loc_10174AD
.vmp0:01017779                 dd offset vnnab
.vmp0:0101777D                 dd offset vshlw
.vmp0:01017781                 dd offset vpushsp
.vmp0:01017785                 dd offset loc_1017400
.vmp0:01017789                 dd offset vd2w
.vmp0:0101778D                 dd offset vnnab
.vmp0:01017791                 dd offset vd2w
.vmp0:01017795                 dd offset vpopsp
.vmp0:01017799                 dd offset vpushsp
.vmp0:0101779D                 dd offset loc_10174EF
.vmp0:010177A1                 dd offset loc_10174AD
.vmp0:010177A5                 dd offset vpushwi
.vmp0:010177A9                 dd offset vstopb
.vmp0:010177AD                 dd offset vhalt
.vmp0:010177B1                 dd offset vaddp
.vmp0:010177B5                 dd offset vpushvesp
.vmp0:010177B9                 dd offset vpushwi
.vmp0:010177BD                 dd offset vvpushb
.vmp0:010177C1                 dd offset vpushpd
.vmp0:010177C5                 dd offset vpopsp
.vmp0:010177C9                 dd offset loc_1017400
.vmp0:010177CD                 dd offset vaddp
.vmp0:010177D1                 dd offset loc_10174D1
.vmp0:010177D5                 dd offset vnnab
.vmp0:010177D9                 dd offset vpoppd
.vmp0:010177DD                 dd offset vshr
.vmp0:010177E1                 dd offset vpushpb
.vmp0:010177E5                 dd offset vaddb
.vmp0:010177E9                 dd offset vpushdwptr
.vmp0:010177ED                 dd offset vpushdwptr
.vmp0:010177F1                 dd offset vstob
.vmp0:010177F5                 dd offset loc_10174EF
.vmp0:010177F9                 dd offset vpushpw
.vmp0:010177FD                 dd offset vshr
.vmp0:01017801                 dd offset vpushpw
.vmp0:01017805                 dd offset vshlb
.vmp0:01017809                 dd offset vpushwi
.vmp0:0101780D                 dd offset vsetesp
.vmp0:01017811                 dd offset vpushb2d
.vmp0:01017815                 dd offset vpopsp
.vmp0:01017819                 dd offset vaddw
.vmp0:0101781D                 dd offset vaddp
.vmp0:01017821                 dd offset vpopsp
.vmp0:01017825                 dd offset vnnab
.vmp0:01017829                 dd offset vshld
.vmp0:0101782D                 dd offset vshl
.vmp0:01017831                 dd offset loc_10174AD
.vmp0:01017835                 dd offset vpushimm32
.vmp0:01017839                 dd offset vpopcs
.vmp0:0101783D                 dd offset vpopcs
.vmp0:01017841                 dd offset vnna         
.vmp0:01017845                 dd offset vpushimm32
.vmp0:01017849                 dd offset vvpushb
.vmp0:0101784D                 dd offset vhalt
.vmp0:01017851                 dd offset loc_1017400
.vmp0:01017855                 dd offset loc_10174EF
.vmp0:01017859                 dd offset vpopcs
.vmp0:0101785D                 dd offset vvpushpw
.vmp0:01017861                 dd offset vstopb
.vmp0:01017865                 dd offset vpushw
.vmp0:01017869                 dd offset vpopcs
.vmp0:0101786D                 dd offset vshlw
.vmp0:01017871                 dd offset vnna         
.vmp0:01017875                 dd offset vaddw
.vmp0:01017879                 dd offset vaddb
.vmp0:0101787D                 dd offset vnna         
.vmp0:01017881                 dd offset vstopb
.vmp0:01017885                 dd offset vvsetb
.vmp0:01017889                 dd offset vshlw
.vmp0:0101788D                 dd offset vnaw
.vmp0:01017891                 dd offset vstopb
.vmp0:01017895                 dd offset vpushpb
.vmp0:01017899                 dd offset vpopsp
.vmp0:0101789D                 dd offset vnaw
.vmp0:010178A1                 dd offset vnnab
.vmp0:010178A5                 dd offset vshld
.vmp0:010178A9                 dd offset vpushvesp
.vmp0:010178AD                 dd offset vpushimm32
.vmp0:010178B1                 dd offset vaddb
.vmp0:010178B5                 dd offset vpushvesp
.vmp0:010178B9                 dd offset vaddb
.vmp0:010178BD                 dd offset vhalt
.vmp0:010178C1                 dd offset vstopb
.vmp0:010178C5                 dd offset vnaw
.vmp0:010178C9                 dd offset vpushsp
.vmp0:010178CD                 dd offset vsetesp
.vmp0:010178D1                 dd offset vshl
.vmp0:010178D5                 dd offset vpopw
.vmp0:010178D9                 dd offset vshld
.vmp0:010178DD                 dd offset vpoppd
.vmp0:010178E1                 dd offset vnnab
.vmp0:010178E5                 dd offset vpoppw
.vmp0:010178E9                 dd offset vshld
.vmp0:010178ED                 dd offset vaddb
.vmp0:010178F1                 dd offset vshr
.vmp0:010178F5                 dd offset vpushimm32
.vmp0:010178F9                 dd offset vstob

也许啊

forgot/iPB


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 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
活跃值: (224)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
16
有意思,好好研究下~
2007-1-2 12:15
0
雪    币: 440
活跃值: (822)
能力值: ( 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
游客
登录 | 注册 方可回帖
返回
//