-
-
[原创] 使用AI还原腾讯JSVMP-某点小说站 TENCENT_CHAOS_VM 逆向笔记
-
发表于: 5天前 746
-
某点小说站 TENCENT_CHAOS_VM 逆向笔记
仅供学习交流,请勿用于非法用途
一、背景
某点小说站使用腾讯混淆 VM 生成 w_tsfp 参数进行请求校验:
- 携带有效参数 → 正常响应
- 缺失或无效 → 请求被拦截
二、难点分析
2.1 反调试
常规的 debugger 断点,hook 掉即可。
2.2 字节码编码
VM 只有 92 个 opcode(0-91),但直接 Base64 解码原始字节码后,发现存在大于 92 的值,对不上号。
原因:字节码并非直接存储,而是经过 VarInt + ZigZag 编码。需要先解码这层编码,才能得到真正的 opcode 序列。
2.3 控制流平坦化
VM 内部大量使用:
- 基于寄存器的动态跳转
- switch-case 分发结构
- 无法通过静态分析直接还原逻辑
2.4 信息丢失
浏览器断点调试存在:
- 异步执行导致的上下文丢失
- 大量重复指令难以追踪
- 关键变量值无法完整捕获
解决方案:Chrome Override + 插桩注入
三、突破过程
3.1 获取运行时字节码
1 | 原始 Base64 → VarInt 解码 → ZigZag 解码 → 字节码数组 |
3.2 编写反汇编器
识别 opcode 模式,主要类型:
- 控制流:JMP、JCOND
- 数据:LOAD、MOV、GET/SET
- 运算:算术、逻辑、比较
- 调用:CALL、NEW
3.3 插桩追踪
在 VM 解释器循环中注入日志:
1 2 | // 伪代码示意console.log(`PC:${pc} OP:${op} REG:${JSON.stringify(regs)}`); |
3.4 还原核心逻辑
通过 trace 日志定位关键代码段:
- 指纹采集
- 异常检测
- 加密输出
四、核心发现
4.1 数据结构
{
"loadts": 1234567890123,
"timestamp": 1234567890123,
"指纹": "32位hex",
"abnormal": "32位hex",
"校验和": "32位hex"
}
4.2 关键字段
| 字段 | 校验 | 说明 |
|---|---|---|
| abnormal | ✅ | 核心检测字段,必须全 0 |
4.3 abnormal 检测机制
检测 39 项自动化工具特征,每项对应 1 个 bit:
Selenium 系列
1 2 | selenium-evaluate, _selenium, calledSelenium,__selenium_evaluate, __selenium_unwrapped, _Selenium_IDE_Recorder |
WebDriver 系列
1 2 3 | webdriver, __webdriver_evaluate, __webdriver_unwrapped,__webdriver_script_fn, __webdriverFunc, __$webdriverAsyncExecutor,__driver_evaluate, _WEBDRIVER_ELEM_CACHE |
PhantomJS 系列
1 | PhantomJS, _phantom, callPhantom, __phantomas, Phantomas |
其他
1 2 | nightmare, __nightmare, domAutomationController,domAutomation, $chrome_asyncScriptInfo, CefSharp, ... |
检测原理:
typeof window[property] !== "undefined"→ 置位
4.4 加密方式
- 算法:RC4
- 输出:Base64 编码
五、AI 辅助逆向
本次分析中,AI 发挥了重要作用:
5.1 字节码分析
输入:原始字节码片段 + opcode 猜测
输出:结构化的反汇编结果
AI 能够:
- 识别常见的 VM 指令模式
- 推断操作数含义
- 生成可读的伪代码注释
5.2 控制流重建
输入:执行 trace 日志
输出:还原后的逻辑结构
AI 能够:
- 识别循环边界
- 还原条件分支
- 合并平坦化的代码块
5.3 自动生成插桩
输入:描述需要 hook 的位置和目的
输出:完整的插桩 JS 代码
示例对话:
1 2 | 我:在 PC=449 处打印 r9 寄存器的值AI:生成完整的 Override 代码 |
5.4 算法识别
输入:核心函数的字节码或伪代码
输出:识别为 RC4 / MD5 / CRC32 等标准算法
AI 能够对比已知实现,快速确认算法类型和参数顺序。
5.5 效率对比
| 环节 | 传统方式 | AI 辅助 |
|---|---|---|
| 反汇编器 | 2-3 天 | 数小时 |
| 控制流分析 | 1 周+ | 1-2 天 |
| 算法识别 | 依赖经验 | 分钟级 |
| 插桩代码 | 反复调试 | 一次生成 |
5.6 使用建议
- 分段喂给 AI:一次给太多字节码效果差
- 提供上下文:告诉 AI 这是什么类型的 VM
- 交叉验证:AI 结果需要实际运行验证
- 迭代优化:根据运行结果修正 AI 的理解
六、经验总结
- 反调试不是难点,常规 hook 即可
- VM 混淆的关键是获取运行时状态,不要死磕静态分析
- 插桩是利器,Chrome Override 配合 AI 生成代码效率极高
- 找到核心字段比完全逆向更重要,本例中
abnormal是关键 - AI 是放大器,能显著提升效率,但核心判断仍需人工
本文仅记录学习过程,请遵守相关法律法规
最后于 5天前
被执着的猫编辑
,原因:
赞赏
他的文章
赞赏
雪币:
留言: