AI Agent辅助Web逆向:AST解析与大模型驱动的JS代码分析实战

发布时间:2026/10/13 3:35:32
AI Agent辅助Web逆向:AST解析与大模型驱动的JS代码分析实战 每隔一段时间总会看到有人问拿到一个不熟悉的网站怎么快速看懂它的前端加密参数搜索接口在哪一堆混淆过的 JS 代码到底从哪里开始看过去的标准流程是打开 DevTools → 打断点 → 翻 Source 面板 → 顺着调用栈一点一点摸。这套流程有效但极度依赖经验。遇到稍微长一点的代码光“看代码”就得耗上半天。尤其是现在前端工程化越来越重代码被编译、压缩、混淆之后变量的含义已经丢失字符串被拆分重组函数名变成_0x3f2a这种随机样式人工阅读成本非常高。AI Agent 的出现正在改变这个过程。它不是把逆向变成“一键通杀”而是把代码阅读、调用关系梳理、思路记录这些重复劳动交给大模型让人集中在判断和验证上。本文会完整拆解一套 AI Agent 辅助 Web 代码分析的搭建流程包括环境准备、核心模块、电商场景下的实战步骤、完整源码示例和常见问题排查。在开始之前我想先给一个明确的判断Agent 不是万能钥匙。它能把一个 2 小时的代码阅读任务压缩到 20 分钟但前提是你自己知道浏览器调试怎么用、断点怎么看、调用链怎么理解。工具放大的是你的专业能力而不是替代你的专业能力。“全网最强、通杀一切”这种说法看看就好真正可复用的是工作流和工程方法。在动手之前先补一个更重要的前提你只能分析自己拥有、或已获得明确授权的网页和接口。未授权抓取、绕过付费墙、处理他人敏感数据都是明确越界的行为。本文所有示例都假设你在合法的测试环境中调试自己的项目或者拿到了目标系统的书面授权。下面开始。1. 先泼一盆冷水Agent 不是“通杀”而是“加速器”如果你的预期是“扔一个 URL 进去Agent 自动把签名算法、接口依赖、数据流全部吐出来”那大概率会失望。当前大模型在代码分析上的强项是语言理解而不是动态执行。它能读代码、解释逻辑、整理调用关系但它不知道代码在浏览器里运行时实际产生了什么值。举个例子。一个典型的电商商品列表接口前端请求 URL 里往往带sign、token、ts这类参数。ts是时间戳sign是由某个函数根据请求参数计算出来的签名。人工分析时你会打断点、看调用栈、观察参数传入传出最终还原出签名算法。Agent 能做的是把 JS 文件切成结构化摘要识别出sign这个字符串出现在哪些函数附近然后把“这段代码大概在做什么”翻译成人能理解的语言。它会告诉你“在_0x3f2a函数里参数a和b被拼接后做了某种哈希运算”。但它不能替代你断点验证不能替代你确认a到底是不是timestamp更不能自动生成一个能通过风控的完整请求。表格对比传统流程和 Agent 辅助流程环节传统人工分析Agent 辅助分析阅读压缩 JS逐行看容易漏生成结构化摘要快速定位关键函数调用链整理手写笔记或依赖记忆自动输出函数调用列表参数含义推断靠经验和动态调试给出候选解释标注不确定性加密逻辑还原看完后人工写复现代码生成初步算法描述仍需人工验证验证环节打断点、重放请求Agent 只能生成验证方案不能保证通过所以Agent 的角色是“加速器”而不是“通杀器”。真正适合用它的读者是做过几单简单逆向但每次都要花大量时间读压缩代码。需要在短时间内梳理多个 JS 文件的逻辑。团队里有新人希望用 AI 生成注释和调用链缩短上手时间。安全测试、合规分析场景中需要快速理解目标前端逻辑。不适合用它的人是把 Agent 当成免死金牌、完全不懂 HTTP 和浏览器调试、又想去打未授权目标的人。这种人无论用什么工具都走不远。2. 核心概念Web 逆向分析到底在分析什么在展开代码之前先统一概念。很多人把“逆向”理解成一个很神秘的词其实落到 Web 前端它的核心就是三件事2.1 接口识别请求从哪里来先看 DevTools 的 Network 面板找到触发某个数据加载的 XHR/Fetch 请求。找到之后记录 URL、请求方法、请求头、请求体、响应结构。这一步是整个分析的地基。2.2 参数生成逻辑追溯很多站点不会把关键参数放在明面上而是在前端 JS 里动态生成。比如sign md5(ts secret params)这样的逻辑编译压缩后散落在某个 JS 文件里。你需要找到“这个参数是什么时候生成的”“由哪个函数生成”“依赖哪些输入”。2.3 链路依赖理解JS 文件之间会互相引用接口响应可能又触发下一个 JS 加载。一个页面背后可能同时存在十几个接口数据流是 A 接口给 B 接口提供参数。把这条链路画清楚才叫真正理解了目标系统。AI Agent 在前端代码分析里的定位是帮你加速 2.1 到 2.3 里的“读代码”部分。具体能力包括AST 解析把源码转成语法树让程序可以批量检索函数、变量、字符串。语义归纳把“某个深层嵌套的函数”翻译成“这是一个拼接请求参数的函数”。调用链可视化统计函数之间的调用关系输出结构化列表。报告生成把分析结果整理成 Markdown 或 JSON方便团队协作。注意AST 解析工具本身是成熟技术Agent 只是调度它。理解这一点你就知道 Agent 并不是在黑魔法而是把传统的“先静态扫描、再人工读代码”变成了“先静态扫描、AI 读一遍、人只看重点”。3. 合规底线与授权边界这篇文章反复提到合规不是套话而是因为 Web 代码分析很容易滑向灰色地带。写清楚边界比教技巧更重要。合法的场景包括分析你自己开发和维护的前端项目。在获得授权的漏洞测试、安全评估项目中分析目标系统。在测试环境、模拟站点上研究前端签名算法目标是提升自己的安全能力。使用公开 API且遵守服务条款和 robots 协议。绝对不要做的事对未授权站点进行批量数据采集。绕过登录、付费墙、风控机制去获取受限内容。抓取和分析其他用户的订单、个人信息、支付数据。利用发现的漏洞去攻击生产系统。如果你发现目标系统存在未授权接口或安全缺陷正确的做法是验证后立刻停止通过官方渠道报告而不是继续深入或公开展示。涉及认证、权限或生产数据时坚持最小权限原则只用测试账号只访问测试数据只在隔离环境验证。代理池、验证码识别、自动化点击绕过风控这类话题不属于本文讨论范围也不会在后续内容中出现。理解思路永远比滥用工具重要。4. 环境准备与 Agent 项目结构先搭建一个最小可用的 Agent 分析工程。本文的示例使用的是通用技术栈不绑定某个厂商的专属平台所有 LLM 调用都抽象成“请求一个 chat completion 接口”方便替换模型。4.1 运行环境Node.js 16用来运行 AST 解析脚本版本请以实际安装为准。Python 3.10用来组织 Agent 流水线。如果环境较老将下文中的Optional[str]改为str即可。一个可用的 LLM API支持 OpenAI 兼容的/v1/chat/completions接口即可模型名称请按实际填写。Git方便保存和迭代 Prompt 模板、脚本版本。安装 Node 依赖npm init -y npm install babel/parser babel/traverse如果项目里出现 JSX、TypeScript 等代码解析时需要调整 parser 的 plugins。本文示例先处理普通 JavaScript实际遇到什么语法再加对应插件。4.2 LLM 配置采用环境变量注入 API Key不要把密钥写在代码里。export LLM_API_KEYsk-xxxxxxxx export LLM_BASEhttps://api.openai.com export LLM_MODELgpt-4o-mini如果使用的是其他兼容服务商把LLM_BASE换成对应地址即可。4.3 项目结构web-agent-analyzer/ ├── tools/ │ └── extract_ast.js # AST 解析脚本 ├── agent_pipeline.py # Agent 主流程 ├── prompt_templates/ # 存放各种提示词模板 │ └── analyze_code.md ├── reports/ # 生成的分析报告 ├── samples/ # 待分析的 JS 文件 │ └── target.js ├── package.json └── requirements.txtprompt_templates/单独放提示词是为了方便版本管理。提示词的改动会直接影响报告质量把它当成代码一样维护是 Agent 工程化的关键。5. 核心模块一AST 解析把混淆 JS 变成结构化摘要AST 全称是 Abstract Syntax Tree抽象语法树。简单理解就是把一段代码“拆骨架”函数声明、变量声明、调用关系、字符串常量全部变成可遍历的节点。压缩混淆过的代码虽然难以阅读但 AST 解析器仍然能还原它的结构骨架。下面是一个完整可运行的 AST 提取脚本。它的作用是读取一个 JS 文件输出函数列表、调用关系、字符串常量和属性访问链。// 文件路径tools/extract_ast.js // 用途读取一个 JS 文件输出函数、调用关系、字符串常量清单JSON const fs require(fs); const parser require(babel/parser); const traverse require(babel/traverse).default; const filePath process.argv[2]; if (!filePath) { console.error(用法: node tools/extract_ast.js js文件路径); process.exit(1); } const code fs.readFileSync(filePath, utf-8); let ast; try { ast parser.parse(code, { sourceType: unambiguous, }); } catch (e) { console.error(解析失败: ${e.message}); process.exit(1); } const result { functions: [], calls: [], strings: [], objectChains: [], }; function nodeName(node) { if (!node) return ; if (node.type Identifier) return node.name; if (node.type ThisExpression) return this; if (node.type MemberExpression) { return nodeName(node.object) . nodeName(node.property); } return ; } traverse(ast, { FunctionDeclaration(path) { result.functions.push({ kind: function, name: path.node.id ? path.node.id.name : anonymous, params: path.node.params.map((p) nodeName(p)), start: path.node.start, end: path.node.end, }); }, CallExpression(path) { result.calls.push({ callee: nodeName(path.node.callee), start: path.node.start, }); }, StringLiteral(path) { const value path.node.value; if (typeof value string value.length 0) { result.strings.push(value); } }, MemberExpression(path) { const name nodeName(path.node); if (name.length 0) { result.objectChains.push(name); } }, }); console.log(JSON.stringify(result, null, 2));这个脚本的定位是“给 Agent 的第一双眼睛”。运行方式node tools/extract_ast.js samples/target.js reports/ast.json输出内容包含四类信息字段含义在逆向分析中的作用functions所有函数声明快速看到代码里有哪些命名函数calls函数调用记录还原调用链定位入口strings所有字符串常量寻找接口路径、加密标识符、参数名objectChains属性访问链找window.foo.bar这类全局访问为什么先做这一步因为直接把 100KB 压缩代码丢给大模型会产生三个问题超出上下文窗口或者 cost 爆炸。输出冗长重点被淹没。大模型把大量时间花在“读代码”上忽略了分析判断。先结构化再交给 LLM是控制质量的关键也是 Agent 工作流和“直接扔代码给 ChatGPT”的核心区别。6. 核心模块二LLM 生成注释与调用链分析报告拿到 AST 摘要后就可以让大模型干活了。这一节给出 Agent 主流程的完整代码。# 文件路径agent_pipeline.py 最小可用的 Agent 分析流水线 1. 调用 extract_ast.js 生成 AST 摘要 2. 构造分阶段提示词 3. 调用大模型生成解释与调用链报告 4. 保存 Markdown 报告 import json import os import subprocess import sys from typing import Optional import requests def extract_ast(js_path: str) - dict: result subprocess.run( [node, tools/extract_ast.js, js_path], capture_outputTrue, textTrue, checkTrue, ) return json.loads(result.stdout) def call_llm(messages, model: Optional[str] None) - str: api_key os.getenv(LLM_API_KEY) base_url os.getenv(LLM_BASE, https://api.openai.com) model model or os.getenv(LLM_MODEL, gpt-4o-mini) resp requests.post( f{base_url}/v1/chat/completions, headers{Authorization: fBearer {api_key}}, json{model: model, messages: messages, temperature: 0.2}, timeout60, ) resp.raise_for_status() return resp.json()[choices][0][message][content] PROMPT_TEMPLATE 你是一个 Web 前端代码分析助手。下面是一段从授权分析项目中提取的 JS 结构信息 json {structure}请完成两件事用通俗中文解释这段代码的职责标注关键函数、变量和字符串常量。如果存在加密参数生成逻辑说明可能的输入和输出不要猜测不存在的逻辑。 生成 Markdown 报告包含调用链分析。 def generate_report(js_path: str) - str: print(f[1/3] 解析 AST: {js_path}) structure extract_ast(js_path) print(f[2/3] 提取到 {len(structure[functions])} 个函数、 f{len(structure[calls])} 个调用、 f{len(structure[strings])} 个字符串。)messages [ {role: system, content: 你是严谨、克制的代码分析助手只做基于输入结构的推断禁止编造。}, {role: user, content: PROMPT_TEMPLATE.format( structurejson.dumps(structure, ensure_asciiFalse, indent2) )}, ] print([3/3] 调用 LLM 生成报告...) report call_llm(messages) out_path reports/report.md os.makedirs(reports, exist_okTrue) with open(out_path, w, encodingutf-8) as f: f.write(report) print(f报告已保存: {out_path}) return out_pathifname main: if len(sys.argv) 2: print(用法: python agent_pipeline.py js文件路径) sys.exit(1) generate_report(sys.argv[1])运行方式 bash python agent_pipeline.py samples/target.js这里有一个容易犯的错误把 AST 摘要一次性塞进提示词导致输出变成“JSON 复读机”。解决思路是分级推进。第一轮先用摘要生成一个大纲第二轮再把关注度最高的函数切片提取出来单独请求大模型做细读。例如Agent 发现字符串列表里有sign相关字样就可以自动触发第二轮提取该字符串附近 300 行的代码片段。让大模型解释“这个值是怎么参与计算的”。输出候选参数列表和需要人工验证的环节。把“一次读全部”改成“先扫描再聚焦”报告质量会稳定很多。这也是 Agent 编排和大模型原生能力之间真正的分界线。7. 电商平台实战商品接口分析全流程下面用一个典型场景串起全部步骤。假设你有一个自己开发的电商 Demo 站点或者拿到了某电商项目的书面授权需要分析商品列表接口的签名参数生成逻辑。7.1 定位前端代码打开 DevTools切到 Network 面板找到商品列表请求。选中 XHR 过滤定位到类似list?keyword书包page1sign...的请求。把响应和请求参数记录下来。注意观察 URL 和载荷里有哪个参数是“动态的”时间戳会随时间变化签名会随其他参数变化。7.2 搜索关键字切到 Sources 面板打开前端 JS 文件全局搜索sign、md5、sha、encrypt、secret等关键词。很多压缩代码里函数名被改了但字符串常量还保留着原始语义。如果页面加载了多个 JS可以配合 Network 面板按资源大小排序优先看体积最大的那个。7.3 保存文件并运行 AST 解析把定位到的 JS 文件保存到本地。注意压缩代码可能非常大几 MB 的 JS 文件直接丢进大模型并不现实。先用工具切分。例如使用extract_ast.js提取该文件的函数和字符串摘要node tools/extract_ast.js samples/target.js reports/ast.json然后手动浏览ast.json里的strings和functions确认sign相关字符串出现了几次、出现在哪个函数附近。这一步不需要 AI肉眼扫 JSON 就已经比在一整段压缩代码里翻找快得多。7.4 交给 Agent 做语义归纳接着运行python agent_pipeline.py samples/target.js预期输出报告会包含调用链分析例如window.getSign接收参数obj内部调用md5函数将obj.keyword obj.page timestamp按固定顺序拼接后计算哈希返回 32 位字符串。看到这种描述不要急着信。它只是基于静态结构做的推测。下一步必须回到 DevTools 验证。7.5 断点验证在 DevTools 里给getSign下断点触发一次商品查询。观察传入参数、函数内部每一步的运算结果。确认参数顺序是否和 Agent 描述一致。是否还夹带了页面环境信息比如 userAgent、屏幕宽度。时间戳是否是毫秒级。断点验证通过后才可以把这段逻辑复现到自己的测试脚本里。复现时只在自己有权调用的测试接口上做验证不要做突发高频请求。7.6 链路整理商品列表接口通常不是孤立的。它可能先请求config接口拿到一个种子值再用种子里的一部分参与签名计算。这种情况下把多个 JS 文件都交给同一套流水线处理python agent_pipeline.py samples/config.js python agent_pipeline.py samples/list.js然后对照两份报告标记出跨文件的依赖关系。Agent 适合逐份分析但“哪份 JS 先加载、哪个接口先启动”这件事仍然要用 DevTools 的 Network 时间线和 Initiator 面板确认。8. 常见问题与排查思路问题现象可能原因排查方式解决方案AST 解析报错JS 文件包含 JSX 或较新的语法查看报错信息确认语法类型在解析脚本中增加plugins如jsx、typescriptLLM 报告内容太泛提示词没有约束输出格式检查 messages 里的 system prompt要求引用具体函数名、变量名并输出调用链段落调用链不完整压缩代码使用动态函数调用静态分析看不到对比 DevTools 中的实际调用栈用断点记录真实调用顺序补全到报告中接口参数复现不对参数拼接顺序或输入格式有误逐字段对比断点处的运行时值在测试环境重放请求分步验证各字段批量分析被限流请求频率过高或请求头特征明显查看 429/403 响应降低并发、增加间隔、使用测试账号和隔离环境这里最值得强调的一点是静态分析报告不是结论。大模型的通病是会“自信地编造”它会补全缺失的逻辑把未知的部分修饰成已知。所以每一条 Agent 输出在落到代码之前必须经过断点验证。建议把验证结果追加到报告末尾形成“推理 vs 实证”两条记录方便后续复查。9. 最佳实践与工程化建议最后补充一些工程层面的建议。这些经验比任何“通杀技巧”都耐得住时间。9.1 授权先行留痕归档每个分析任务都应该记录目标、时间、授权依据。可以用一个简单的case目录存放授权说明、JS 文件、AST 摘要和最终报告。将来如果有人问起“当时为什么分析这个”你能拿出完整的合规链路。9.2 最小权限原则在测试环境中只使用测试账号绝不使用生产环境账号做验证。涉及个人数据时只保留脱敏后的字段。对任何请求都要控制频率不要给自己站点的测试接口造成压力。9.3 Prompt 模板版本化Prompt 是最容易被忽略的“代码”。把不同的提示词模板放入prompt_templates/用 Git 管理改动。记录“这个模板在什么场景下表现好在什么场景下失效”。随着项目积累你会拥有一套比任何公开教程都适配自己业务的提示词库。9.4 输出结构化让 Agent 始终输出 JSON 和 Markdown 两种格式。JSON 方便机器解析Markdown 方便人阅读。示例{ function: getSign, params: [keyword, page, timestamp], algorithm: md5(keyword page timestamp), confidence: medium, needVerify: [param order, timestamp unit] }结构化输出最大的收益是即使这次分析结论有误下一次也能自动化地对比新旧报告找出差异点。9.5 人机协作别让 Agent 全自动全自动是效率的陷阱。让 Agent 自动生成报告没问题但让 Agent 自动重放签名请求、自动批量访问目标站点就是在把自己推向风险区。正确姿势是Agent 负责读和写人负责判断和验证。9.6 成本控制LLM 调用是按 token 计费的JS 文件动辄几百 KB全部塞进去既慢又贵。更好的做法是先用 AST 摘要把文件压缩到几 KB再决定哪些函数需要细读。对大型 JS 文件可以按函数切片分批请求最后再汇总。这个思路不仅省钱还能显著提升报告质量。10. 总结与后续学习方向AI Agent 在 Web 代码分析中的价值不是“全能破解”而是把“读代码、写注释、理调用链”这些脏活自动化。本文的核心流程可以概括成四步用 AST 解析器把压缩 JS 变成结构化 JSON。用第一轮提示词让 LLM 生成全局概览。针对可疑函数提取切片做细读。回到 DevTools 打断点验证把实证结果写回报告。这套流程用到今天依然有效而且不绑定特定模型。无论底层换成开源模型、国产模型还是闭源模型工作流本身是稳定的。如果你想继续深入推荐按这个顺序学习JavaScript 混淆原理字符串编码、控制流扁平化、变量名重写。AST 操作学会用babel/parser和babel/traverse改代码而不只是读代码。浏览器调试技巧条件断点、调用栈、日志点。HTTP 协议基础请求头、状态码、缓存、鉴权。Agent 工作流编排把多个工具串成流水线学会设计提示词和工具调用。不要迷信“最强”和“通杀”。真正值钱的是你对浏览器调试和代码逻辑的理解AI Agent 只是帮你把理解力放大一点。在合规前提下动手练一练哪怕从一个自己写的 Demo 站开始也比收藏十个模板有用得多。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询