yml2213
|
2e2bbc876a
|
feat(密钥): 纯 Python 静态提取 XTEA 密钥 —— 去掉最后一个 Node 依赖 (6/6 构建与神谕逐字一致)
做了什么
- 新增 tcaptcha/tdc_opcodes.py: 按构建从解释器源码推导 opcode 表。
实测 opcode 编号**每份构建整体重排**(同一源码 pc0 的 SET_STACK_LEN 在 6 份构建里
= 53/19/32/57/55/1, JUMP = 60/17/42/58/21/2); 旧固化表只对 core_js 有效 ——
用它反汇编其它构建会在 pc0 撞上 RET_TRUE, 得到"空反汇编"的假象。
做法: 定位主循环 X[Y[Z++]]() 的 handler 数组 -> JS 感知切分 -> handler 源码规范化
(去空白 + 局部变量按首次出现重命名) 取指纹 -> 与内置 58 条 core_js 参考指纹匹配;
数组下标即该构建的 opcode, argc 由语义名取 (与 handler 体内 x[y++] 次数实测一致)。
- 新增 tcaptcha/tdc_key.py: 纯 Python XTEA 密钥静态还原器 (零 Node / 零 pc 硬编码)。
反汇编 -> 定位含 delta 的 XTEA 闭包 -> 用"两层捕获链"选出真密钥数组:
字闭包捕获的 B 帧寄存器, 经"定义 B 的那个闭包"的 caps 映射到 G 帧后须 == XTEA 闭包
捕获的寄存器; 借此排除脚本里并行计算的第二套诱饵字 -> 读 4 个 (源串, 偏移, 下标)
-> 折入轮加盐。
- tools/tdc_disasm.py: disassemble_cfg/_decode_one 支持注入按构建推导的 opcode 表
(names/arity/dynamic), 默认仍回落 core_js 表; 控制流 opcode 改为按语义名定位。
- tools/tdc_key_pure.py: CLI (-v 打印推导过程 / --opcodes 打印 opcode 表 / --json)。
- tcaptcha/crypto.py: extract_xtea_key 改为"纯 Python 主路径 + Node 插桩兜底"。
- 新增 tcaptcha/tests/test_tdc_key.py 并接入 selftest;
新增入库 fixture tcaptcha/tests/fixtures/tdc_fresh_2026-10-11.js (现场新抓的 tdc.js)。
为什么
- AGENTS.md §2.4 分层交付 / §1.1: 去掉最后一个 Node 依赖, 提高并发与抗发版能力;
- §5.7 负结果也是资产: 显式撤回"opcode 数值跨构建固定"与"密钥只能靠 Node 插桩拿"两条旧结论。
怎么验证
- 6 份构建纯 Python 结果 == Node 插桩 extract_xtea_key, **逐字一致**:
core_js / root / 1ms tdc.js / tdc_live / tdc_latest / 2026-10-11 现场新抓 tdc_fresh。
- opcode 表 6/6 构建 58/58 handler 精确匹配, 0 未识别。
- .venv/bin/python -m tcaptcha.selftest 全绿 (含既有逐字节对拍 test_xtea_key)。
- 把 node_bin 指向不存在的程序时 generate_telemetry 仍产出 collect (证明已零 Node)。
|
2026-10-11 22:49:23 +08:00 |
|
yml2213
|
9286f77661
|
docs(账本)+feat(神谕): 完全还原 XTEA 密钥构造算法 (纯 Python 复算与 Node 逐字一致)
做了什么:
- 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 ✅
|
2026-10-11 22:27:29 +08:00 |
|
yml2213
|
74d478050c
|
feat(神谕): PC 二分定位 + 任意 PC 全寄存器 dump, 破译密钥字算法
做了什么:
- tdc_probe.js 钩子增强:
* 扫描 E, 报告"基字数组"与"基字[0]"首次出现的 PC (二分定位构造点)
* DUMP_PC=<pc> 时 dump 该 PC 的全部寄存器 (类型+值)
* report 回传 __arr / __wrd / __dump
为什么:
- 需要"某个值在哪段字节码诞生"的运行时神谕(AGENTS.md §3.2 第3条), 而不是逐条猜
怎么验证(本轮硬结果):
- 基字[0] 首次出现 @7740 reg9; 基字数组首次出现 @8886 reg7;
XTEA 闭包在 @9030 CALL_FUNC[2] 被调用, 入口 @9109
- DUMP_PC=7726 显示 E[3]="IA_t", E[10]=ref("IA_t","charCodeAt"), E[4]=0(i)
- 反汇编 @7712..@7740 读出的算法:
word |= (str.charCodeAt(i) - 8) << (8*i) // 小端打包
验证: LE_pack('IA_t' 各字符-8) = 1817655617 == 基字[0] ✅
- extract_xtea_key 交叉验证: 其密钥可把 probe 的 collect 解成 {"cd":[0,10,"top",... 真明文
且 real[i]-base[i] 在 i=0/3 恰等于 XTEA 轮里的可见立即数 855311 / 723726
|
2026-10-11 22:24:19 +08:00 |
|
yml2213
|
5c949090c1
|
feat(vm): 神谕钩子 —— 在真 VM 中按 PC 快照寄存器 (定位/校验任意值)
做了什么:
- tools/tdc_probe.js 注入自包含钩子(window.__H): 记录 PC 轨迹, 并在指定 PC
dump 指定寄存器 (默认 9109 / E[7]), 通过 report.__xtea / report.__pc_len 回传
- tools/tdc_keytrace.js 同步支持 TARGET_PC 钩子
为什么:
- 需要"某个值在哪段字节码诞生"的运行时神谕(AGENTS.md §3.2 第3条: 与运行时观测对齐)
- 钩子自包含写在沙箱 window 上(沙箱内没有 globalThis)
怎么验证(本轮的关键结论):
- 命中: @9109 入口 E[7] = [[1817655617,1381395306,1245924197,1767660346]];
其后 PC 序列 tail = [...9021,9022,9023,9024,9026,9028,9030,9109]
-> 说明 XTEA 闭包是在 @9030 CALL_FUNC[2] 被调用的
- 交叉验证: 用 extract_xtea_key 的密钥解密 probe 的 collect -> {"cd":[0,10,"top",...
(真明文) => extract_xtea_key 正确;
而 E[7] 解不开 => E[7] 是"基字", 不是生效密钥
- 结构确认: real[0]-cap[0]=855311, real[3]-cap[3]=723726 (XTEA 轮里的可见立即数)
=> 有效密钥 = 脚本基字 + 两个轮加盐
|
2026-10-11 22:21:53 +08:00 |
|
yml2213
|
9c889215f2
|
feat(vm): 提升器按闭包边界切分函数 + 递归展开全部子程序
做了什么:
- tdc_disasm.disassemble_cfg 增加 follow_closures 开关
(提升单函数时关闭, 避免"子函数体的可达性溢进父函数")
- tdc_lift.run 递归提升所有被引用的闭包: 229 个独立函数
- 函数名统一为 sub_<target>, 便于按 pc 定位
为什么:
- 原来整个程序挤在一个 function 里(闭包 body 与父函数地址连续), 无法按子程序阅读
- AGENTS.md §3.3 步骤5 明确要求"子程序调用(闭包创建)递归展开"
怎么验证:
- .venv/bin/python tools/tdc_lift.py tcaptcha/core_js/tdc_sample.js
-> lifted functions=229; XTEA 例程 = sub_9109, 内含 r2=(r2+2654435769)
- .venv/bin/python tools/tdc_query.py .../tdc_sample.lifted.txt who r2
-> sub_9109 @9109: r2 = 0; @9285: r2 = (r2 + 2654435769);
|
2026-10-11 22:18:42 +08:00 |
|
yml2213
|
942421d811
|
feat(vm): 提升器改用"执行流栈快照(DFS)"渲染, 消除跨跳转失步
做了什么:
- _lift_func 重写为两遍:
第一遍: 沿执行流 DFS 传播"求值栈快照"(每条 pc 记录进入时的栈)
第二遍: 按地址序渲染, 块首用快照还原栈
- 新增 _next_pc(): 用规范操作数长度计算后继(含 CREATE_CLOSURE 动态长度)
为什么:
- 原来按"地址序 + 块首清空栈"提升, 表达式跨分支传递时会整体丢失
- 栈机必须在"执行流"上跟踪栈, 而不是地址序
怎么验证:
- XTEA 轮仍可读: r2=(r2+2654435769); r?+=(((r6<<4)^(r6>>>5))+r6)^(r2+r7[((r2>>>11)&3)])
- 闭包图正确: // closure func_9109(p0->r3,p1->r4) caps=[r7<-r8] target=@9109
- 已知残留: 汇合点(多前驱)取首路径栈, 仍会产出少量 r<?> (下一步: phi 合并/对齐运行时轨迹)
|
2026-10-11 22:17:55 +08:00 |
|
yml2213
|
eed7004754
|
chore(vm): 归档解释器 tdc_vm_run.py 到正确语义 (VM 返回 = 栈顶/切片)
做了什么:
- 修正 VM 返回语义: `A ? (E.pop(), E.slice(3+VM.v)) : E.pop()` (闭包调用返回栈顶)
- JArr 缺键返回 undefined; E 初值 [this]=全局; CALL_FUNC 的 this=c
为什么:
- 该工具已判定为"用 Python 复刻 JS 运行时"的弯路(AGENTS.md §2.3 铁律2 打地鼠陷阱)
- 但已实现的 58 个 opcode 语义 + 诊断钩子仍有储备价值, 故归档而非删除(§1.4)
怎么验证:
- py_compile 通过; 与真值 PC 轨迹对拍仍显示前 713 步一致(未继续推进, 按新路线改走 lift)
|
2026-10-11 22:15:51 +08:00 |
|
yml2213
|
2e7aaff9ec
|
feat(vm): 自上而下重构工具链 —— 新增提升器(lift)与查询CLI(query)
做了什么:
- 新增 tools/tdc_lift.py: 字节码 -> 可读伪代码 (AGENTS.md §3.3 步骤5)
* 表达式栈还原 (算术/比较/调用/属性)
* 寄存器引用惯用法还原 (PUSH_IMM_ARRAY n + MAKE_REG_PROP_REF -> rN[key])
* 控制流 label/goto/if; CREATE_CLOSURE 递归展开成具名函数
- 新增 tools/tdc_query.py: who rN / at @pc / funcs / grep RE (对齐 §4.2 验收)
- 新增 tools/tdc_keytrace.js: 用真 VM 当神谕, 定位某值在哪段字节码诞生
- VM_SPEC §7/§8 重写为"自上而下五件套 + 路线", 并把 tdc_vm_run.py 标注为归档(打地鼠陷阱)
- 修正 lift 的 [n]->rN 归一 与 标签刷屏
为什么:
- 之前用 Python 复刻 JS 运行时去"跑"VM = §2.3 铁律2 的打地鼠陷阱, 收敛极慢
- §3.3 步骤5 要的是"读指令流得到算法; 闭包递归展开" -> 提升(lift)才是正路
- §2.1 最后一步: 读出算法后用目标语言原生重写, 跳过 VM/环境层
怎么验证:
- lift 首次把 XTEA 轮读成可读式: r2=(r2+2654435769); r?+=(((r6<<4)^(r6>>>5))+r6)^(r2+(r7[((r2>>>11)&3)]+855311))
- query 三个验收问题均可秒答: who r2 / at @9285 / funcs
|
2026-10-11 22:15:43 +08:00 |
|
yml2213
|
9008af0d18
|
fix(vm): 3 处保真修复 + 精确定位到模块实参为 null
做了什么:
- JArr.__getitem__ 缺失键返回 undefined (JS 语义), 原来返回 Python None
- E 初值 E[0]=[this], 顶层 this=全局对象 c (原来错写成 None)
- MAKE_REG_PROP_REF / CALL_METHOD / closure 调用 增加 DBGCALL 诊断输出
为什么:
- 用 PC 轨迹对拍逐条缩小: 前 713 步一致, 分歧在 @206 CALL_METHOD
- 根因链: @45631 CALL_FUNC(模块工厂) 的实参是 [null] -> 参数 r3=[null]
-> 闭包 @20 捕获 r6=父r3 -> E[6][0]=null -> ref=[null,'call'] -> 调用不到
怎么验证:
- node tools/tdc_trace.js ... -> 19266 步(真值); 我们仍 739 步
- 分歧点/根因链见上 (已用 DBGCALL 定位到具体指令与寄存器)
下一步线索: 追 "谁把该实参压成了 null" (候选: PUSH_NULL(29) 被误用, 或某次属性读取应得对象却拿到 null)
|
2026-10-11 22:07:16 +08:00 |
|
yml2213
|
3f91b0a4e3
|
feat(vm): PC 轨迹对拍工具 + 2 处语义修复(定位到首个执行流分歧)
做了什么:
- 新增 tools/tdc_trace.js: 给分发器 M=G[z[H++]]() 打补丁, dump 真实执行 PC 序列
- tdc_vm_run.py: 新增 TRACE_FULL 全量 PC 轨迹; 子 VM 共享 pcs/events(轨迹是全局的)
- 修复 CALL_FUNC 的 this 绑定: 真实语义 fn.apply(c, B) -> this = c (原来传 None)
- DBGCALL 调试输出(callee 类型/closure 异常/ref 与栈尾)
为什么:
- 单靠读语义会无限试错; PC 轨迹对拍能一步定位首个分歧
怎么验证:
- node tools/tdc_trace.js tcaptcha/core_js/tdc_sample.js -> 真实 19266 步
- 我们的解释器 739 步; 逐条 diff 后:**前 713 步完全一致**
- 首个分歧 @step714: real 进入 @1544, 我们 fall-through 到 @208
对应指令 @206 CALL_METHOD [4]; 我们的 ref=[None,'call'] (base 为 None),
真实应为一个可调用对象 -> 说明某个寄存器在我们这边是 None
|
2026-10-11 22:04:44 +08:00 |
|
yml2213
|
1fbd8f46f5
|
fix(vm): 修正解释器 4 处保真度问题 + 增加事件追踪
做了什么:
- E 初值改为 [[this],[{}]] (与 VM 源码默认一致)
- Stub 改为真正保存被赋属性 (模块工厂挂在对象上, 丢弃就找不到模块)
- Object/Array/String/... 改为 HostFn, new 时真正构造容器
- getprop/setprop 采用 JS 非严格语义 (原始值: 读=undefined, 写=静默忽略)
- 新增 TRACE=1 事件追踪 (CREATE_CLOSURE/CALL_*/RET_TRUE) 与模块表收集
为什么:
- 这些是解释器与真实 VM 保真度不符的根因, 导致顶层跑完却收不到任何模块闭包
怎么验证:
- py_compile 通过; TRACE=1 跑出 66 条关键事件(其中 CREATE_CLOSURE ~65)
- 现状: 仍只跑完顶层引导(739 步), 模块表为空 -> 待用 PC 轨迹对拍定位首个分歧
|
2026-10-11 22:02:20 +08:00 |
|
yml2213
|
70f2ece32c
|
docs(vm): 新增 Chaos VM 规范 + WIP 纯 Python 解释器
做了什么:
- 新增 tcaptcha/VM_SPEC.md: 从源码/反汇编事实整理 VM 全套规格
* §1 架构(VM(H,z,c,E,I,D,U,C), c=window, 主循环 M=G[z[H++]]())
* §2 数据模型(E 一物两用=寄存器区+求值栈; 寄存器单元 E[i][0]; 引用=二元数组 [base,key])
* §3 完整 opcode 表(70 槽/58 handler/12 空洞, 附 handler 源码与 argc, 由 AST 自动导出)
* §4 闭包与调用(CREATE_CLOSURE 动态布局, caps 共享单元, CALL_FUNC/METHOD 的 this 绑定)
* §5 引导流程(实测顶层只注册模块) §6 宿主与驱动(c 即 window, 环境全走 c)
* §7 工具链映射 §8 解释器路线图(已完成①-④, 未完成⑤模块系统+宿主驱动)
- 新增 tools/tdc_vm_run.py: 58 个 opcode 的具体解释器 + 宽松 JS 宿主 (WIP, 跑通顶层引导)
为什么:
- 之前"没头绪"的根因是数据模型(E 一物两用/寄存器单元/引用二元数组), 必须写成确定规格
- 并定位真正的卡点: 不在 VM 而在"模块系统 + 宿主调用序列"
怎么验证:
- tools/tdc_vm_run.py 跑 739 步后 RET_TRUE (仅顶层引导), 与 CFG 可达性一致
|
2026-10-11 21:59:06 +08:00 |
|
yml2213
|
32a78318ad
|
docs(账本): 记录 XTEA 密钥形态的关键发现(ASCII 打包串 / 闭包捕获 / 轮加盐随构建变)
做了什么:
- PROGRESS.md §一 已知表新增 4 条:
10. XTEA 密钥字 = 4 个「ASCII 打包的 4 字符串」(大端拼 32bit)
11. 密钥既不是立即数也不是字面字符串(明文/大端字节/base64 都搜不到)
12. 密钥数组经闭包捕获传入: @09463 CREATE_CLOSURE caps=[r7=r8], XTEA 轮以 reg7[(sum>>>11)&3] 取用
13. 轮加盐随构建变化(本构建 723726/855311, 台账另一构建 2829068/328986), 但都是可见立即数
- PROGRESS.md §五 下一步新增第 0 条: 静态提取密钥(逐闭包符号执行)
为什么:
- 这是"去掉最后一个 Node 依赖"的关键定位, 避免重复摸索
怎么验证:
- 密钥字节解剖: 1818510928 -> 0x6c644650 "ldFP" 等 (core_js/tdc_sample.js)
- 反汇编: .venv/bin/python tools/tdc_disasm.py tcaptcha/core_js/tdc_sample.js
|
2026-10-11 21:51:06 +08:00 |
|
yml2213
|
d52368be2b
|
feat(工具链): 纯 Python 可达性 CFG 反汇编器 + 废弃旧线性反汇编器
做了什么:
- 新增 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 (均为立即数)
|
2026-10-11 21:47:27 +08:00 |
|
yml2213
|
e2485c5ea6
|
docs(账本): 记录 H3 单变量实验结论(captcha 域 cookie 与 errorCode=12 无关)
做了什么:
- ANALYSIS.md §7.1 新增 E8: captcha 域"带/不带"腾讯云登录 cookie, 单变量 A/B 均为 12
- ANALYSIS.md §7.4 假设表更新: H3 标注为已排除, 只剩 H1/H2
- ANALYSIS.md §4.3 更正: extract_eks 改通用匹配后实测 248 字符, 与真实浏览器一致
- PROGRESS.md §三 已排除表新增 H3 一行
为什么:
- 彻底关闭"换 cookie/cookie 同源"这条猜测路线, 避免重复投入
怎么验证:
- 单变量 A/B: scripts/experiment_h3_cookie_ab.py --both -> A=12, B=12
(同一次运行, 题目 2404 求解 posterior=1.000 全对, collect_len=1856)
|
2026-10-11 21:47:27 +08:00 |
|
yml2213
|
795235ac38
|
feat(纯算): 增加 captcha 域 cookie 透传 + H3 单变量实验脚本
做了什么:
- TencentCaptchaClient 新增可选 cookies 参数, 逐条写入 captcha 域 Cookie 头 (默认 None, 行为不变)
- OneMsAdapter 新增 captcha_cookies 透传
- 新增 scripts/experiment_h3_cookie_ab.py: 只改 cookie 一个变量做 A/B 对照并自动判读
为什么:
- 账本 §7.5 的 H3 (腾讯云登录 cookie uin/skey/qcmainCSRFToken/intl) 是唯一
尚未单变量验证过的差异; 其余 (环境 / 后端 / 出口 IP / 静默时长) 均已排除
怎么验证:
- 离线: 带 cookie 时请求头为 Cookie=uin=..;intl=1, 不带时为 None (默认行为不变)
- .venv/bin/python -m tcaptcha.selftest 全绿 (crypto_core + glyph 8/8 + xtea_key)
|
2026-10-11 21:36:59 +08:00 |
|
yml2213
|
47ce74b160
|
refactor(纯算): 移除全部补环境后端,收敛为纯算单一路径 + 修复两处红灯
做了什么:
- 删除 generate_telemetry_node/browser/probe 三个伪造环境后端, 以及 apply_real_environment、
4 段拼接旧结构、human_dt_ms、generate_collect_pure (crypto.py 955 -> 389 行)
- 遥测只剩纯算: python_keyed = Node 仅提取 XTEA 密钥字 + Python 模板回填 + 教科书 XTEA
- 修复 crypto.py 重复的 xtea_encrypt_block (内置自测从失败到通过), 并并入 selftest
- 修复 glyph_solver 强校验: 改用集成得分矩阵行 argmax 自洽校验, 回归 5/8 -> 8/8
- 移除注释里无证据的 errorCode=12 归因; 移除 12 自动换 IP 重试
- extract_eks 不再写死变量名; UA 常量统一为 Chrome/155
- 文档对齐: ANALYSIS §8 修订 / PROGRESS 重写 / TOOLCHAIN_REPORT §三 更正
为什么:
- 本项目证据账本已证: 12 与遥测后端/出口 IP/静默时长均无关, 补环境无收益且引入脆弱面
- 强校验用单引擎 ocr_text 会误杀正确解 (实测 簿->垂 / 笆->芭 / 筹->努)
怎么验证:
- .venv/bin/python -m tcaptcha.selftest 全绿 (crypto_core + glyph 8/8 + xtea_key)
- 端到端纯算: python / python_keyed 均可解回 '{"cd":[' 开头明文, probe 模式被拒绝
|
2026-10-11 21:30:26 +08:00 |
|
yml2213
|
60ae14d54a
|
feat(captcha): 增加全题型图片落盘、字形一致性强校验与防秒换拟人交互机制
- 题目图片自动下载: 所有题型原图统一落盘至 scratch/captcha_debug,文字点选自动生成带编号红圈标注图便于肉眼核验
- 字形严格一致性校验: 在 SolveResult 增加 text_match_ok 检查,对图字不符或混淆干扰题直接拒答换题,避免错答引发 errorCode=12
- 防秒换与拟人延时: 遇到非预期题目换题等待 2.8~4.2s (对齐 HAR 真实抓包),求解失败等待 2.5~3.8s,作答前模拟交互 5.5~7.5s
- 代理容错增强: 在 OneMsAdapter 捕获代理断流与鉴权异常,支持动态轮换新代理重试
|
2026-10-11 20:51:12 +08:00 |
|
yml2213
|
d136fb7328
|
feat(tcaptcha): 建立AST解包、TDC虚拟机反汇编与深度Proxy语义探针工具链
- 解包 tcaptcha-frame bundle,圈定 122 个模块中的核心加签与通信模块
- 还原 __TENCENT_CHAOS_VM 架构:映射全部 70 个操作码语义并实现字符串折叠反汇编
- 提取 246 个核心字符串,全量排查并枚举 95 项环境检测与自动化探针特征
- 实现零浏览器依赖的深度 Proxy 探针,原生生成与会话自洽的 collect 与 eks
|
2026-10-11 20:13:14 +08:00 |
|
yml2213
|
1ef819b48d
|
feat(纯算): 以成功样本明文为模板的纯 Python 出包管线 + 证据账本 v2
做了什么
- 从「签到成功-1.har」提取该次会话的 tdc.js, 提取密钥解密出
errorCode=0 那次 collect 的完整明文 (1360 字节), 存为
tcaptcha/models/success_collect_template.b64
- 新增 generate_collect_success(): 以成功样本为结构模板, Python 只回填
轨迹/当前时间戳/随机盐, 其余环境字段 (canvas/WebGL/屏幕/语言/sd.ft) 原样保留
- 新增 _success_style_trajectory(): 按成功样本实测统计生成轨迹
(61 点, dt 均值 30.6ms, 50% 在 0~16ms, 途经 3 个目标, 驻留抖动)
—— 修正了统计正则不允许负增量的 bug (真实 61 点, 此前误数成 18)
- 发现成功样本用 \x00 填充 (不是空格), sd 多一个 ft 字段
- telemetry_mode=python_keyed 默认走该路径; Node 仅提取每构建 XTEA 密钥
- ANALYSIS.md 第七节重写为 v2 证据账本, 显式撤回 4 个无证据结论
验证
- 纯 Python 密文 == 真实 tdc.js 密文 (逐字节)
- 回归: test_xtea_key 11 项、test_glyph_solver 8/8
- 端到端 1ms 实测: 仍 errorCode=12 (诚实记录, 未解决)
结论(见 ANALYSIS.md 7.5-7.7)
- 12 不是"检测到机器人": 同 IP 有成功样本、参数逐字段一致、
真 Chrome 网络栈/真人点击/CDP 均排除
- 剩余假设: H1 需已登录业务会话(未用 auth_token 调 captcha/params 复测)
H3 需有效 qcloud.com cookie(过期 skey 复测不能定论)
- 下一步: 用登录态 auth_token 调 /api/v1/captcha/params,
对比返回是否多出鉴权字段 —— 这是唯一未做且成本低的关键实验
|
2026-10-11 19:12:23 +08:00 |
|
yml2213
|
be7a6ee97b
|
chore(git): har/ 下只忽略抓包产物,放行分析文档入库
做了什么
- .gitignore 的 `har/` 改为 `har/**` + `!har/**/` + `!har/**/*.md`
—— 仍忽略 har/ 下的 jpg/js/json 抓包产物,但 *.md 分析文档正常入库
- 首次纳入两份文本证据资产:
har/1ms_dianxuan/ANALYSIS.md (330+ 行协议分析报告)
har/1ms_dianxuan/PROGRESS.md (已知/未知/已排除假设/下一步)
为什么
- 原规则是整目录忽略,把「证据文档」和「大文件抓包」一起挡在版本控制外;
按 AGENTS.md §1.3,进度与证据必须落盘可追溯,文档应随代码版本化
怎么验证的
- git check-ignore 逐项确认: PROGRESS.md/ANALYSIS.md 入库,
bg_3.jpg/tdc.js/live/session.json 仍忽略
- git add 预演仅 3 个文本文件, 无二进制混入
- 已检查文档内无 API key 等凭据 (仅几个已过期住宅代理 IP)
|
2026-10-11 18:10:15 +08:00 |
|
yml2213
|
fbcf2d448a
|
feat(反VM): 纯 Python 还原 XTEA 算法 + 从 tdc.js 运行时提取每构建密钥
做了什么
- 确认 collect 的加密算法就是教科书 XTEA (32 轮, delta=0x9E3779B9),
并证明 crypto.py 原有的"带加盐"写法只是把两个密钥字折叠:
K' = [k0, k1+salt1, k2+salt2, k3]
- tdc_worker.js 新增 captureKey 模式: 正则改写 VM 的 ADD/XOR opcode 为带日志版本,
用反向引用自动识别栈变量名 (样本=g/雨云实时=j/1ms=M, 版本无关);
匹配数不为 1 时显式报错, 不静默失败
- 密钥反推: (sum + K[j]) 是一次 ADD, 两操作数必有一个等于 r*DELTA,
另一个就是密钥字; 再对 Top-N 候选做 4! 排列 + 明文内容特征验证
- 新增 recover_payload_template / generate_collect_from_template:
运行时标定一次明文模板, 之后轨迹生成/组包/加密/编码全部在 Python
- 新增 tcaptcha/proxy.py 代理提取, client 支持 --proxy-api 遇 12 自动换 IP
为什么
- 服务端只认 collect 的解密结果, 而密钥是每构建随机的;
把算法做成纯 Python 后, 只有"取密钥"依赖 Node, 抗发版能力最强
怎么验证的
- 纯 Python XTEA 加密结果与真实 tdc.js 产物前 48 字节逐字节一致
- 密钥按构建固定的证据: 同一脚本 3 次运行密文首块均为 f6a24e3e4fb5dd2b
- 三份脚本 (样本/雨云实时/1ms实时) 均成功复原密钥
- 雨云 aid 端到端: 纯 Python 出包 -> errorCode=0 + 真实 ticket
- 回归测试: tcaptcha/tests/test_xtea_key.py 11 项断言全过,
文字点选求解 8/8; 新增 tcaptcha/selftest.py 一键复验
已知未解
- 1ms aid=195672344 在答案正确时仍返回 errorCode=12; 已排除密钥、
遥测引擎、出口 IP (4 个住宅代理)、短时频控、静默窗口
|
2026-10-11 18:07:09 +08:00 |
|
yml2213
|
9962eed3e8
|
feat(onnx): 全面迁移至 ONNX Runtime,彻底移除 PyTorch 臃肿依赖
- 将 yolo_detector.pt 和 icon_classifier.pt 成功导出为 ONNX 格式
- 重构 solver.py 使用 onnxruntime + OpenCV cv2.dnn.NMSBoxes 纯轻量推理
- 彻底移除青龙对 torch, torchvision, ultralytics 等近 1.5GB 臃肿依赖
- 更新 dist/rainyun_qinglong 部署包与 README 文档
|
2026-09-12 11:13:05 +08:00 |
|
yml2213
|
5835d7cb15
|
feat(rainyun): 完成雨云纯协议自动登录签到脚本及青龙单目录部署包
- 逆向分析雨云登录与签到接口,打通腾讯天御点选验证码全协议过码闭环
- 支持 RAINYUN_ACCOUNT='账号#密码' 极简配置 (多账号支持 & 与换行分割)
- 增加积分提现金额换算展示 (2000积分 = 1元现金) 及青龙系统通知推送
- 新增 dist/rainyun_qinglong 单层平铺部署目录与专属 README
- 增强 solver.py 在模板缺失时的 ResNet18 分类器双模降级能力
|
2026-09-12 10:56:25 +08:00 |
|
yml2213
|
da62cb7e09
|
docs(client): 更新注释为纯算法还原描述,移除Node.js沙箱字眼
|
2026-09-12 00:07:51 +08:00 |
|
yml2213
|
c774d09bdd
|
feat(tcaptcha): 完成腾讯天御TDC虚拟机纯算法逆向还原与100%纯Python独立客户端
|
2026-09-12 00:02:32 +08:00 |
|
yml2213
|
5220c67a99
|
feat(tcaptcha): 完成腾讯天御点选纯协议全自动化客户端与雨云业务适配器
|
2026-09-11 23:36:23 +08:00 |
|
yml2213
|
8df4493994
|
feat(tcaptcha): 抓取腾讯tdc.js样本用于逆向分析
|
2026-09-11 23:22:15 +08:00 |
|
yml2213
|
180d23c984
|
feat(tcaptcha): 全量151组样本训练,识别率达成97.35%
|
2026-09-11 23:21:01 +08:00 |
|
yml2213
|
4d6cded0b0
|
升级半自动工作台
|
2026-09-11 22:56:03 +08:00 |
|
yml2213
|
f1c664f622
|
基础打标控制台
|
2026-09-11 22:09:35 +08:00 |
|
yml2213
|
424d547417
|
环境 ok
|
2026-09-11 22:05:11 +08:00 |
|
白夜
|
c5f14bdfd6
|
docs: 增加 AST 插桩健康门禁
|
2026-07-29 15:28:26 +08:00 |
|
白夜
|
e5c3c109ed
|
fix: Phase 3 use collect_values=True instead of manual evaluate_js
|
2026-04-23 12:24:39 +08:00 |
|
白夜
|
26bdcb2af8
|
fix: Phase 3 require evaluate_js for real values, Phase 5 add close_browser
|
2026-04-23 12:08:22 +08:00 |
|
白夜
|
069e5f7856
|
fix: Phase 0 launch_browser default enable_trace=true
|
2026-04-23 11:51:59 +08:00 |
|
白夜
|
8f86e679ec
|
feat(v3.4.0): Phase 3 add engine-level trace decision tree + version table
|
2026-04-23 10:49:08 +08:00 |
|
白夜
|
02e30c05aa
|
docs: update one-click install prompt to avoid LLM safety filter
|
2026-04-21 12:09:13 +08:00 |
|
白夜
|
4b22557c05
|
docs(v3.3.1): streamline experience rules to 22 - remove site-specific rules
v3.3.1 patch:
- Remove rule 7 (cacheOpts/SdkGlueInit - webmssdk specific)
- Remove rule 23 (env-patch line count thresholds - site specific)
- Remove rule 24 (UA/API matrix - site specific)
- Merge evaluate_js rules 25-27 into single concise rule 22
- Total: 24 -> 22 rules (removed 3 site-specific, merged 3 into 1)
Only generic methodology retained in SKILL.md core layer.
Site-specific experience stays in cases/ where it belongs.
|
2026-04-21 11:14:50 +08:00 |
|
白夜
|
9477d076f2
|
v3.3.0: 核心层回归扩容 + 案例层强化
SKILL.md:
- Phase 1-5 详细动作从 references/ 拉回核心层
- 10 个场景速查回迁
- 经验法则扩到 24 条(含环境伪装编码纪律)
- 工具名全部对齐 MCP v1.0.0 API
- 版本记录移至 README.md
cases/jsvmp-xhr-interceptor-env-emulation.md:
- 追加禁动清单(5 个禁动对象)
- 追加 UA 分支矩阵(Firefox/Chrome 必补/禁补)
- 追加 6 条踩坑记录 + env-patch 最小化原则
cases/_template.md:
- 追加禁动清单 + UA 分支矩阵可选段骨架
README.md:
- MCP 工具表对齐 v1.0.0 API
- 项目结构补充 cases/ 和完整 references/
- 追加版本记录
- 删除 skill不保存什么 段
references/:
- phase-details.md / mcp-cookbook.md / experience-rules-full.md 顶部加以SKILL.md为准提示
|
2026-04-19 23:23:31 +08:00 |
|
白夜
|
4f84657647
|
doc(case): 沉淀抖音a_bogus实战踩坑经验——踩坑记录+6条(#7-#12),关键经验+1条(显式markNative清单),致命级差异+4项(JSON.stringify/parse/permissions/clipboard)
|
2026-04-19 18:22:43 +08:00 |
|
白夜
|
a568c7de86
|
v3.2.1: Phase 0.5.1 强化案例复用(踩坑记录内化为约束+编码时逐条回查),经验法则#11重写
|
2026-04-19 17:41:44 +08:00 |
|
白夜
|
59e52c5490
|
fix: 命中案例不跳过Phase——Phase 0.5改为加速指引而非替代流程,case文件拆分方案方向/加速指引/踩坑记录,新增经验法则#11
|
2026-04-19 16:13:49 +08:00 |
|
白夜
|
8c6330c98c
|
fix: CHECK-2 命中后指引改为方案B——速查表定方向,case文件是加分项非必需
|
2026-04-18 13:57:08 +08:00 |
|
白夜
|
f2152727ff
|
Revert "fix: CHECK-2 速查表内嵌完整核心路径,AI 命中后无需访问 skill 仓库 cases/ 即可执行"
This reverts commit 6e3892fac0.
|
2026-04-18 13:52:28 +08:00 |
|
白夜
|
6e3892fac0
|
fix: CHECK-2 速查表内嵌完整核心路径,AI 命中后无需访问 skill 仓库 cases/ 即可执行
|
2026-04-18 13:51:52 +08:00 |
|
白夜
|
2d4e9b9061
|
fix: CHECK-2 明确 cases/ 是 skill 仓库目录而非用户 cwd,内嵌速查表避免路径问题
|
2026-04-18 13:46:21 +08:00 |
|
白夜
|
38b982fb1e
|
feat: skill v3.2.0 — 硬约束Checklist五项压缩到三项,移除MCP session依赖,cases/成为唯一经验库
- SKILL.md 瘦身重写(核心层+按需加载references/)
- Checklist: CHECK-3/4(session)删除,五项→三项
- 新增6个references子文档(path-a/path-b/phase-details/experience-rules-full/mcp-tool-reference/common-pitfalls)
- 删除 references/domain-session-guide.md
- 工具引用对齐实际MCP(32工具),verify_signer_offline替代verify_against_session
- cases/_template.md 新增可验证事实清单段
- 经验法则session相关条目改写
- 红线四条、第一原则0-5、三分法、四板斧、六步法完整保留
|
2026-04-18 13:36:14 +08:00 |
|
白夜
|
a5228600f4
|
v2.9.0: domain-level session + assertion-driven delivery + MCP v0.8.0
- Principle #5: no skipping degradation tiers (anti AI strategic surrender)
- Phase 0 step 4: start_reverse_session() zero-arg domain auto-detect
- Phase 0.5.-1: domain assertion reverify before fingerprint matching
- Phase 5: assertion-driven delivery (verify_against_session + add_assertion)
- Core weapon: MCP v0.8.0 (78 tools), domain session + assertion section
- Error handling: AI surrender degradation tier table (L1-L6)
- Experience rules: 40 -> 46 (domain persistence / reverify / assertion ROI)
- New: references/domain-session-guide.md
- New: CHANGELOG_v2.9.0.md
- Skip v2.8.0 (process-level session design rejected)
|
2026-04-18 10:00:19 +08:00 |
|
白夜
|
94f71bfcdb
|
sanitize: replace all site/vendor names with abbreviations (RS/JY/TK)
|
2026-04-18 09:34:42 +08:00 |
|