ARTICLE DETAIL

资讯详情

深耕网站SEO优化与搜索引擎排名提升的一线实战洞察。

MCP协议与AI辅助:革新JS逆向,高效定位加密参数生成逻辑

MCP协议与AI辅助:革新JS逆向,高效定位加密参数生成逻辑 最近在尝试逆向一些网站的数据接口时发现很多加密逻辑越来越复杂尤其是那些基于 JavaScript 的混淆和 VMP虚拟机保护技术让传统的 JS 逆向变得异常耗时且门槛很高。很多对 JavaScript 语法不熟悉的朋友面对层层嵌套的window对象和动态执行的代码往往无从下手。有没有一种方法可以让我们绕过复杂的 JS 代码分析直接定位到核心的加密参数生成逻辑呢答案是肯定的。本文将介绍一种结合MCPModel Context Protocol协议和 AI 辅助分析的新思路它能让逆向工作的重心从“人肉分析代码”转向“智能定位与模拟”。即使你对 JavaScript 的闭包、原型链、this指向等概念一知半解也能通过这套方法高效地完成对常见加密接口的逆向。我们将从零开始手把手带你配置环境、解析实战案例并展示最终的效果。文末也会提供相关的工具和思路资料。1. 背景与核心概念为什么是 MCP 与 AI 逆向在深入实战之前我们有必要厘清几个关键概念理解为什么传统的 JS 逆向越来越“难”而新的思路能带来哪些改变。1.1 传统 JS 逆向的痛点传统 JS 逆向的核心是“代码分析”。开发者需要打开浏览器开发者工具在“Sources”面板中找到经过压缩和混淆的 JavaScript 文件通过格式化、断点调试、Hook 函数等方式一步步跟踪代码执行流程最终找到生成签名如sign、token、x-sign或加密参数如data被AES加密的关键函数。这个过程要求逆向者具备扎实的 JavaScript 功底能理解各种混淆手段如变量名混淆、控制流平坦化、字符串加密等。对于瑞数、极验geetest等采用了 VMPVirtual Machine Protection技术的网站其核心逻辑被编译成特殊的字节码在自定义虚拟机中执行直接静态分析几乎不可能难度极大。1.2 什么是 MCPModel Context ProtocolMCP 是一个新兴的协议它的核心思想是为大语言模型LLM提供一种标准化的方式来与外部工具、数据源和计算环境进行交互。你可以把它理解为一套“模型的操作系统接口”。在逆向的语境下我们可以利用 MCP 将浏览器运行时环境包括页面 DOM、网络请求、JavaScript 执行上下文安全、可控地暴露给一个 AI 助手例如 Claude、GPT-4 等。AI 助手不再仅仅是基于静态代码文本进行分析而是可以“置身于”真实的网页环境中执行命令、观察行为、动态测试从而更智能地推理出加密逻辑。1.3 AI 逆向的新范式结合 MCP逆向工作流可以转变为环境感知AI 通过 MCP 连接到浏览器能实时看到页面加载了哪些脚本发起了哪些网络请求以及请求的载荷Payload和响应。智能定位AI 可以分析请求参数对比多次请求的差异智能推测哪些参数可能是加密生成的并定位到生成这些参数的 JavaScript 函数名或代码片段附近。行为模拟与验证AI 可以尝试在浏览器控制台中执行一些代码片段或者调用可疑的函数观察其输出是否与网络请求中的参数匹配从而验证猜想。生成解决方案基于验证成功的逻辑AI 可以协助生成用于 Python/Node.js 等环境的模拟代码甚至直接生成可用的逆向脚本框架。这种方法的优势在于它降低了对人工逐行代码分析能力的绝对依赖将逆向者从繁琐的调试中解放出来更侧重于策略制定、结果验证和代码整合。对于小白或新手来说这是一个巨大的福音。2. 环境准备与工具链搭建工欲善其事必先利其器。下面我们将搭建一套用于 AI 辅助逆向的环境。请注意以下工具和版本会不断更新请以官方最新文档为准本文提供的是经过验证可用的配置思路。2.1 基础运行环境操作系统Windows 10/11, macOS, 或 Linux (如 Ubuntu) 均可。本文演示以 Windows 11 为例。Node.js这是运行许多逆向工具和脚本的环境。请安装Node.js 18.x LTS或更高版本。前往 Node.js 官网 下载安装包安装完成后在命令行输入node -v和npm -v检查版本。Python部分辅助工具和脚本可能需要 Python。建议安装Python 3.8。安装时务必勾选 “Add Python to PATH”。安装后命令行输入python --version检查。2.2 核心工具安装我们将使用一个集成了 MCP 服务器和浏览器自动化能力的工具链。这里介绍一个强大的组合browserbaseMCP 服务器AI 助手客户端。安装 Browserbase CLI可选但推荐 Browserbase 提供了一个云浏览器环境可以方便地进行远程控制和截图对于自动化测试和观察很有帮助。你也可以直接使用本地 Chrome。npm install -g browserbase/cli # 登录并配置需要账号 browserbase login配置 MCP 服务器 MCP 服务器是连接 AI 与浏览器环境的核心。我们可以使用一个开源的 MCP 服务器实现例如modelcontextprotocol/server-browser。 创建一个新的项目目录并初始化mkdir ai-reverse-mcp cd ai-reverse-mcp npm init -y npm install modelcontextprotocol/server-browser puppeteer创建一个简单的服务器脚本server.js// server.js const { Server } require(modelcontextprotocol/server-browser); const puppeteer require(puppeteer); (async () { const browser await puppeteer.launch({ headless: false, // 显示浏览器窗口方便观察 args: [--no-sandbox, --disable-setuid-sandbox] }); const server new Server({ browser, // 传入 Puppeteer 的 browser 实例 // 可以配置允许访问的域名等策略 }); // 启动服务器监听某个端口 await server.listen(3000); console.log(MCP Browser Server listening on ws://localhost:3000); })();运行node server.js启动服务器。它会打开一个浏览器实例并等待 MCP 客户端的连接。2.3 AI 助手客户端配置你需要一个支持 MCP 协议的 AI 助手。目前Anthropic 的 Claude Desktop 应用Claude 3.5 Sonnet 及以上版本原生支持 MCP。配置步骤如下打开 Claude Desktop 应用。进入设置Settings- 开发者Developer- MCP 服务器配置。点击 “Add MCP Server”。在 “Server Settings” 中选择 “Command” 类型。在 “Command” 字段中填写启动我们上面创建的 MCP 服务器的命令。由于我们的服务器是 Node.js 脚本配置可能类似node /你的项目路径/ai-reverse-mcp/server.js保存配置并重启 Claude Desktop。重启后Claude 就具备了通过 MCP 协议与你本地运行的浏览器服务器交互的能力。你可以在对话中要求 Claude “分析当前浏览器页面中的网络请求”或“执行一段 JavaScript 代码”。2.4 辅助工具按需安装PyCharm / VSCode代码编辑器用于编写最终的逆向脚本。Fiddler / Charles / Wireshark网络抓包工具用于初步分析 API 请求确定目标接口。对于 HTTPS需要配置证书。Node.js 逆向常用库在编写最终模拟脚本时可能会用到。npm install axios crypto-js jsdom node-fetch3. 逆向核心思路与 MCP 协作流程拆解在环境准备好之后我们来系统化地梳理一下如何利用这套工具链进行逆向。整个过程可以分为以下几个阶段AIClaude通过 MCP 在每个阶段提供关键辅助。3.1 第一阶段目标确认与数据捕获人工操作使用浏览器或通过 MCP 服务器控制的浏览器手动访问目标网站触发你想要逆向的功能如登录、搜索、提交表单。同时打开开发者工具F12的 “Network” 面板。AI 辅助点你可以要求 Claude通过 MCP“列出当前页面最近 10 个 XHR/Fetch 请求”它会返回请求的 URL、方法、请求头和请求体。这比人工筛选更快捷。目标找到那个携带了加密参数如signature,encryptedData,token的关键 API 请求。记录下它的 URL 和完整的请求体示例。3.2 第二阶段参数分析与可疑函数定位人工操作在开发者工具的 “Sources” 面板中全局搜索加密参数名或参数值中的特征字符串。或者对可能包含加密逻辑的 JavaScript 文件设置 XHR/Fetch 断点。AI 辅助点核心这是 MCP 大显身手的地方。你可以给 Claude 提供捕获到的请求信息并发出指令“我有一个向https://api.target.com/login发送的 POST 请求其载荷是{user:test,sign:a1b2c3d4e5f6}。我怀疑sign参数是由前端 JavaScript 生成的。请通过 MCP 连接到当前浏览器分析页面中所有加载的 JS 文件寻找可能生成sign值的函数。重点关注函数名包含sign、encrypt、hash、encode的函数或者使用了CryptoJS、window.btoa、md5等常见加密库的代码段。”AI 行动Claude 会通过 MCP 服务器执行浏览器环境中的 JavaScript 代码例如遍历window对象、搜索源代码文本并返回它认为可疑的函数列表及其所在位置。3.3 第三阶段函数行为验证与逻辑提取人工操作根据 AI 提供的线索在 “Sources” 面板中找到对应函数尝试通过控制台调用它传入不同参数观察输出。AI 辅助点你可以要求 Claude 直接进行验证。“你找到了一个名为window.getSign(param)的函数。请通过 MCP 执行这个函数传入参数test123并把结果告诉我。然后再尝试执行window.getSign(hello)对比结果。”AI 行动Claude 会执行window.getSign(test123)并返回结果。通过多次不同输入的测试你可以和 Claude 一起分析该函数的输入输出规律判断其是否为目标加密函数。AI 还可以尝试提取函数的源代码如果未被严重混淆。3.4 第四阶段代码模拟与脚本生成人工操作将验证成功的 JavaScript 函数逻辑用 Python 或 Node.js 重写。AI 辅助点你可以将函数源码或 AI 提取的逻辑描述提供给 Claude并要求“这是用于生成sign的 JavaScript 函数。请帮我将其翻译成等价的 Python 代码要求使用hashlib和hmac标准库。请确保逻辑完全一致。” 或者“这个函数依赖了浏览器环境中的window.navigator对象和Date.now()。在 Node.js 环境中如何模拟这些环境请帮我写一个完整的 Node.js 模块来生成这个sign。”AI 行动Claude 会生成相应的模拟代码。你需要将其放入你的逆向脚本项目中并进行测试。3.5 第五阶段集成测试与调优人工操作运行生成的模拟脚本用其产生的参数去构造请求并与浏览器中发出的真实请求进行对比。如果不一致需要调试。AI 辅助点将不一致的请求和你的模拟代码提供给 Claude让它帮助分析差异可能出自哪里例如时间戳格式、密钥来源、字符串拼接顺序等。这个流程将逆向从“纯人力解密”变成了“人机协同侦查”大大提升了效率尤其是面对代码量巨大或有一定混淆的站点时。4. 完整实战案例逆向一个模拟登录接口的sign参数为了让大家有更直观的感受我们模拟一个常见的场景逆向一个登录接口的签名参数。请注意以下案例为教学演示目标网站为虚构所有代码均为示例不可直接用于任何实际网站的未授权访问。4.1 案例背景与目标确认假设目标网站www.demo-login.com的登录接口POST /api/v1/login需要以下参数{ username: userexample.com, password: your_password, timestamp: 1698765432100, sign: 7a89f8d7b6c5a4e3f2g1h0i9j8k7l6m }其中password可能是前端加密的sign是根据username、password、timestamp以及一个固定密钥可能藏在 JS 里通过某种算法如 HMAC-SHA256生成的签名用于防止请求被篡改。我们的目标是找到生成sign的算法并用 Python 复现。4.2 使用 MCP 与 AI 进行环境探查启动我们的 MCP 服务器 (node server.js)。在 Claude Desktop 中我们已经配置好了该 MCP 服务器。在 Claude 对话中我们输入指令“请通过 MCP 连接到浏览器打开新标签页并导航至http://www.demo-login.com。等待页面加载完成后在登录框中输入测试用户名test_user和密码test_pass然后点击登录按钮。捕获点击后发出的第一个 XHR 或 Fetch 请求的详细信息特别是请求 URL 和请求体Payload。”Claude 会控制浏览器执行这些操作并返回类似如下的信息已打开页面并执行登录操作。 捕获到关键请求 URL: https://www.demo-login.com/api/v1/login Method: POST Request Payload: { username: test_user, password: a1b2...加密后的字符串, timestamp: 1698765432100, sign: 7a89f8d7b6c5a4e3f2g1h0i9j8k7l6m }4.3 定位签名生成函数我们继续指示 Claude“很好。现在我怀疑sign参数是由前端 JavaScript 函数生成的。请你分析当前页面加载的所有 JavaScript 资源搜索可能与签名生成相关的函数。可以查找包含 ‘sign‘、’hmac‘、’sha256‘、’encode‘、’hash‘ 等关键词的函数定义或者查找对CryptoJS.HmacSHA256、window.crypto.subtle的调用。”Claude 通过 MCP 执行页面内的 JS 搜索可能会返回在 login.vendor.js 文件中发现一个可疑函数 函数名 window.genSign(payload, secretKey) 在 main.app.js 中发现对 CryptoJS 库的引用。 在控制台尝试执行 window.genSign.toString() 可以查看该函数源码如果未重度混淆。我们让 Claude 获取函数源码“请尝试执行window.genSign.toString()并将结果返回给我。”Claude 返回function genSign(payload, secretKey) { var sortedKeys Object.keys(payload).sort(); var signStr ; for (var i 0; i sortedKeys.length; i) { var key sortedKeys[i]; if (key ! sign) { // 排除sign自身 signStr key payload[key] ; } } signStr signStr.slice(0, -1); // 去掉最后一个 // 使用 CryptoJS.HmacSHA256需要确保CryptoJS已加载 var hash CryptoJS.HmacSHA256(signStr, secretKey); return CryptoJS.enc.Hex.stringify(hash); }同时Claude 可能通过分析其他代码发现secretKey是一个固定在某个全局变量或从某个接口获取的值比如window._APP_CONFIG_.apiSecret。4.4 验证函数逻辑并提取关键信息我们让 Claude 进行验证“请通过 MCP 执行以下操作1. 获取window._APP_CONFIG_.apiSecret的值。2. 使用获取到的secretKey和刚才捕获的请求 payload去掉 sign 字段调用window.genSign函数计算出一个签名。3. 将计算结果与捕获的请求中的sign值进行对比。”Claude 执行后回复1. window._APP_CONFIG_.apiSecret 的值为my_secret_key_12345。 2. 构造 payload 对象{username: test_user, password: a1b2..., timestamp: 1698765432100}。 3. 调用 window.genSign(payload, my_secret_key_12345) 得到结果7a89f8d7b6c5a4e3f2g1h0i9j8k7l6m。 4. 对比结果与捕获的 sign 值完全一致。验证成功我们找到了签名算法和密钥。4.5 使用 Python 复现签名算法现在我们将算法翻译成 Python。我们可以直接让 Claude 生成代码“根据我们分析出的genSign函数逻辑和密钥请编写一个 Python 函数generate_sign(payload_dict, secret_key)来复现该签名算法。使用 Python 的hmac和hashlib库。”Claude 生成如下代码# sign_utils.py import hmac import hashlib from urllib.parse import quote def generate_sign(payload_dict, secret_key): 根据分析出的 JS 逻辑生成签名。 payload_dict: 字典包含除sign外的所有请求参数。 secret_key: 字符串密钥。 # 1. 对字典键进行排序 sorted_keys sorted(payload_dict.keys()) # 2. 构建待签名字符串 k1v1k2v2... sign_str_parts [] for key in sorted_keys: # 确保值都是字符串并进行URL编码根据实际情况原JS可能没编码这里假设需要 value str(payload_dict[key]) # sign_str_parts.append(f{key}{quote(value, safe)}) sign_str_parts.append(f{key}{value}) # 假设原JS未编码 sign_str .join(sign_str_parts) # 3. 使用 HMAC-SHA256 计算签名 # 注意密钥和消息都需要转换为 bytes secret_key_bytes secret_key.encode(utf-8) sign_str_bytes sign_str.encode(utf-8) hmac_obj hmac.new(secret_key_bytes, sign_str_bytes, hashlib.sha256) signature hmac_obj.hexdigest() return signature # 测试用例 if __name__ __main__: test_payload { username: test_user, password: a1b2c3d4e5, # 注意这里是前端加密后的密码我们需要先模拟前端加密 timestamp: 1698765432100 } secret my_secret_key_12345 calculated_sign generate_sign(test_payload, secret) print(f生成的签名: {calculated_sign}) # 应与之前捕获的签名一致 expected_sign 7a89f8d7b6c5a4e3f2g1h0i9j8k7l6m print(f匹配结果: {calculated_sign expected_sign})4.6 处理密码加密如果存在上述案例中password在请求前也被加密了。我们需要用同样的思路找到加密password的函数。过程类似让 Claude 搜索encryptPassword、CryptoJS.AES等关键词定位函数验证然后用 Python 复现。假设我们找到用的是CryptoJS.AES.encrypt(password, key).toString()那么 Python 复现可能用到pycryptodome库。4.7 整合成完整的登录脚本最后我们将签名生成和密码加密整合到一个完整的 Python 请求脚本中# demo_login.py import requests import time from sign_utils import generate_sign # 假设我们还有一个加密密码的模块 from password_utils import encrypt_password def login(username, raw_password): base_url https://www.demo-login.com login_url f{base_url}/api/v1/login # 1. 模拟前端密码加密 encrypted_password encrypt_password(raw_password) # 2. 构造 payload timestamp int(time.time() * 1000) # 毫秒时间戳 payload { username: username, password: encrypted_password, timestamp: timestamp } # 3. 生成签名 (密钥从分析中得来) secret_key my_secret_key_12345 sign generate_sign(payload, secret_key) payload[sign] sign # 4. 发送请求 headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, Content-Type: application/json } try: response requests.post(login_url, jsonpayload, headersheaders, timeout10) response.raise_for_status() print(登录成功) print(响应:, response.json()) return response.json() except requests.exceptions.RequestException as e: print(f请求失败: {e}) return None if __name__ __main__: login(your_username, your_password)至此一个完整的逆向流程就完成了。通过 MCP 和 AI 的辅助我们绕过了直接阅读复杂混淆 JS 的困难通过“行为探测”和“智能分析”定位到了核心逻辑。5. 常见问题与排查思路QA在实际操作中你可能会遇到各种问题。下面列出一些常见情况及其解决思路。问题现象可能原因排查思路与解决方案MCP 服务器连接失败Claude Desktop 配置错误服务器脚本未运行端口冲突。1. 检查node server.js是否正常运行并打印监听日志。2. 检查 Claude Desktop 中 MCP 服务器配置的 Command 路径是否正确。3. 尝试更换服务器端口如 3001。4. 查看 Claude Desktop 的错误日志。AI 无法通过 MCP 执行浏览器操作页面安全策略CSP限制Puppeteer 启动参数问题目标页面为 iframe 或特殊环境。1. 确保 MCP 服务器启动浏览器时使用了headless: false以便观察。2. 尝试在 Puppeteer launch 参数中添加--disable-web-security和--disable-featuresIsolateOrigins,site-per-process仅用于测试。3. 让 AI 先尝试执行简单的document.title来测试连通性。找不到关键的加密函数函数名被严重混淆加密逻辑在 WebAssembly 或 VMP 中函数是动态生成的。1. 让 AI 搜索网络请求初始化处如fetch或XMLHttpRequest.send设置的断点回溯调用栈。2. 关注全局事件监听器加密可能在表单提交事件中触发。3. 如果使用 VMP如瑞数传统方法失效需考虑其他方案如环境模拟、RPC 调用这超出了本文基础范围。AI 提取的函数逻辑不全或错误函数依赖了外部闭包变量或复杂的全局状态代码被动态修改。1. 让 AI 不仅提取函数本身还提取其所在的作用域或模块定义的代码片段。2. 尝试在浏览器控制台中在函数被定义后立即将其赋值给一个全局变量备份再让 AI 分析这个备份。3. 采用“黑盒测试”思路让 AI 多次调用该函数并记录输入输出尝试用 Python 机器学习库如sklearn拟合其行为适用于简单变换。Python 复现的签名与浏览器不一致编码问题UTF-8 vs Latin-1参数排序规则不同密钥或盐值Salt不对时间戳格式有差异。1.逐字节对比将浏览器中构建的待签名字符串和 Python 中构建的字符串都打印出来进行严格对比包括空格和特殊字符。2.检查密钥来源确认 Python 中使用的密钥与浏览器中完全一致包括不可见字符。3.验证加密库确保 Python 的hmac/hashlib与 JS 的CryptoJS算法模式和输出格式Hex, Base64一致。4.使用中间件验证写一个简单的 Node.js 脚本直接用CryptoJS库计算作为“标准答案”来调试 Python 代码。请求被服务器识别为爬虫缺乏必要的请求头如User-Agent,Referer,CookieTLS 指纹被识别行为模式异常。1.复制完整请求头使用浏览器开发者工具将原始成功请求的Headers全部复制到 Python 请求的headers字典中。2.管理会话使用requests.Session()对象保持 Cookie。3.考虑高级反爬对于 TLS 指纹或高级风控可能需要使用curl_cffi、playwright或selenium等更能模拟真实浏览器的工具。这属于更进阶的逆向范畴。6. 最佳实践与工程建议掌握了基本方法后遵循一些最佳实践能让你的逆向工作更稳健、更高效。6.1 环境隔离与项目管理虚拟环境为每个逆向项目创建独立的 Pythonvirtualenv或 Node.js 项目避免包版本冲突。配置管理将密钥、URL 等敏感信息存储在环境变量或配置文件中如.env不要硬编码在脚本里。版本控制使用 Git 管理你的逆向脚本和分析笔记。记录每次找到的关键函数和算法变更。6.2 分析策略由简入繁先从没有强混淆的网站练手理解基本流程再挑战有混淆和加密的。对比分析捕获至少 2-3 次成功请求对比参数变化。不变的可能是固定值或设备指纹变化的有可能是时间戳、随机数或基于其他参数计算的值。关注初始化很多加密参数在页面加载初期就已经生成或准备好密钥。让 AI 关注window加载完成 (DOMContentLoaded) 和网络请求开始前的代码执行。6.3 代码实现模块化设计将签名生成、加密解密、请求发送等功能拆分成独立模块如sign.py,encrypt.py,requester.py便于维护和测试。增加日志在关键步骤如构建签名字符串、发起请求前打印日志方便调试。异常处理网络请求必须包含超时、重试和异常处理逻辑。尊重robots.txt在技术研究的同时务必遵守目标网站的robots.txt协议控制请求频率避免对对方服务器造成压力。6.4 与 AI 协作的提示Prompt技巧指令清晰具体不要问“怎么逆向这个网站”而要问“请分析/api/login请求中x-sign参数的生成方式”。提供上下文将你已捕获的请求信息、观察到的现象作为背景提供给 AI。分步进行将大任务拆解成“打开页面-点击按钮-捕获请求-搜索函数-验证函数”等多个清晰的小指令。要求验证对于 AI 给出的结论或代码务必要求它提供验证方法或你自己设计测试用例进行验证。6.5 法律与道德边界授权优先仅将技术用于学习、研究或在拥有明确授权的范围内如公司内部系统测试、公开的 API 接口调试。数据最小化不要抓取个人隐私数据、受版权保护的内容或任何法律禁止的数据。明确免责本文所授技术旨在提升开发者的安全意识和问题解决能力严禁用于任何非法入侵、数据窃取、商业侵权或其他违法活动。使用者需自行承担由此产生的全部责任。逆向工程是一个深度与广度并存的领域。MCP 与 AI 的引入如同给探险家配备了一台高级雷达和智能分析仪它能帮你快速绘制地图、识别陷阱但最终的路仍需你自己去走关键的逻辑判断和工程实现能力依然不可或缺。建议从简单的案例开始逐步积累经验同时深入学习 JavaScript、网络协议和加密学的基础知识这样才能真正从“小白”成长为游刃有余的“高手”。
返回列表