Mohitkamboz/nopecha-extension-decrypted

GitHub: Mohitkamboz/nopecha-extension-decrypted

对 NopeCHA 验证码识别 Chrome 扩展的完全去混淆源码恢复,通过自研 AST 解码器将 100% 的混淆字符串还原为人类可读代码。

Stars: 2 | Forks: 1

# NopeCHA 扩展 — 反编译 ![Decompiled](https://img.shields.io/badge/decompiled-100%25%20strings%20resolved-brightgreen) ![Scaffolding removed](https://img.shields.io/badge/dead%20code%20removed-2%2C104%20bindings-blue) ![Manifest](https://img.shields.io/badge/manifest-v3-orange) ![Status](https://img.shields.io/badge/status-reverse--engineered-lightgrey) ![License](https://img.shields.io/badge/license-see%20LICENSE-yellow) 这是对 **NopeCHA** Chrome 扩展(一款支持 reCAPTCHA、hCaptcha、Cloudflare Turnstile、FunCAPTCHA、AWS WAF Captcha、GeeTest、LeminCaptcha 以及 PerimeterX 的 AI CAPTCHA 解决扩展)的完全去混淆、人类可读的源码恢复。该项目完全基于编译/混淆的分发包重构——由于没有任何原始源码可用。完整的恢复过程技术说明请参阅 [`DECOMPILATION_NOTES.md`](DECOMPILATION_NOTES.md)。 ## 为什么会有这个项目 维护者丢失了原始源码,只剩下了打包好的扩展程序(从自己的 GitHub releases 下载的)。构建中的每个 JavaScript 文件都被 `javascript-obfuscator` 的字符串数组转换处理过;本仓库正是为此专门编写了一个基于 AST 的解码器,并将其应用于每个文件,最终成功将 100% 的编码字符串还原为明文字面量的结果。 ## 反编译统计 | 指标 | 结果 | |---|---:| | 已处理 JS 文件 | 12 / 12 | | 已还原的字符串数组编码字面量 | **52,582 / 52,582 (100%)** | | 未解析的调用位置 | **0** | | 已处理的不同解码器变体(每个闭包的随机化字母表) | 每个文件最多 75 个 | | 已移除的无用混淆脚手架绑定 | 2,104 | | 通过 `node --check` 的文件(语法有效的 JS) | 12 / 12 | | **零** 混淆脚手架残留的文件 | 1 (`content-installed-beacon.js`,完全手工优化) | | 从零重构的文件(原始文件大小为 0 字节) | 2 (`manifest.json`, `popup.html`) | **由于压缩的特性而无法恢复(并非此工具的限制):** 原始变量/函数名、源文件路径、构建配置和代码注释。具体的含义请参阅笔记中针对每个文件的说明。 ## 此扩展的功能 NopeCHA 是一款浏览器扩展,它能使用 AI 识别后端 (`api.nopecha.com`) 自动检测并解决任何网站上的 CAPTCHA 挑战。恢复的证据表明它支持: - **reCAPTCHA**(复选框 + 图像挑战) - **hCaptcha**(复选框 + 挑战,带有页面上下文网络拦截器) - **Cloudflare Turnstile**(基于指纹驱动) - **FunCAPTCHA** / Arkose Labs(自动打开 + 图像匹配) - **AWS WAF Captcha**、**GeeTest**(标准版 + 滑块)、**LeminCaptcha**、通用 **TextCaptcha** 以及 **PerimeterX/HUMAN** 信号 它通过 `chrome.debugger`(Chrome DevTools Protocol)驱动交互,以实现类似人类的模拟鼠标移动和点击,而不是直接触发合成的 DOM 事件。 ## 文件映射 构建流水线最初以内容哈希命名(`qrmm9f.js`、`772qgh.js` 等)发布这些文件,仅从文件名根本无法看出其用途。本仓库将每个文件重命名以反映其恢复的角色——下表记录了这种映射及其背后的证据(完整细节见反编译笔记)。 | 文件 (本仓库) | 原始名 | 角色 | 置信度 | |---|---|---|---| | [`assets/background.js`](assets/background.js) | `qrmm9f.js` | **Service worker。** 拥有 `chrome.debugger`(CDP 鼠标/点击模拟)、`chrome.proxy`、`chrome.scripting`、`chrome.tabs`。作为 `namespace::action` 消息(`debugger::*`, `api::*`, `settings::*`, `solver::*`, `fetch::*`, `proxy::*`, `tabs::*`, `broadcast::*`, `fingerprint::*`, `log::*`, `locator::*`, `echo::*`)的中央 RPC 路由器。**这里是 [`api::recognition` 处理程序](assets/background.js) 所在地**——实际的 `POST api.nopecha.com/.../recognition/{type}` 调用。 | High | | [`assets/popup.js`](assets/popup.js) + [`assets/popup.css`](assets/popup.css) | `772qgh.js` + `772qgh.css` | **Popup UI** (Preact)。API key 输入、各提供商启用/禁用切换、设置导出、“在页面上定位”触发器。 | High | | [`assets/popup.html`](assets/popup.html) | `vlh38c.html` | Popup HTML 外壳。**已重构**——原始大小为 0 字节。 | 重构 | | [`assets/content-recaptcha.js`](assets/content-recaptcha.js) | `fxujf8.js` | reCAPTCHA 解决程序(复选框 + 图像挑战 iframes)。 | High | | [`assets/content-hcaptcha.js`](assets/content-hcaptcha.js) | `vdvh9g.js` | hCaptcha 解决程序,ISOLATED world。包含显著的 **[主识别循环](assets/content-hcaptcha.js)** ——见下文。 | High | | [`assets/content-hcaptcha-interceptor.js`](assets/content-hcaptcha-interceptor.js) | `u3v1nu.js` | `content-hcaptcha.js` 的 MAIN-world 配套脚本;修补 `XMLHttpRequest.prototype` 以捕获 hCaptcha 的 `getcaptcha` 响应,并通过 `window.postMessage` 进行桥接。 | High | | [`assets/content-turnstile.js`](assets/content-turnstile.js) | `g42lbq.js` | Cloudflare Turnstile 解决程序;庞大的浏览器指纹收集器 + CDP 模拟交互。 | High | | [`assets/content-funcaptcha.js`](assets/content-funcaptcha.js) | `2zaf6a.js` | FunCAPTCHA / Arkose Labs 解决程序(自动打开 + 图像匹配)。 | High | | [`assets/content-misc-captchas.js`](assets/content-misc-captchas.js) | `6jy6km.js` | 综合解决程序:AWS WAF Captcha、GeeTest(标准版 + 滑块)、LeminCaptcha、通用 TextCaptcha(用户 CSS 选择器)、PerimeterX/HUMAN。 | High | | [`assets/content-locator.js`](assets/content-locator.js) | `29h93b.js` | 页面上的 CSS 选择器拾取覆盖层。通过 `chrome.scripting.executeScript` 按需注入,而不是静态 content script。 | High | | [`assets/content-installed-beacon.js`](assets/content-installed-beacon.js) | `1vl82s.js` | 注入到 nopecha.com 的微型信标;设置 `document.documentElement` 属性,以便网站检测扩展及其版本。**已完全清理并手工优化——建议先阅读此文件。** | High | | [`assets/page-funcaptcha-demo.js`](assets/page-funcaptcha-demo.js) | `a0yoaj.js` | 用于针对已知 sitekeys 测试 FunCAPTCHA 解决程序的内部开发/QA 页面。 | High | | [`assets/page-setup.js`](assets/page-setup.js) | `3oggii.js` | `nopecha.com/setup#...` 背后的脚本;解析哈希编码的设置并将其导入。 | High | ## 亮点:识别 pipeline 核心的“AI 解决 CAPTCHA”逻辑——也是任何想要扩展此功能的人最感兴趣的部分——已通过 `>>> ... <<<` 注释块在行内进行了标记: 1. **[`content-hcaptcha.js`](assets/content-hcaptcha.js)** ——搜索 `HCAPTCHA RECOGNITION CALL`。这是将挑战(任务图像、元数据)打包并发送给 background worker 的地方。 2. **[`background.js`](assets/background.js)** ——搜索 `RECOGNITION RPC HANDLER`。这是实际的网络调用: `POST {api base}/{recognition path}/{captchaType}` 以及 `Authorization: Basic `,在遇到暂时性错误时最多重试 30 次。 3. **[`content-hcaptcha.js`](assets/content-hcaptcha.js)** ——搜索 `HCAPTCHA ANSWER-APPLICATION DISPATCHER`。获取 AI 的答案并将其应用到 DOM 上(点击区块 / 选择区域 / 拖拽拼图),使用类似人类的模拟指针移动轨迹。 相同的 `api::recognition` RPC 被每个 content script(`content-recaptcha.js`、`content-turnstile.js`、`content-funcaptcha.js`、`content-misc-captchas.js`)共享——每个提供商仅 `type` 字段和答案应用逻辑有所不同。 ## 使用你自己的识别模型 识别调用在 `background.js` 中是一个独立且隔离良好的 HTTP 请求(参见上面的 `RECOGNITION RPC HANDLER` 标记)。它: 1. 从 `m2.base + m2.recognition + "/" + captchaType` 构建请求 URL——位于 `background.js` 顶部附近的 `m2` 配置对象设置了 `base: "https://api.nopecha.com"`、`recognition: "/v1/recognition"`、`status: "/v1/status"`、`observability: "/v1/observability"`。 2. 发送包含 `Authorization: Basic ` 请求头和 JSON body 的 `POST` 请求,其中包含由调用它的 content script 构建的挑战 payload(base64 格式的任务图像、tasklist 元数据以及设置)。 3. 期望得到 JSON 响应;成功时,它包含已解决的答案,其数据结构与每个 content script 的 dispatcher(例如 `content-hcaptcha.js` 的答案应用 dispatcher)已经知道如何消费的格式相匹配——即作为与挑战的 `request_type` 相匹配的 `data` 数组。 为了将此请求指向你自己的模型/后端而不是 NopeCHA 的 API,且**无需改动已恢复的 37,000 多行解决/DOM 逻辑**,可以操纵这两个杠杆: - **更改 base URL** ——编辑 `background.js` 中的 `m2` 配置对象(即设置 `base: "https://api.nopecha.com"` 的那个),使其指向你的 endpoint,并确保你的服务器响应格式与每个 content script 的 dispatcher 对该 `request_type` 期望的格式兼容。 - **更改身份验证** ——在同一处理程序中,将 `Authorization: Basic ` 请求头的构造替换为你的后端所期望的任何内容。 这里故意仅作为文档指引,而不是本仓库中的代码更改,因为确切的响应契约因 CAPTCHA 类型和模型输出格式而异——在连接替代后端之前,请参阅每个 content script 的“ANSWER-APPLICATION DISPATCHER”部分(使用 grep 搜索 `request_type`),以查看预期的确切数据结构。 ## 目录结构 ``` decompiled/ ├── manifest.json reconstructed (see DECOMPILATION_NOTES.md) ├── README.md this file ├── DECOMPILATION_NOTES.md full recovery process, tooling, confidence levels ├── LICENSE see below ├── CONTRIBUTING.md how to help improve this recovery ├── icon/ copied unmodified from the original build └── assets/ ├── background.js service worker ├── popup.js / popup.css / popup.html popup UI ├── content-*.js per-CAPTCHA-provider content scripts └── page-*.js internal extension pages (demo/setup) ``` ## 贡献 找到了一个你能确信识别出用途的变量?发现了恢复过程中弄错的地方?请参阅 [`CONTRIBUTING.md`](CONTRIBUTING.md)——欢迎做出能够提升可读性(命名、注释)或准确性(修复被误认的文件角色、manifest 字段等)的贡献。请不要提交更改运行时行为的修改,除非明确将其标记为此类更改,因为本仓库的全部意义就在于忠实地恢复原始逻辑。 ## 许可与免责声明 本仓库包含 NopeCHA 已编译浏览器扩展的反向工程去混淆副本。其提供仅供研究、透明度及个人存档目的之用,由原始构建的作者提供,该作者丢失了源码并从其自行发布的分发中将其恢复。不对任何特定用途的适用性作任何保证。所有商标("NopeCHA")均归其各自所有者所有;本仓库不隶属于 NopeCHA,也未获得其认可。有关管辖本特定仓库内容的条款,请参阅 [`LICENSE`](LICENSE)。
标签:CMS安全, JavaScript, 云资产清单, 反混淆, 数据可视化, 浏览器扩展, 自动化payload嵌入, 自定义脚本, 逆向工程, 验证码识别