吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4325|回复: 52
收起左侧

[Web逆向] Web逆向之VMP还原全流程

  [复制链接]
lichuntian00 发表于 2025-6-22 22:22
某歌邮箱注册参数f.req 还原过程。
trace不说了,试试自实现反编译器还原VMP吧!

注册参数如下:
image.png

返回位置如下:
image.png

虚拟机解释器如下:

虚拟机引擎

虚拟机引擎


开始分析VMP结构:

一、VMP指令集
image.png

请求首页,302跳转下发js-challenge页面,有加密配置参数,里面包含指令集字符串(图片所示),很好拿到,后续调用atob解密,并 &255保留低8位,得到字节数组形式的指令集

二、虚拟机上下文分析

虚拟机上下文

虚拟机上下文


这是分析vmp之后提取出来的虚拟机上下文,Z是虚拟寄存器集合,一共512个
其中关键的几个寄存器有,
36号PC寄存器,
336号内层虚拟机PC寄存器,
184号轮密钥种子寄存器
280  115 509  234 147  44 136 511 210 471 这些寄存器存放生成加密参数所需上下文
关键虚拟机函数有:

操作寄存器函数

操作寄存器函数


N函数,写入寄存器函数
image.png

y函数 ,读取寄存器值
image.png

C函数,从虚拟机字节码中读取指令并解码复杂指令集为不同的指令类型,分发给B8解密指令

image.png
B8函数,读取指令并根据参数判断是否密钥变换表,使用当前字节块的轮密钥对指令进行解密

image.png
hJ函数,生成8字节解密表,用于取指之后,对指令进行异或解密

三、虚拟机执行逻辑分析


1.先从PC寄存器取字节码索引,然后同步到内层虚拟机的PC寄存器,然后调用C函数解码
image.png

2.C函数将指令解码为长短指令等复杂指令集,函数体一共有5个分支,分别对应
1.(w | 48) == w 分支 往寄存器中存值
2.(w - 5 | 5) >= w && (w + 4 & 43) < w分支  生成整数值
3.(w >> 1 & 12) < 12 && w + 6 >> 4 >= 3分支  处理变长操作码  先读取1字节,判断高位是否为1,扩展为长指令
4.w + 5 >> 3 == 1 分支 将寄存器的值变为闭包变量

第5分支

第5分支

5.(w + 7 ^ 27) < w && (w - 6 ^ 9) >= w 分支  操作码读取  读取8位并开启密钥变换,或者读取低7位,左移2位组成9位操作码

3.C函数解码完成之后,下发给B8函数,按照C的解码规则来读取指令,详情如下:

B8

B8


首先从36 PC寄存器取出指定位数,同时判断是否超出索引
判断现在解密的位数属于第几组解密块,如果是新的解密块,需要调用hj更新轮密钥变换表
对取到的字节和当前轮的轮密钥进行异或解密
计算已经解密的字节,并向前推进对应位数,对齐到字节最低位,提取结果,并更新PC寄存器值
B8返回操作码,并根据高位判断是否为长指令,如果是长指令需要扩展为对应的操作码

取handler

取handler


4.C返回对应的操作码之后,调用y函数从寄存器取操作码对应的handler,
不同的操作码对应不同的handler,利用handler执行操作码,操作数是基于操作码计算得到的

5.每执行完一轮操作码之后,进行检测。然后跳出循环执行下一个取指解码操作

完整流程是:取索引下标(利用PC)————解码(C函数)————取指(B8)————执行(跳转到对应handler)————检测(js文件被我处理过,移除了反调试和检测函数)

四、操作码分析
1.生成数值型操作码
image.png

操作码 24  生成4字节数值

操作码66

操作码66


操作码66,生成1字节数值
image.png

操作码105 ,生成双字节数值
不一一列举
这些操作码的作用都是生成对应字节数值,并存储到寄存器

2.生成字符串型操作码

操作码304

操作码304


操作码304 生成字符串  (调试的时候忘了截图!!)
可以看出来操作数是基于操作码计算得到的  

