
这次我们来看一个很有意思的话题AI 能不能用来做逆向分析尤其是 JS 逆向分析。很多资料喜欢把它包装成“魔改浏览器”“5秒盾自动通过”“无限制自动过检测”这类说法既夸大又危险。真正值得关心的是另一件事在授权测试和合规前提下大模型能不能帮我们读懂混淆代码、定位加密参数、梳理调用链节省逆向分析的时间。答案是能而且比大部分模板代码工具顺手得多。这篇文章就围绕“AI 辅助 JS 逆向分析”展开。我会先给核心能力速览再带你搭一套 AI 辅助分析工作流然后用真实可复现的测试用例演示最后给出批量分析、资源占用、常见问题和合规边界。文章里的示例代码都是通用模板需要按实际项目替换路径、接口地址和模型名称。1. 核心能力速览先看 AI 辅助 JS 逆向分析的整体能力边界。这里说的“能力”不是自动破解防护而是把大模型作为“代码阅读副驾驶”减少人工阅读混淆代码的时间。能力项说明分析对象混淆 JS、加密参数生成逻辑、Cookie 生成逻辑、调用链、AST核心功能变量名语义还原、算法识别、调用链梳理、代码注释、报告生成依赖工具Python 3.10、Node.js 16、浏览器 DevTools、LLM API 或本地模型API 能力支持可将大模型 API 接入批量分析脚本批量任务支持脚本批量处理多个 JS 文件输出结构化报告硬件门槛云端 API 无显卡要求本地模型建议 8GB 显存以上典型场景授权渗透测试、源码审计、JS 逆向学习、自身站点防护验证不适合场景绕过认证、绕过验证码、未授权采集、恶意破解AI 逆向分析的本质是把“人读代码”变成“人和模型一起读代码”。模型不负责替你突破安全边界它负责把 A 点混淆入口到 B 点参数生成逻辑之间的路径缩短。从当前常见的 LLM 能力来看市面上主流的大模型都能胜任三类任务变量名赋值、加密算法识别、调用链描述。差异主要在长代码理解能力和格式纪律上。云端模型对长代码支持更好本地模型在代码安全隔离上更有优势两者可以按项目保密等级选择。2. AI 在 JS 逆向里的定位与适用范围AI 不是“无限制”的万能工具它解决的是逆向分析中最耗时的那部分代码语义理解。2.1 AI 能做什么混淆还原把_0x3f2a这种混淆变量名结合上下文还原成requestTime、signature这类可读名称。算法识别看到aes-256-cbc、RSA、PBKDF2、sha256等特征时让模型快速输出算法结构和参数含义。调用链梳理从某个入口函数出发找出它调用了哪些函数、依赖了哪些全局变量。代码注解为一段被压缩成一行的代码生成逐段注释。报告输出把分析结果整理成 Markdown 或 JSON方便直接写入自动化测试报告。2.2 AI 不能做什么不能代替授权。只要目标系统没有授权用什么工具都不合法。不能保证 100% 正确。大模型对混淆代码经常产生“自信的幻觉”尤其是变量名极其随机的代码。不能直接生成可用的自动化越权脚本。这不是能力问题是安全边界问题也是底线问题。从实践来看AI 在逆向分析里更适合“阅读”而不是“爆破”。如果你要做的是理解自己的老项目、审计开源代码里的混淆模块、或者在授权渗透测试里快速定位某个加密参数那么这套工作流非常高效。如果你是想拿它去绕过某个不归你管的网站那这篇文章帮不到你也不应该有人帮你。2.3 合规边界这部分必须明确必须获得目标系统所有者的书面授权或者在本地搭建自己的测试目标。不得使用分析结果制作和传播绕过工具。涉及 Cookie、Token、Session 等身份信息只应在授权测试环境中处理。涉及用户数据应脱敏不落地到公开仓库。不要在公网 VPS 上抓取和分析大量第三方站点脚本这可能触发法律风险。3. 环境准备与前置条件AI 辅助 JS 逆向分析的开发环境并不复杂。核心是三部分分析环境、调试环境、大模型环境。3.1 基础环境操作系统Windows 10/11、Ubuntu 20.04、macOS 12 均可。Python3.10 或更高版本用于写批量分析脚本。Node.js16 或更高版本用于运行 JavaScript 解析和 AST 脚本。浏览器Chrome 或 Edge重点使用 DevTools 的 Sources、Network、Console。抓包工具优先用浏览器自带 Network必要时再用 Fiddler 或 Charles。3.2 大模型环境大模型部分有两种选型云端 APIOpenAI、Anthropic、Google 等大模型服务。优点是长文本能力强无需本地 GPU缺点是代码片段需要上传到外部服务要注意保密要求。本地模型Ollama、LM Studio、vLLM 等框架加载 CodeLlama、Qwen2.5-Coder、DeepSeek-Coder 等代码模型。优点是数据不出本机缺点是显存要求高长上下文版本更吃资源。推荐组合一般项目用云端 API涉密或对数据隔离要求高的项目用本地模型。两种方式对本文的示例都采用 OpenAI 兼容接口风格实际地址和参数以你使用的服务为准。3.3 推荐工具链用途工具说明代码解析babel/parser将 JS 源码解析为 AST语法遍历babel/traverse遍历 AST提取函数名、变量名代码还原js-beautify格式化压缩后的 JS模型调用requests OpenAI 兼容 API通过 Python 调用模型本地模型Ollama一键启动本地模型服务批量分析自写 Python 脚本把 JS 文件批量喂给模型4. 搭建 AI 辅助逆向分析工作流这一章直接进入操作。我会把工作流分成三个模块格式化准备、LLM 接入、批量处理。4.1 格式化混淆代码拿到一段 JS 代码第一件事不是丢给大模型而是先格式化。压缩后的代码一行几万个字符直接提问效果差token 消耗也高。用 Node.js 脚本做格式化npm install -g js-beautifyjs-beautify obfuscated.js formatted.js格式化之后再人工扫一眼把明显无关的代码段删除只保留目标函数附近的部分。这一步能显著提升模型回答准确率。4.2 将大模型接入代码分析下面是一段通用 Python 调用代码。接口风格按 OpenAI 兼容设计如果你用的是 Ollama 本地服务地址填http://127.0.0.1:11434/v1如果你用的是云端 API地址填对应服务地址。import requests API_URL http://127.0.0.1:11434/v1/chat/completions API_KEY ollama # 本地模型通常不需要真实 key云端 API 请替换 def analyze_js(code: str, prompt: str ) - str: payload { model: qwen2.5-coder:7b, messages: [ { role: system, content: 你是 JS 逆向分析助手。你的任务是分析给定代码还原变量名并解释关键逻辑。只输出分析结论不要输出恶意代码。 }, { role: user, content: f{prompt}\n\njavascript\n{code}\n } ], temperature: 0.2 } resp requests.post(API_URL, jsonpayload, headers{ Authorization: fBearer {API_KEY} }, timeout120) resp.raise_for_status() return resp.json()[choices][0][message][content] if __name__ __main__: with open(formatted.js, r, encodingutf-8) as f: js_code f.read() result analyze_js(js_code, prompt请分析这个函数的加密参数生成逻辑。) print(result)注意API_URL、API_KEY、model三个参数必须按实际服务替换。Ollama 默认端口是11434云端 API 的鉴权方式也各不相同。4.3 用 AST 提取关键节点大模型适合理解语义但提取函数列表、参数列表这类结构化操作应该交给 AST。下面是一个基于 Babel 的 Node.js 脚本用来提取代码中所有函数名和 StringLiteral 节点。npm init -y npm install babel/parser babel/traverseconst parser require(babel/parser); const traverse require(babel/traverse).default; const fs require(fs); const code fs.readFileSync(formatted.js, utf-8); const ast parser.parse(code, { sourceType: script, plugins: [] }); const funcs []; const strings []; traverse(ast, { FunctionDeclaration(path) { funcs.push(path.node.id ? path.node.id.name : (anonymous)); }, CallExpression(path) { if (path.node.callee.name) { strings.push(path.node.callee.name); } }, StringLiteral(path) { strings.push(path.node.value.slice(0, 80)); } }); console.log(Functions:, [...new Set(funcs)]); console.log(Strings:, [...new Set(strings)].slice(0, 30));这一步相当于给大模型做一个“重点摘要”减少无效 token 消耗。实际项目中你还可以进一步提取MemberExpression、BinaryExpression把加密算法附近的特征数收集起来。4.4 建立“提问模板”用 AI 做逆向分析最关键的不是模型而是提问模板。推荐一个稳定模板你正在分析一段经过混淆的 JavaScript 代码。 任务 1. 找出这段代码的入口函数。 2. 识别代码中使用的加密或编码算法。 3. 还原主要混淆变量名的含义。 4. 说明参数是如何从原始输入生成最终结果的。 要求 - 只输出分析结论。 - 不要改写或复制整段代码。 - 如果代码不完整明确指出缺少的信息。 - 不要提供绕过任何安全机制的方法。这个模板的核心思想是“让它说结论不让它写解锁脚本”。把模板保存在本地批量调用时直接复用。5. 功能测试与效果验证下面是几组可以直接试验的测试用例。为了让流程可复现我会使用一段简化的示例代码。实际项目里把示例代码替换成你授权范围内的目标代码即可。5.1 测试一混淆变量名语义还原测试目的验证模型能否根据上下文还原_0x1、_0x2这类混淆变量名。输入示例function _0x1(_0x2) { var _0x3 _0x2 ; var _0x4 abcdefghijklmnopqrstuvwxyz; for (var _0x5 0; _0x5 _0x2.length; _0x5) { _0x3 _0x4.charAt(_0x2.charCodeAt(_0x5) % 26); } return _0x3; }操作步骤将代码保存为demo1.js。用上面的analyze_js函数提问“请还原这个函数的变量名并说明它的作用。”预期输出模型应该输出类似这样结构的内容该函数接收一个原始字符串 input。 - _0x2 可还原为 input。 - _0x3 可还原为 output初始值为 input 。 - _0x4 可还原为 charset。 - _0x5 可还原为 index。 函数作用对每个字符取 ASCII 码与 26 取模映射到字母表拼接生成一个短签名。判断成功标准模型给出的还原名与真实业务含义基本一致且函数作用描述与实际逻辑相符。常见失败原因上下文不足。如果函数引用了全局变量或外部函数模型只能猜测。解决办法是把相关调用上下文一并贴给模型。5.2 测试二加密算法识别测试目的验证模型能否准确识别代码中的加密/编码算法。输入示例const crypto require(crypto); function sign(params) { const sorted Object.keys(params).sort(); const str sorted.map(k k params[k]).join(); return crypto.createHash(sha256).update(str salt).digest(hex); }操作步骤将代码保存为demo2.js。提问“这段代码生成了什么签名参数顺序有什么规律”预期输出使用 SHA-256 哈希加了固定盐值。参数按 key 排序后拼成 query string哈希后输出十六进制字符串。判断成功标准模型正确识别 SHA-256、排序规则和盐拼接逻辑。常见失败原因代码中包含多个算法时模型容易只提一个。建议在模板中增加“按代码出现顺序列出全部算法”。5.3 测试三调用链梳理测试目的验证模型能否梳理“入口 - 处理 - 加密”的调用关系。输入示例function main(url) { var params buildParams(url); var encrypted encrypt(params); return send(encrypted); } function buildParams(url) { return { u: url, t: Date.now() }; } function encrypt(obj) { return btoa(JSON.stringify(obj)); } function send(data) { return new Promise(function(resolve) { resolve(https://api.example.com/submit?data encodeURIComponent(data)); }); }操作步骤将代码保存为demo3.js。提问“请输出调用链并指出每个函数对数据做了什么。”预期输出main(url) - buildParams(url) 生成 { u, t } - encrypt(params) 将对象 JSON 序列化后 Base64 编码 - send(data) 拼接到请求 URL判断成功标准调用链顺序正确数据变换描述无原则性错误。常见失败原因函数之间存在间接赋值模型容易漏掉。可结合 AST 脚本先提取函数之间的调用关系再让模型补充描述。5.4 测试四Cookie 生成逻辑理解这个场景只限于两个合规方向一是分析你自己开发的应用二是授权测试中理解目标系统的 Cookie 生成逻辑。目的是形成防御或测试报告不是制作绕过工具。测试目的验证模型能否从一段 JS 中还原 Cookie 值的生成依赖。输入示例function getCookie() { var d new Date(); var timestamp d.getTime(); var rand Math.floor(Math.random() * 100000); var raw v timestamp . rand; return raw | hexEncode(raw); } function hexEncode(s) { var out ; for (var i 0; i s.length; i) { out s.charCodeAt(i).toString(16); } return out; }操作步骤将代码保存为demo4.js。提问“这个 Cookie 值由哪些部分组成哪些是时间相关的”预期输出Cookie 由 vtimestamp.random 与 hexEncode(raw) 以竖线拼接。timestamp 来自 Date.now()random 来自 Math.random()。判断成功标准模型能正确拆出两个部分并识别随机数和时间戳依赖。常见失败原因模型对Math.random的作用理解正确但对hexEncode的输出格式可能描述不准确。最好补充函数调用示例让模型算一遍。6. 接口 API 与批量任务AI 辅助逆向的上限在于批量处理能力。手动一段一问太慢下面给出一套可落地的批量分析脚本思路。6.1 批量脚本设计import os import json import time import requests API_URL http://127.0.0.1:11434/v1/chat/completions API_KEY ollama MODEL_NAME qwen2.5-coder:7b INPUT_DIR ./js_input OUTPUT_DIR ./analysis_output MAX_RETRY 3 def analyze_js_file(filename: str, content: str, prompt: str) - dict: messages [ {role: system, content: 你是 JS 逆向分析助手只输出 JSON 格式结果。}, {role: user, content: f{prompt}\n\njavascript\n{content}\n} ] payload { model: MODEL_NAME, messages: messages, temperature: 0.2, response_format: {type: json_object} } for attempt in range(MAX_RETRY): try: resp requests.post( API_URL, jsonpayload, headers{Authorization: fBearer {API_KEY}}, timeout180 ) resp.raise_for_status() return {file: filename, ok: True, result: resp.json()[choices][0][message][content]} except Exception as e: print(f[retry {attempt 1}] {filename} failed: {e}) time.sleep(5) return {file: filename, ok: False, error: max retry exceeded} def main(): os.makedirs(OUTPUT_DIR, exist_okTrue) prompt ( 请分析这段 JavaScript 代码\n 1. 提取入口函数和关键函数名。\n 2. 识别加密算法。\n 3. 还原混淆变量名。\n 4. 用 JSON 输出{funcs, algorithms, notes}\n 不要输出绕过安全机制的代码。 ) for fn in os.listdir(INPUT_DIR): if not fn.endswith(.js): continue with open(os.path.join(INPUT_DIR, fn), r, encodingutf-8) as f: content f.read()[:8000] # 单次分析截断前 8000 字符避免超长 result analyze_js_file(fn, content, prompt) out_path os.path.join(OUTPUT_DIR, fn.replace(.js, .json)) with open(out_path, w, encodingutf-8) as f: json.dump(result, f, ensure_asciiFalse, indent2) print(f[done] {fn} - {out_path}) time.sleep(1) # 控制请求频率 if __name__ __main__: main()这个脚本做了几件事遍历js_input目录下所有.js文件。截断超长内容避免触发模型上下文限制。失败自动重试 3 次。结果输出为 JSON 文件。请求之间加 1 秒延时避免把本地模型或 API 服务打满。6.2 批量任务注意事项分批处理如果文件很多建议每 50 个文件一批观察输出质量后再继续。结果缓存已经分析过的文件不要重复调用直接把结果写入本地缓存。人工抽检批量输出不能直接作为最终结论。目的是找出可疑代码区域再由人工确认。日志记录记录每个文件的分析耗时、成功与否、token 消耗方便预算控制。7. 资源占用与性能观察AI 逆向分析对硬件的要求取决于你选用哪种模型部署方式。7.1 云端 API云端 API 对本地硬件几乎无要求只要能跑 Python 和浏览器即可。成本体现在 token 消耗上。一段 2000 字符的 JS可能消耗 2000 到 4000 token具体取决于 prompt 模板和模型上下文窗口。建议在批量任务前用 5 个样本估算单次 token 消耗再推算总预算。7.2 本地模型本地模型建议用 7B 到 14B 参数量的代码模型。7B 量化模型在 8GB 显存环境下可以运行14B 量化模型建议 12GB 显存以上。实际显存占用取决于模型参数量。量化精度。上下文长度。并发请求数量。观察方式Linux 用nvidia-smi。Windows 用任务管理器 GPU 面板。Ollama 服务会打印日志也能看到请求延迟。不要迷信某个固定的显存数字。同一个模型不同量化版本、不同上下文长度显存占用可能差几 GB。第一次跑先小参数测试再逐步增大。7.3 提高吞吐量的方法增加并发在脚本里用ThreadPoolExecutor或asyncio并发请求但要注意目标服务限流。减少输入用 AST 脚本提前裁剪代码只分析目标函数。复用会话部分 API 支持会话上下文可以把多个文件放在同一轮对话中减少重复 system prompt。降温度固定为 0.2 以下输出更稳定也更容易解析成 JSON。8. 常见问题与排查方法问题现象可能原因排查方式解决方案模型分析结果明显错误输入代码上下文缺失检查贴入的代码是否只截取了局部函数补充全局变量、调用方代码长混淆代码超出 token 上限上下文窗口不足查看 API 报错信息截断代码、删除无关模块、用 AST 压缩本地模型显存不足模型参数量过大或上下文过长用nvidia-smi查看显存占用换小参数量模型或降低上下文长度批量脚本频繁超时并发过高或单次请求体过大查看服务端日志降低并发、增加超时时间、减少单次输入输出格式不稳定模型没有严格遵循 JSON 要求检查 response_format 是否生效增加示例输出并在 system prompt 中给出 JSON 结构变量名还原非常牵强混淆变量没有业务语义检查代码段是否太短引入更多上下文或改用测试驱动方式反推模型给出绕过安全机制的建议指令边界不清晰检查 prompt 中是否明确禁止在模板中加入禁止绕过安全机制条款AST 解析报错JavaScript 版本特性导致查看报错栈中位置调整babel/parser的 plugins加入jsx、typescript等遇到“模型胡说”不要硬信。AI 逆向分析的正确姿势是AI 给出方向人类验证结论。尤其涉及 Cookie 生成、签名算法时一定要在真实运行环境里打日志把模型输出的推断和实际结果对照。9. 最佳实践与合规建议9.1 建立“最小授权目录”建议在本地创建一个authorized/目录只放入你有权限分析的代码。不要从公网批量下载第三方脚本后直接开跑。把授权来源记录在 README 里包括授权方、日期、分析范围。9.2 不输出完整绕过链路分析报告建议只保留“算法识别结论”和“风险建议”不要附带可直接复制运行的绕过脚本。真实项目里你需要的是一份给开发、运维看的修复报告不是给测试人员用的调用链。9.3 涉及浏览器自动化时如果你要做网页自动化测试只能在完全授权的测试站点上进行。自动化脚本应控制在低频、低并发、有限数据集范围内。不要用“自动通过检测”这类思路去绕过任何站点的反自动化机制这既不稳定也不合法。9.4 模型输出验证凡是模型给出的关键结论必须用小脚本验证。比如模型说“这段逻辑是 SHA256 盐”就实际用 Node.js 跑一遍比对签名结果是否一致。验证通过之后结论才能写进报告。node -e const crypto require(crypto); const str a1b2salt; const hash crypto.createHash(sha256).update(str).digest(hex); console.log(hash); 对比模型描述和实际输出是最有效的防幻觉手段。9.5 审计与留痕如果是在渗透测试项目中使用 AI 辅助分析建议保存每次分析请求的摘要文件哈希、模型名称、输入截断长度、输出结论、人工复核人员。这种留痕既是对委托方负责也是对自己负责。10. 总结与下一步AI 在 JS 逆向分析里最值得尝试的点不是“自动破解”而是“辅助阅读”。把混淆代码丢给大模型让模型先还原语义、识别算法、输出调用链再由人工复核确认整个分析周期能压缩不少。文章建议的使用顺序先跑通本地 LLM API 调用用 5.1 节的最小示例验证模型输出是否符合预期。搭好 AST 脚本对代码做结构摘要降低 token 消耗。用批量脚本分析一批文件注意结果抽检。建立授权目录和审计日志把工作流固化成项目模板。最容易踩的坑有三个一是把未授权代码直接喂给大模型二是完全信任模型输出结果三是用“绕过防护”的思维替代“理解防护”的思维。后续可以继续扩展的方向很多把 AST 摘要和 LLM 分析合并成一个管道接入 CI 做依赖代码安全审计或者让模型生成一份带代码定位的 Markdown 报告直接给到开发修复。只要边界清晰AI 就能成为逆向分析流程里很可靠的助手。这篇内容适合收藏备用尤其是做 JS 逆向、爬虫工程和安全测试的同学可以把它当作一套起步工作流来搭。