首页
社区
课程
招聘
[原创]VMP之我见
发表于: 2025-8-12 12:00 17848

[原创]VMP之我见

2025-8-12 12:00
17848

一、个人对于VMP的理解

1、VMP在被保护代码的地址处将原bytecode抽走,并进入到自己的解释器中解释执行自定义的bytecode(虚拟bytecode)。

2、既然是解释执行虚拟bytecode,始终就应该围绕着取指--译码--执行,这个流程。

3、进入解释器,首先要找到2块最重要的内存,也可以理解为2个数组——虚拟bytecode数组和虚拟reg数组。

4、对取指--译码--执行的细化:

(1)取指:取操作码和操作数

(1.1)、虚拟PC =虚拟bytecode数组首地址+ bytecode_index*bytecode_type(虚拟PC的更新可以分为更新下标和更新指针——更新下标:先通过bytecode数组首地址+ bytecode_index*bytecode_type得到PC,再进行取指并通过instruction_length更新bytecode_index;更新指针:直接通过PC取指,取指后通过instruction_length直接更新PC)。

(1.2)、通过虚拟PC取出操作码和操作数(此过程可以在Handler内,也可以在Handler外)。

(2)译码:

(2.1)、通过操作码找到对应的Handler。

(2.2)、通过操作数(虚拟reg数组下标)找到对应的虚拟reg。

(2.3)、通过真实的指令对虚拟reg的行为进行模拟。

(3)执行:将结果赋值给虚拟reg。


二、根据取指--译码--执行的原理(其它的细节不去赘述),对5款VMP解释器的vm_add进行分析(本文都是静态分析,若有疏漏请指点):

1、lib_Easy.so     ARM架构


(1)取指:取操作码和操作数

(1.1)、虚拟PC =虚拟bytecode数组首地址+ bytecode_index*bytecode_type:

                                

        此处X5为虚拟PC

                                    

                                    

                                    

        此处X8为虚拟PC

                    

(1.2)、通过虚拟PC取出操作码和操作数:


                                

此处X8为操作码1


        此处X9为操作码2

                                

                                

此处

W9为操作数1

W10为操作数2

W11为操作数3

                

(2)译码:

(2.1)、通过操作码找到对应的Handler:

                                  

                                    

         此处X8为Handler_xxx_reg1_reg2地址


         

 此处X8为Handler_vm_add地址


(2.2)、通过操作数(虚拟reg数组下标)找到对应的虚拟reg:

                                  

此处

通过操作数1(W9)找到VM_REG1

通过操作数2(W10)找到VM_REG2

通过操作数3(W11)找到VM_REG3


(2.3)、通过真实的指令对虚拟reg的行为进行模拟:

    

此处ADD X9, X10, X9 即X9= VM_REG1 + VM_REG2


(3)执行:将结果赋值给虚拟reg:

此处VM_REG3 = X9。


    

总结:此虚拟机在Handler外取操作码1(X8),通过X8找到Handler_xxx_reg1_reg2,在Handler_xxx_reg1_reg2内取操作码2(X9),通过X9找到Handler_vm_add;在Handler内取操作码X9,通过操作码X9找到下一个Handler,并在Handler内更新PC,PC=PC+4(instruction_length为4)。


2、libsgmainso-6.7.250421.so ARM架构

地址0x000000000017E1D8为vm_add的Handler。

(1)取指:取操作码和操作数

(1.1)、虚拟PC =虚拟bytecode数组首地址+ bytecode_index*bytecode_type:

在地址0x000000000017E19C处X21为虚拟PC

(1.2)、通过虚拟PC取出操作码和操作数:

在地址0x000000000017E1A0处W0为操作码

在地址0x000000000017E1D8处W11为操作数1

在地址0x000000000017E1E0处W12为操作数2

在地址0x000000000017E1EC处W16为操作数3

 

(2)译码:

(2.1)、通过操作码找到对应的Handler:

在地址0x000000000017E1A4处通过X1找到对应的handler

(2.2)、通过操作数(虚拟reg数组下标)找到对应的虚拟reg:

在地址0x000000000017E1DC处通过操作数1找到VM_REG1

在地址0x000000000017E1E4处通过操作数2找到VM_REG2

在地址0x000000000017E1F0处通过操作数3找到VM_REG3

(2.3)、通过真实的指令对虚拟reg的行为进行模拟:

在地址0x000000000017E1E8处ADD X15, X13, X14即

X15 = VM_REG1 + VM_REG2

(3)执行:将结果赋值给虚拟reg:

在地址0x000000000017E1F0处VM_REG3 = X15 。

总结:此虚拟机第一次在Handler外取操作码,在Handler内取操作数;在Handler内地址0x000000000017E1F4处取出操作码W17,准备通过W17找到下一个Handler,并在地址0x000000000017E1F4同时更新PC,PC=PC+0x10(instruction_length为0x10)。


3、libmtguard.so    ARM架构

地址0x0000000000138BA4开始向后都是vm_add的Handler。

(1)取指:取操作码和操作数

(1.1)、虚拟PC =虚拟bytecode数组首地址+ bytecode_index*bytecode_type:

在地址0x000000000013A5A4处X24为虚拟PC(bytecode_index为0)


冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

收藏
点赞 ・301
打赏
分享
最新回复 (164)
雪    币: 1849
活跃值: (2993)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2 楼
站在巨人的jb上学vm
2025-8-12 13:35
0
雪    币: 3235
活跃值: (6337)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3 楼
666
2025-8-12 13:36
0
雪    币: 930
活跃值: (5422)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4 楼
站在巨人的jb上学vm
2025-8-12 13:50
0
雪    币: 378
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5 楼
站在巨人的jb上学vm
2025-8-12 14:02
0
雪    币: 1986
活跃值: (4862)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6 楼
1
2025-8-12 14:11
0
雪    币: 7377
活跃值: (7605)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7 楼
66
2025-8-12 14:51
0
雪    币: 411
活跃值: (991)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8 楼
站在巨人的jb上学vm
2025-8-12 14:51
0
雪    币: 4
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9 楼
666
2025-8-12 14:55
0
雪    币: 144
活跃值: (2738)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10 楼
666
2025-8-12 14:55
0
雪    币: 2769
活跃值: (3986)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11 楼
666
2025-8-12 14:57
0
雪    币: 319
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12 楼
vmp还原难度大,如果单纯只是算法还原没多大难度
2025-8-12 15:02
0
雪    币: 4
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13 楼
111
2025-8-12 15:04
0
雪    币: 7
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
14 楼
111111
2025-8-12 15:16
0
雪    币: 178
活跃值: (1484)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15 楼
111
2025-8-12 15:21
0
雪    币: 200
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
16 楼
66666
2025-8-12 15:54
0
雪    币: 1049
活跃值: (1869)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17 楼
6666666666666
2025-8-12 16:18
0
雪    币: 0
活跃值: (445)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18 楼
111
2025-8-12 16:47
0
雪    币: 6
活跃值: (5949)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19 楼
支持啊
2025-8-12 17:21
0
雪    币: 158
活跃值: (5791)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20 楼
支持!!!
2025-8-12 17:24
0
雪    币: 6
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
21 楼
大佬,yyds
2025-8-12 17:48
0
雪    币: 2790
活跃值: (7141)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
22 楼
感谢分享
2025-8-12 18:05
0
雪    币: 342
活跃值: (400)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23 楼
66
2025-8-12 18:12
0
雪    币: 34
活跃值: (726)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
24 楼
66
2025-8-12 19:15
0
雪    币: 18
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
25 楼
6
2025-8-12 19:25
0
游客
登录 | 注册 方可回帖
返回