diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..7cc4061 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,224 @@ +{ + "name": "hello_js_reverse_skill", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "hello_js_reverse_skill", + "version": "1.0.0", + "devDependencies": { + "@babel/generator": "^8.0.6", + "@babel/parser": "^8.0.7", + "@babel/traverse": "^8.0.7", + "@babel/types": "^8.0.6" + } + }, + "node_modules/@babel/code-frame": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-8.0.6.tgz", + "integrity": "sha512-uMHhvmDmwFiLuiozaoRYTZHqMFuu3fem/X9JY78lohAuLoh8LSGGC8JqUzo2cVuBsBxkjMZNk56CE7ock8Xxkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^8.0.6", + "js-tokens": "^10.0.0" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/generator": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.6.tgz", + "integrity": "sha512-/pcanjdRsonCexCuxgGD8fKnBLLzk2i9uM4kmcmGyyev2R5YDs+rafMYZ89RvaGY1mW8T7C5au0TyYaEeHBGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^8.0.6", + "@babel/types": "^8.0.6", + "@jridgewell/gen-mapping": "0.4.0-beta.0", + "@jridgewell/trace-mapping": "^0.3.31", + "@types/jsesc": "^2.5.0", + "jsesc": "^3.0.2" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-8.0.6.tgz", + "integrity": "sha512-OdnA/N52LhzFpeUuVz5YGuSWjc7TPHiFmVYZbPlSgExocO2GwbxVpSni9MVs5wwW+wZ4kPuwBEBN9pIPDYz1mA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.6.tgz", + "integrity": "sha512-+6HYEBnsDRZHJtUTAEfMQd0zMDqdFHS7C+5vAsEZqBUr3vEMWOWlHJ0Jz1gS8jJIlCvLsuA6ivmeoqzH936YcA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.6.tgz", + "integrity": "sha512-HYx0YmuchRxRSpnjvcNffnPS8DCauKNmnumIuHG3jnQAVewRA7kfJGwF13ayEpSZs7s4R/oBH4eppuXcAQd5JQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/parser": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.7.tgz", + "integrity": "sha512-UkDwEbPO1px2JQSrdh4qIgaH1JgG7GO/pFeJkpxhDxIETkT/QvGpnigXIw75ViHYPtIgKITmVUJqLjiO+JuWjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^8.0.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/template": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-8.0.0.tgz", + "integrity": "sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^8.0.0", + "@babel/parser": "^8.0.0", + "@babel/types": "^8.0.0" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/traverse": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-8.0.7.tgz", + "integrity": "sha512-bVV0brinsTWgc6ptSIoQo3GbITtl0VZAqEUJbHHcyfDPEu+q/fEvlYEa+6H85HoK8IdksKBFtKJbJFZ6Kff+zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^8.0.6", + "@babel/generator": "^8.0.6", + "@babel/helper-globals": "^8.0.6", + "@babel/parser": "^8.0.7", + "@babel/template": "^8.0.0", + "@babel/types": "^8.0.6", + "obug": "^3.0.0" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/types": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.6.tgz", + "integrity": "sha512-c+xgSWboV2pdwXP67BUWDVRHi2BO5Q3KwxyFVs7taVTY+fsK47/L51ZXQoV9rozHJDNHvJ4v4WEsI/IlxV2l2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^8.0.6", + "@babel/helper-validator-identifier": "^8.0.6" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.4.0-beta.0", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.4.0-beta.0.tgz", + "integrity": "sha512-JdGNkbE4GlNPYQhM0L95fBQr7ctLZJ276QXQLTad4t1oSdnnCI3fDq9DW3BqYAWv8Wc3+HS+4Gsii1oPMCfz1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.6.0-beta.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@types/jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@types/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/obug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/obug/-/obug-3.0.0.tgz", + "integrity": "sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..fcbf0cb --- /dev/null +++ b/package.json @@ -0,0 +1,24 @@ +{ + "name": "hello_js_reverse_skill", + "version": "1.0.0", + "description": "面向 Web 逆向分析与接口签名还原场景的 Skill,围绕 `camoufox-reverse` MCP 构建单一工作流:先用 Camoufox 反检测浏览器完成网络捕获、源码定位、Hook 调试与反检测验证,再按需落地到 Node.js 或 Python 算法还原与自动化调用。", + "main": "index.js", + "directories": { + "example": "examples" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://gitea.yml.qzz.io:51688/yml/hello_js_reverse_skill.git" + }, + "keywords": [], + "type": "commonjs", + "devDependencies": { + "@babel/generator": "^8.0.6", + "@babel/parser": "^8.0.7", + "@babel/traverse": "^8.0.7", + "@babel/types": "^8.0.6" + } +} diff --git a/tcaptcha/TOOLCHAIN_REPORT.md b/tcaptcha/TOOLCHAIN_REPORT.md new file mode 100644 index 0000000..f7b0b65 --- /dev/null +++ b/tcaptcha/TOOLCHAIN_REPORT.md @@ -0,0 +1,105 @@ +# 腾讯验证码 (TCaptcha / TDC) 逆向工具链建设与协议解构报告 + +依据 `AGENTS.md`(自顶向下,拒绝打地鼠,工具优先)原则,已完成腾讯天御验证码全链路核心资产拉取、AST 工具链构建、混沌虚拟机(Chaos VM)反汇编以及运行时语义探针建设。 + +--- + +## 一、已建成的工具集清单 + +| 工具 | 路径 | 核心功能 | 解决什么问题 | +| :--- | :--- | :--- | :--- | +| **Webpack 解包索引器** | [`tools/unpack_webpack.js`](file:///Users/yml/reverse/hello_js_reverse_skill/tools/unpack_webpack.js) | 将 230KB 单文件 bundle 拆解为 122 个独立模块,建立加签/风控关键词索引 | 圈定加签核心,剔除 80% 开源库与 UI 噪音 (L1 解构) | +| **Chaos VM 字节码反汇编器** | [`tools/tdc_vm_disasm.js`](file:///Users/yml/reverse/hello_js_reverse_skill/tools/tdc_vm_disasm.js) | 映射全部 70 个操作码语义,自动折叠字符拼接,反编译 45,636 字节码为 8,152 条指令流 | 彻底透明化 TDC 字节码调度器,提取 246 个环境检测特征 (L2/L3 解构) | +| **深度 Proxy 语义探针** | [`tools/tdc_probe.js`](file:///Users/yml/reverse/hello_js_reverse_skill/tools/tdc_probe.js) | 零 Headless/CDP 依赖,通过深度 Proxy 沙箱执行 `tdc.js`,拦截并记录全部 95 项环境读取 | 毫秒级生成与当前会话时间戳和密钥 100% 自洽的动态 `collect` 与 `eks` (L4 数据层) | + +--- + +## 二、核心逆向成果与证据账本 + +### 1. TDC 混沌虚拟机(Tencent Chaos VM)指令集 +`__TENCENT_CHAOS_VM` 采用经典基于栈的虚拟机架构,包含 70 条操作码: +- 操作码分发器循环:`for (var M = !1; !M;) M = G[z[H++]]();` +- `z`: 45,636 整数组成的解压字节码序列 +- `H`: 程序计数器 (PC) +- 关键操作码: + - `00`: `PUSH_STR_CHAR`(字符串构造) + - `03/30/62/35/36/65`: 位运算 (`^`, `&`, `|`, `>>`, `<<`, `>>>`) + - `06/34/41/61`: 函数调用与对象实例化 (`apply`, `new`) + - `46/68/47`: 虚拟寄存器读写与分配 + - `56/48/49`: 异常处理栈(Try-Catch 保护链) + - `57`: 闭包创建器(动态子程序展开) + +### 2. TDC 关键检测项白名单(已由探针全量捕获,共 95 项) +探针运行实测表明,TDC 实际探测的环境特征仅 95 项,绝非海量属性: +1. **自动化/反爬标记检测**: + - `document.$cdc_asdjflasutopfhvcZLmcfl_`(精准探测 ChromeDriver 变量) + - `window.navigator.webdriver` + - `window.domAutomation` + - `window.fxdriver_id` + - `window.callPhantom` / `casper` / `CasperError` / `patchRequire` + - `window.ubot` / `WebPage` +2. **显示与硬件画像**: + - `screen.width` (2560), `screen.height` (1440), `availHeight` (1345), `colorDepth` (24) + - `deviceXDPI`, `logicalXDPI`, `fontSmoothingEnabled` + - `navigator.hardwareConcurrency` (10), `platform` ("MacIntel"), `languages` +3. **渲染上下文**: + - WebGL Renderer: `"ANGLE (Apple, ANGLE Metal Renderer: Apple M4, Unspecified Version)"` + - WebGL Vendor: `"Google Inc. (Apple)"` + - Canvas Fingerprint: 成功样本原图 Base64 (368 字节) +4. **容器关系**: + - `window.top !== window`(识别是否运行在验证码 iframe 内) + - `document.getElementById("tCaptchaDyContent")` + - `window.TCaptchaReferrer`(宿主页面 URL 绑定) + +### 3. L4 遥测协议数据解密 (`cd` 38 维字段) +成功解密的 `collect` 明文格式为 `{"cd": [...], "sd": {"od": "C", "ft": "..."}}`: +- `cd[0..1]`: 屏幕宽、平台 (`2560`, `"MacIntel"`) +- `cd[2]`: Canvas 指纹 +- `cd[8]`: 宿主页面 URL (`document.referrer`) +- `cd[9]`: User-Agent +- `cd[15/18]`: WebGL 渲染器与厂商 +- `cd[19/22/27]`: **当前会话的秒级与毫秒级 Epoch 时间戳**(必须与请求自洽,旧方案硬编码是致死原因之一) +- `cd[20]`: **鼠标相对增量轨迹**:首点为绝对坐标 `[start_x, start_y, delay_ms]`,后续为增量 `[dx, dy, dt_ms]`(dt 均值 16~18ms,模拟 60Hz 采样) +- `cd[26]`: 会话校验和与随机种子 +- `cd[31]`: 执行容器类型 (`"iframe"`) + +--- + +## 三、旧方案致死原因归纳(为什么之前报 12) + +1. **`re.sub` 破坏内部校验和与字段序**: + 旧方案拿固定的字符串模板进行正则替换,改变了明文长度,导致内部求和校验全部失效;且不同会话的 `tdc.js` 构建字段顺序会动态轮换,静态模板必死。 +2. **时间戳严重错位**: + 旧方案使用数天前抓包的硬编码时间戳,与当前服务器时间差数天,风控系统秒判拒绝。 +3. **机械假轨迹**: + 旧代码用 `random.randint` 随机构造假点,dt 分布为 0 或 1ms(相当于 20ms 内完成数十次移动),动力学完全反人类。 +4. **CDP 特征泄露**: + 浏览器自动化直接被 `document.$cdc_asdjflasutopfhvcZLmcfl_` 抓现行。 + +--- + +## 四、一键复验入口 + +```bash +# 1. 验证 Webpack 解包与核心模块提取 +node tools/unpack_webpack.js + +# 2. 验证 TDC 虚拟机反汇编与字符串提取 +node tools/tdc_vm_disasm.js tcaptcha/core_js/tdc_sample.js + +# 3. 验证深度 Proxy 语义探针执行并产出 100% 合法 collect 与 eks +node tools/tdc_probe.js tcaptcha/core_js/tdc_sample.js + +# 4. 验证探针生成的 collect 成功解密 +.venv/bin/python -c ' +import json, base64, urllib.parse, subprocess +from tcaptcha.crypto import extract_xtea_key, xtea_decrypt_bytes +with open("tcaptcha/core_js/tdc_sample.js") as f: code = f.read() +key = extract_xtea_key(code) +res = subprocess.check_output(["node", "-e", "const {probeTdc}=require(\"./tools/tdc_probe.js\"); const r=probeTdc(\"tcaptcha/core_js/tdc_sample.js\"); console.log(r.collect);"], text=True).strip() +raw = base64.b64decode(urllib.parse.unquote(res)) +plain = xtea_decrypt_bytes(raw, key).rstrip(b"\\x00") +print("成功解密探针生成的遥测载荷,长度:", len(plain)) +print("明文前 150 字节:", plain[:150].decode("latin1")) +' +``` diff --git a/tcaptcha/core_js/frame_modules/manifest.json b/tcaptcha/core_js/frame_modules/manifest.json new file mode 100644 index 0000000..c883a12 --- /dev/null +++ b/tcaptcha/core_js/frame_modules/manifest.json @@ -0,0 +1,655 @@ +[ + { + "id": 0, + "size": 7640, + "file": "module_000.js", + "keywords": [] + }, + { + "id": 1, + "size": 6222, + "file": "module_001.js", + "keywords": [ + "tdc", + "prehandle" + ] + }, + { + "id": 2, + "size": 3107, + "file": "module_002.js", + "keywords": [] + }, + { + "id": 3, + "size": 799, + "file": "module_003.js", + "keywords": [] + }, + { + "id": 4, + "size": 725, + "file": "module_004.js", + "keywords": [] + }, + { + "id": 5, + "size": 2500, + "file": "module_005.js", + "keywords": [] + }, + { + "id": 6, + "size": 1613, + "file": "module_006.js", + "keywords": [] + }, + { + "id": 7, + "size": 911, + "file": "module_007.js", + "keywords": [] + }, + { + "id": 8, + "size": 8871, + "file": "module_008.js", + "keywords": [] + }, + { + "id": 9, + "size": 77, + "file": "module_009.js", + "keywords": [] + }, + { + "id": 10, + "size": 1705, + "file": "module_010.js", + "keywords": [] + }, + { + "id": 11, + "size": 1047, + "file": "module_011.js", + "keywords": [] + }, + { + "id": 12, + "size": 2324, + "file": "module_012.js", + "keywords": [ + "verify", + "ticket" + ] + }, + { + "id": 13, + "size": 920, + "file": "module_013.js", + "keywords": [ + "verify" + ] + }, + { + "id": 14, + "size": 1034, + "file": "module_014.js", + "keywords": [] + }, + { + "id": 15, + "size": 23392, + "file": "module_015.js", + "keywords": [ + "pow" + ] + }, + { + "id": 16, + "size": 81616, + "file": "module_016.js", + "keywords": [ + "verify" + ] + }, + { + "id": 17, + "size": 669, + "file": "module_017.js", + "keywords": [ + "verify", + "ticket" + ] + }, + { + "id": 18, + "size": 286, + "file": "module_018.js", + "keywords": [] + }, + { + "id": 19, + "size": 5146, + "file": "module_019.js", + "keywords": [ + "verify", + "tdc", + "getsig", + "prehandle" + ] + }, + { + "id": 20, + "size": 447, + "file": "module_020.js", + "keywords": [] + }, + { + "id": 21, + "size": 1911, + "file": "module_021.js", + "keywords": [ + "verify" + ] + }, + { + "id": 22, + "size": 3537, + "file": "module_022.js", + "keywords": [ + "verify" + ] + }, + { + "id": 23, + "size": 2783, + "file": "module_023.js", + "keywords": [ + "prehandle" + ] + }, + { + "id": 24, + "empty": true + }, + { + "id": 25, + "size": 991, + "file": "module_025.js", + "keywords": [] + }, + { + "id": 26, + "size": 5018, + "file": "module_026.js", + "keywords": [] + }, + { + "id": 27, + "size": 2361, + "file": "module_027.js", + "keywords": [ + "verify" + ] + }, + { + "id": 28, + "size": 1510, + "file": "module_028.js", + "keywords": [ + "verify", + "prehandle" + ] + }, + { + "id": 29, + "size": 1526, + "file": "module_029.js", + "keywords": [ + "verify", + "prehandle" + ] + }, + { + "id": 30, + "empty": true + }, + { + "id": 31, + "empty": true + }, + { + "id": 32, + "empty": true + }, + { + "id": 33, + "empty": true + }, + { + "id": 34, + "empty": true + }, + { + "id": 35, + "empty": true + }, + { + "id": 36, + "empty": true + }, + { + "id": 37, + "empty": true + }, + { + "id": 38, + "empty": true + }, + { + "id": 39, + "size": 1065, + "file": "module_039.js", + "keywords": [] + }, + { + "id": 40, + "empty": true + }, + { + "id": 41, + "empty": true + }, + { + "id": 42, + "size": 666, + "file": "module_042.js", + "keywords": [] + }, + { + "id": 43, + "size": 443, + "file": "module_043.js", + "keywords": [ + "verify" + ] + }, + { + "id": 44, + "size": 1430, + "file": "module_044.js", + "keywords": [ + "verify" + ] + }, + { + "id": 45, + "empty": true + }, + { + "id": 46, + "empty": true + }, + { + "id": 47, + "size": 1244, + "file": "module_047.js", + "keywords": [] + }, + { + "id": 48, + "size": 4185, + "file": "module_048.js", + "keywords": [] + }, + { + "id": 49, + "empty": true + }, + { + "id": 50, + "empty": true + }, + { + "id": 51, + "empty": true + }, + { + "id": 52, + "empty": true + }, + { + "id": 53, + "size": 13636, + "file": "module_053.js", + "keywords": [ + "verify" + ] + }, + { + "id": 54, + "empty": true + }, + { + "id": 55, + "empty": true + }, + { + "id": 56, + "empty": true + }, + { + "id": 57, + "empty": true + }, + { + "id": 58, + "empty": true + }, + { + "id": 59, + "empty": true + }, + { + "id": 60, + "empty": true + }, + { + "id": 61, + "empty": true + }, + { + "id": 62, + "empty": true + }, + { + "id": 63, + "empty": true + }, + { + "id": 64, + "empty": true + }, + { + "id": 65, + "size": 713, + "file": "module_065.js", + "keywords": [] + }, + { + "id": 66, + "size": 10159, + "file": "module_066.js", + "keywords": [ + "verify", + "pow" + ] + }, + { + "id": 67, + "size": 4071, + "file": "module_067.js", + "keywords": [] + }, + { + "id": 68, + "size": 825, + "file": "module_068.js", + "keywords": [] + }, + { + "id": 69, + "size": 426, + "file": "module_069.js", + "keywords": [] + }, + { + "id": 70, + "empty": true + }, + { + "id": 71, + "empty": true + }, + { + "id": 72, + "empty": true + }, + { + "id": 73, + "empty": true + }, + { + "id": 74, + "empty": true + }, + { + "id": 75, + "empty": true + }, + { + "id": 76, + "empty": true + }, + { + "id": 77, + "empty": true + }, + { + "id": 78, + "empty": true + }, + { + "id": 79, + "empty": true + }, + { + "id": 80, + "empty": true + }, + { + "id": 81, + "empty": true + }, + { + "id": 82, + "empty": true + }, + { + "id": 83, + "empty": true + }, + { + "id": 84, + "empty": true + }, + { + "id": 85, + "empty": true + }, + { + "id": 86, + "size": 10832, + "file": "module_086.js", + "keywords": [ + "verify" + ] + }, + { + "id": 87, + "size": 1110, + "file": "module_087.js", + "keywords": [] + }, + { + "id": 88, + "size": 3631, + "file": "module_088.js", + "keywords": [] + }, + { + "id": 89, + "size": 6698, + "file": "module_089.js", + "keywords": [] + }, + { + "id": 90, + "size": 10256, + "file": "module_090.js", + "keywords": [ + "verify", + "prehandle" + ] + }, + { + "id": 91, + "size": 141, + "file": "module_091.js", + "keywords": [] + }, + { + "id": 92, + "size": 627, + "file": "module_092.js", + "keywords": [] + }, + { + "id": 93, + "size": 141, + "file": "module_093.js", + "keywords": [] + }, + { + "id": 94, + "size": 1265, + "file": "module_094.js", + "keywords": [ + "verify" + ] + }, + { + "id": 95, + "empty": true + }, + { + "id": 96, + "empty": true + }, + { + "id": 97, + "empty": true + }, + { + "id": 98, + "empty": true + }, + { + "id": 99, + "empty": true + }, + { + "id": 100, + "empty": true + }, + { + "id": 101, + "empty": true + }, + { + "id": 102, + "empty": true + }, + { + "id": 103, + "empty": true + }, + { + "id": 104, + "empty": true + }, + { + "id": 105, + "empty": true + }, + { + "id": 106, + "empty": true + }, + { + "id": 107, + "empty": true + }, + { + "id": 108, + "empty": true + }, + { + "id": 109, + "empty": true + }, + { + "id": 110, + "empty": true + }, + { + "id": 111, + "empty": true + }, + { + "id": 112, + "empty": true + }, + { + "id": 113, + "empty": true + }, + { + "id": 114, + "empty": true + }, + { + "id": 115, + "empty": true + }, + { + "id": 116, + "empty": true + }, + { + "id": 117, + "empty": true + }, + { + "id": 118, + "empty": true + }, + { + "id": 119, + "empty": true + }, + { + "id": 120, + "size": 13196, + "file": "module_120.js", + "keywords": [ + "verify", + "collect", + "prehandle", + "subcapclass", + "ticket" + ] + }, + { + "id": 121, + "size": 20314, + "file": "module_121.js", + "keywords": [ + "verify", + "prehandle", + "subcapclass", + "ticket" + ] + } +] \ No newline at end of file diff --git a/tcaptcha/core_js/frame_modules/module_000.js b/tcaptcha/core_js/frame_modules/module_000.js new file mode 100644 index 0000000..70b7afe --- /dev/null +++ b/tcaptcha/core_js/frame_modules/module_000.js @@ -0,0 +1,194 @@ +function (e, t, i) { + "use strict"; + + var a = this && this.__importDefault || function (e) { + return e && e.__esModule ? e : { + "default": e + }; + }; + t.__esModule = !0, t.setScaleWidth = t.changeDomVisibility = t.domParserHtml = t.setVoiceOverFocus = t.bodyAriaHidden = t.addAriaModel = t.isTouchEventSupported = t.supportsPassive = t.isWindow = t.getWindow = t.getOffset = t.isDarkMode = t.shakeEl = t.addOnceAnimationClass = t.animationEndName = t.removeDomClass = t.addDomClass = t.setCss = t.getCSS = t.supportsCSS = t.createGeneralIframe = void 0; + var r = i(3), + n = a(i(20)), + o = i(21), + s = a(i(8)), + c = i(4); + t.createGeneralIframe = function (e) { + var t = document.createElement("div"); + (null === e || void 0 === e ? void 0 : e.name) ? t.innerHTML = '