抓包与网络请求分析
本节目标
- 理解「抓包」在逆向流程里的位置
- 掌握用浏览器 DevTools Network 面板定位加密请求
- 会区分「请求参数加密」和「返回数据加密」
抓包 = 拦截并查看 App/网页和服务器之间的通信。逆向里 90% 的起点都在浏览器的 Network(网络)面板。
打开 DevTools(F12) → Network → 勾选 Preserve log
→ 操作页面触发请求 → 在列表里看每一条请求的
Request Headers / Query String / Request Payload / Response一个可运行的最小演示:用 Node 起一个本地接口,模拟「前端发带 sign 的请求」,你用代码去发同样的请求,体会「参数从哪来」:
// 运行环境:Node.js 18+(无需依赖)
// 运行:node jsr-l2.cjs
// 这是一个「服务端」视角:它要求请求带 sign,且 sign = md5(参数拼接+密钥)
const http = require('http')
const crypto = require('crypto')
function makeSign(obj, secret) {
// 把参数按 key 排序后拼接,再拼密钥,做 md5
const keys = Object.keys(obj).sort()
const raw = keys.map((k) => k + '=' + obj[k]).join('&') + secret
return crypto.createHash('md5').update(raw).digest('hex')
}
const server = http.createServer((req, res) => {
const url = new URL(req.url, 'http://x')
const params = Object.fromEntries(url.searchParams)
const sign = params.sign
delete params.sign
const expected = makeSign(params, 'MY_SECRET')
if (sign !== expected) {
res.end('签名错误')
return
}
res.end('验签通过,返回数据: ' + JSON.stringify(params))
})
server.listen(3000, () => console.log('试访问 http://localhost:3000/?a=1&b=2&sign=' + makeSign({ a: '1', b: '2' }, 'MY_SECRET')))你访问时带上正确 sign 才通过——这就是「前端必须算 sign」的典型结构。逆向要做的,就是把 makeSign 的算法从前端 JS 里抠出来。
名词解释
抓包(Packet Capture):拦截并查看网络通信内容的技术。浏览器 DevTools 的 Network 面板本质就是「抓包工具」,让你看到每一次请求发了什么、回了什么。它是逆向的「眼睛」——没有它你根本不知道要还原哪个参数。
Query String / Request Payload:请求的两种「携带数据」方式。Query String 是 URL 里 ?a=1&b=2 这种(GET 常见);Request Payload 是请求体里的一整段 JSON(POST 常见)。加密参数可能藏在两者任一位置,抓包时要都看。
课后练习
练习 1:怎么判断「是请求参数被加密」还是「返回数据被加密」?
答案:看 Network 面板。如果发出去的请求里某个参数值像乱码/长串(如
sign=8a3f...),是「请求参数加密」;如果服务器返回的内容是密文(如{"data":"U2FsdGVk..."}),前端却能正常显示,是「返回数据加密」。两者还原方向不同。
练习 2:上面 makeSign 里为什么要「按 key 排序再拼接」?
答案:为了保证「参数顺序不同但内容相同」时算出的 sign 一致(否则前端拼参顺序一变,后端校验就失败)。这是签名算法的常见防坑设计,逆向时要注意服务器是否也做了排序。
总结
我的看法:抓包不是「技术活」,是「细心活」。大多数人逆向好几天没进展,问题不在看不懂代码,而在于没在抓包阶段把目标钉死——到底是哪一个请求、哪一个字段、值长什么样。我的方法是:先在 Network 里把「正常请求」和「缺参数的请求」对比,精确定位那个「看起来像加密」的字段,再带着这个字段名(如 sign、__token)去 JS 里全局搜索。搜索关键字选得准,定位时间能从一个小时缩短到一分钟。别急着读代码,先把「敌人」看清。