#!/usr/bin/env python # -*- coding: utf-8 -*- """ 腾讯天御 TDC 混沌 VM —— **纯 Python** XTEA 密钥提取 CLI (零 Node / 零 JS 运行时)。 用法: .venv/bin/python tools/tdc_key_pure.py [tdc.js] # 默认 core_js 样本 .venv/bin/python tools/tdc_key_pure.py -v har/.../tdc.js # 打印推导过程 .venv/bin/python tools/tdc_key_pure.py --opcodes tdc.js # 顺带打印按构建推导的 opcode 表 实现见 `tcaptcha/tdc_key.py` (定位算法) 与 `tcaptcha/tdc_opcodes.py` (按构建推导操作码表)。 """ from __future__ import annotations import argparse import json import os import sys ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) if ROOT not in sys.path: sys.path.insert(0, ROOT) from tcaptcha.tdc_key import extract_xtea_key_pure # noqa: E402 def main() -> int: ap = argparse.ArgumentParser(description="纯 Python 从 tdc.js 提取 XTEA 密钥") ap.add_argument("path", nargs="?", default="tcaptcha/core_js/tdc_sample.js") ap.add_argument("-v", "--verbose", action="store_true", help="打印密钥构造过程") ap.add_argument("--opcodes", action="store_true", help="打印按构建推导的 opcode 表") ap.add_argument("--json", action="store_true", help="以 JSON 输出") args = ap.parse_args() js = open(args.path, encoding="utf-8", errors="replace").read() if args.opcodes: from tcaptcha.tdc_opcodes import derive_opcode_table names, arity, dynamic, diag = derive_opcode_table(js) print("handlers=%d dynamic=%s" % (diag["handler_count"], sorted(dynamic))) for op in sorted(names): print(" %3d %-18s arity=%s" % (op, names[op], "dyn" if op in dynamic else arity.get(op, 0))) print() report = extract_xtea_key_pure(js, verbose=args.verbose) if args.json: print(json.dumps(report, ensure_ascii=False)) else: print("base = %s" % report["base"]) print("salts = %s" % report["salts"]) print("key = %s" % report["key"]) return 0 if __name__ == "__main__": raise SystemExit(main())