做了什么: - 新增 tools/tdc_disasm.py: 纯 Python 提取 tdc.js 字节码数组 + 可达性 CFG 反汇编 * opcode 表由 VM 源码 AST 推导 (70 槽 / 58 handler, 操作数个数 = handler 内 z[H++] 次数) * 复刻 VM 内联的 base64 解码 + 游程展开 (含科学计数法常量), 无任何 JS 运行时 * 遍历根含 JUMP/JUMP_IF_TRUE/PUSH_TRY catch/CREATE_CLOSURE 闭包体 - tools/tdc_vm_disasm.js 降级为废弃 shim (转发到 Python 版) - TOOLCHAIN_REPORT.md 更新工具行与复验命令; tdc_sample.disasm.txt 用正确实现重新生成 为什么: - 旧线性反汇编对字节码里的数据区继续扫描会失步: 实测 73 处 UNKNOWN (16 处 >69 的 "不可能" opcode), 且未把闭包体当遍历根 -> 大半个程序不可达, 输出不可信 怎么验证: - .venv/bin/python tools/tdc_disasm.py tcaptcha/core_js/tdc_sample.js -> bytecode=45636 (与旧实现一致), 可达指令 26168, illegal opcodes: [] - 反汇编首次干净读出 XTEA 轮函数: PUSH_IMM 2654435769 / ADD / ... / SHR_UNSIGNED 11 / &3 并定位密钥数组在寄存器 7, 本构建轮加盐为 723726 / 855311 (均为立即数)
28 lines
1.3 KiB
JavaScript
28 lines
1.3 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* [已废弃] 旧 TDC VM 反汇编器 (线性扫描, 依赖 Node + Babel)
|
|
*
|
|
* 实测它有两个缺陷, 会产出**错误**的反汇编, 故已废弃:
|
|
* 1. opcode 表是手抄的, 而且对字节码里的**数据区**做线性扫描 —— 一旦扫进数据区就失步,
|
|
* 产出 73 处 UNKNOWN (其中 16 处是 >69 的"不可能" opcode);
|
|
* 2. 未把 CREATE_CLOSURE(57) 的闭包体 (target) 作为遍历根 —— 导致大半个程序不可达。
|
|
*
|
|
* 请改用**纯 Python** 的正确实现 (可达性 CFG 反汇编, 0 处非法 opcode):
|
|
* .venv/bin/python tools/tdc_disasm.py <tdc.js>
|
|
*
|
|
* 本文件仅保留为兼容入口: 直接转发给上面的 Python 工具。
|
|
*/
|
|
const { spawnSync } = require("child_process");
|
|
const path = require("path");
|
|
|
|
const tdcFile = process.argv[2] || "tcaptcha/core_js/tdc_sample.js";
|
|
const tool = path.join(__dirname, "tdc_disasm.py");
|
|
|
|
console.error("[deprecated] tools/tdc_vm_disasm.js 已废弃 -> 转发到 tools/tdc_disasm.py (纯 Python)");
|
|
const r = spawnSync("python3", [tool, tdcFile], { stdio: "inherit" });
|
|
if (r.error) {
|
|
console.error("无法启动 python3; 请直接运行: .venv/bin/python tools/tdc_disasm.py " + tdcFile);
|
|
process.exit(1);
|
|
}
|
|
process.exit(r.status == null ? 1 : r.status);
|