From 9286f776613450e3e486c93ec28a1cef849b74e0 Mon Sep 17 00:00:00 2001 From: yml2213 Date: Sun, 11 Oct 2026 22:27:29 +0800 Subject: [PATCH] =?UTF-8?q?docs(=E8=B4=A6=E6=9C=AC)+feat(=E7=A5=9E?= =?UTF-8?q?=E8=B0=95):=20=E5=AE=8C=E5=85=A8=E8=BF=98=E5=8E=9F=20XTEA=20?= =?UTF-8?q?=E5=AF=86=E9=92=A5=E6=9E=84=E9=80=A0=E7=AE=97=E6=B3=95=20(?= =?UTF-8?q?=E7=BA=AF=20Python=20=E5=A4=8D=E7=AE=97=E4=B8=8E=20Node=20?= =?UTF-8?q?=E9=80=90=E5=AD=97=E4=B8=80=E8=87=B4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 做了什么: - tdc_probe.js 神谕增强: 逐字追踪"某值首次出现的 PC"(__WP), DUMP_PC 支持记录多次命中 - PROGRESS.md 已知表新增 14-18 条: 密钥字构造算法 / 盐折叠 / 纯Python复算一致 / 运行时链路位置 / extract_xtea_key 正确性验证 为什么: - 用"运行时神谕 + 反汇编阅读"替代逐条模拟(打地鼠), 定位并读懂密钥构造 怎么验证(硬结果): - 密钥字算法(反汇编读出 + 运行时寄存器佐证): word = Σ ((charCodeAt(src,k) + off) & 0xFF) << (8k) 四个 (源串, 偏移) = ("IA_t",-8) ("9:%!",+49) ("nTLS",-9) ("7XYf",+3) - 运行时逐字首次出现: 7740/7526/7895/8852; 数组组装 @8886; 进XTEA @9030; 入口 @9109 - 纯 Python 复算 base=[1817655617,1381395306,1245924197,1767660346] + 折盐(855311->word0, 723726->word3) = [1818510928,1381395306,1245924197,1768384072] == extract_xtea_key ✅ --- har/1ms_dianxuan/PROGRESS.md | 5 +++++ tools/tdc_probe.js | 11 ++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/har/1ms_dianxuan/PROGRESS.md b/har/1ms_dianxuan/PROGRESS.md index d7b43ac..b83ee9e 100644 --- a/har/1ms_dianxuan/PROGRESS.md +++ b/har/1ms_dianxuan/PROGRESS.md @@ -43,6 +43,11 @@ | 11 | 密钥字**既不是立即数、也不是字面字符串**(无论明文、大端字节序列、base64 都不在 tdc.js/字节码里)| 立即数 1.3e9~1.9e9 区间为空;`ldFPRVkjJCKeigfH` 及其 base64 均搜不到 | 确证 | | 12 | 密钥数组在 XTEA 轮里通过**寄存器间接寻址**读取,且经闭包捕获传入 | 反汇编 `reg7[(sum>>>11)&3]`;`@09463 CREATE_CLOSURE target=@9109 caps=[r7=r8]` | 确证 | | 13 | 轮加盐**每次构建都不同**(但都是可见立即数)| 本构建 = `723726`(j==2) / `855311`(j==3);台账另一构建 = `2829068` / `328986` | 确证 | +| 14 | **密钥字的构造算法(已完全还原)**:`word = Σ ((charCodeAt(源串,k) + off_i) & 0xFF) << (8k)`,4 个源串各自一个**独立偏移常量**,常量是打包点的立即数 | 神谕二分 + DUMP_PC 取到源串;反汇编读出常量:
`("IA_t", -8)` `("9:%!", +49)` `("nTLS", -9)` `("7XYf", +3)` | 确证 | +| 15 | **有效密钥 = base 字 + 两个轮加盐** | `real[0]-base[0]=855311`、`real[3]-base[3]=723726`(XTEA 轮里的立即数) | 确证 | +| 16 | **纯 Python 可完整复算密钥,与 `extract_xtea_key` 逐字一致** | `base=[1817655617,1381395306,1245924197,1767660346]` → 折盐 → `[1818510928,1381395306,1245924197,1768384072]` == Node 结果 | 确证 | +| 17 | 密钥链路的运行时位置(神谕实测) | 逐字首次出现 PC:7740/7526/7895/8852(均 reg9);数组组装 @8886(reg7);进 XTEA 闭包 @9030 `CALL_FUNC[2]`;入口 @9109 | 确证 | +| 18 | `extract_xtea_key`(Node)本身正确 | 其密钥把 probe 的真实 collect 解成 `{"cd":[0,10,"top",[360,360],"MacIntel",1,"undefined?rand…` | 确证 | --- diff --git a/tools/tdc_probe.js b/tools/tdc_probe.js index f1db10f..b10b09d 100644 --- a/tools/tdc_probe.js +++ b/tools/tdc_probe.js @@ -91,6 +91,10 @@ function probeTdc(tdcFilePath, options = {}) { + "for(var i=0;i= 0) { - tdcCode = "window.__DPC=" + DUMP_PC + ";window.__DUMP=null;(function(){var _h=window.__H;" - + "window.__H=function(H,E){_h(H,E);if(H===window.__DPC&&!window.__DUMP){var o=[];" + tdcCode = "window.__DPC=" + DUMP_PC + ";window.__DUMP=[];(function(){var _h=window.__H;" + + "window.__H=function(H,E){_h(H,E);if(H===window.__DPC&&window.__DUMP.length<8){var o=[];" + "for(var i=0;i