3.函数调用型操作码

操作码302

操作码302


操作码302  进行函数调用

4.属性访问型操作码

操作码495

操作码495


操作码495 访问浏览器对象下的属性

另外,
- **操作码122**:生成`eval`函数调用。
- **操作码149、220、446**:处理数组操作(增大数组`register_280`)。
- **操作码265、495**:对象属性赋值。
- **操作码319**:生成数组。
- **操作码477**:创建新对象

五、编写反编译器
分析完了,开始写反编译器,流程如下:

1.初始化节点
image.png

2.创建空AST
image.png

3.模拟虚拟机执行环境


4.加载base64解码后的指令
image.png

5.指令处理循环  读取操作码  处理不同的操作码    解码操作码语义

解码操作码语义

解码操作码语义


6. 类型推断生成ast 生成不同类型节点  根据值类型生成对应AST节点
image.png

7.ast生成  根据操作类型创建对应的AST节点   将节点添加到程序体  
image.png

六、输出虚拟化之前的js代码
image.png

一个变种白盒AES,一个变异的base64

web端协议参数生成

协议

协议


app端webview参数生成

app

app
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png

检测函数

检测函数

免费评分

参与人数 25吾爱币 +22 热心值 +24 收起 理由
dandelion2sunny + 1 + 1 我很赞同!
Leaf08 + 1 我很赞同!
chuling01 + 1 我很赞同!
qinwap + 1 + 1 我很赞同!
hxw0204 + 1 + 1 热心回复!
搁浅233 + 1 鼓励转贴优秀软件安全工具和文档!
fengbolee + 2 + 1 用心讨论,共获提升!
zzdong123 + 1 + 1 用心讨论,共获提升!
mtouyao + 1 + 1 谢谢@Thanks!
Rummy + 1 + 1 用心讨论,共获提升!
allspark + 1 + 1 用心讨论,共获提升!
laozhang4201 + 1 + 1 谢谢@Thanks!
ravi + 1 + 1 用心讨论,共获提升!
muzili520 + 1 + 1 我很赞同!
0ling + 1 我很赞同!
melooon + 1 + 1 我很赞同!
lwGoodChinese + 1 + 1 用心讨论,共获提升!
zoomzoomblood + 1 用心讨论,共获提升!
zhaoyf18 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
杨辣子 + 1 + 1 谢谢@Thanks!
外酥内嫩 + 1 + 1 直接还原vmp太强了
#sky# + 1 + 1 热心回复!
scz + 1 + 1 谢谢分享
qqycra + 1 + 1 用心讨论,共获提升!
helian147 + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| lichuntian00 发表于 2025-6-24 13:52
xiaoweigege 发表于 2025-6-23 09:41
反编译这块的逻辑有点一笔带过,希望博主可以具体讲讲怎么利用 ast 编写反编译的代码。

分析操作码可以得到操作码的类型,调原来的操作码handler动态生成结果。
然后先构建左值,左值可以自定义,构建右值,根据操作码确定不同的节点类型,节点值调原来的操作码函数,然后把生成的整个完整表达式注入ast。
qqycra 发表于 2025-6-23 07:25
YIUA 发表于 2025-6-23 08:38
latecomer 发表于 2025-6-23 09:15
YIUA 发表于 2025-6-23 08:38
大佬,可以加好友带带我吗

顶楼上,同求
xiaoweigege 发表于 2025-6-23 09:41
反编译这块的逻辑有点一笔带过,希望博主可以具体讲讲怎么利用 ast 编写反编译的代码。
FlyPan 发表于 2025-6-23 10:39
大佬牛波一
mscsky 发表于 2025-6-23 11:53
这么硬核的吗
外酥内嫩 发表于 2025-6-23 13:19
大佬太强了,还原它肯定研究了很久吧
Hmily 发表于 2025-6-23 14:11
@lichuntian00 底部多了几张图是不是文章插丢了?
wangzl1234 发表于 2025-6-23 15:00

大佬牛波一
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-7-20 21:45

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表