首页
社区
课程
招聘
[原创] 使用AI还原腾讯JSVMP-某点小说站 TENCENT_CHAOS_VM 逆向笔记
发表于: 5天前 746

[原创] 使用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 使用建议

  1. 分段喂给 AI:一次给太多字节码效果差
  2. 提供上下文:告诉 AI 这是什么类型的 VM
  3. 交叉验证:AI 结果需要实际运行验证
  4. 迭代优化:根据运行结果修正 AI 的理解

六、经验总结

  1. 反调试不是难点,常规 hook 即可
  2. VM 混淆的关键是获取运行时状态,不要死磕静态分析
  3. 插桩是利器,Chrome Override 配合 AI 生成代码效率极高
  4. 找到核心字段比完全逆向更重要,本例中 abnormal 是关键
  5. AI 是放大器,能显著提升效率,但核心判断仍需人工

本文仅记录学习过程,请遵守相关法律法规


传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 5天前 被执着的猫编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回