JS 逆向串联全链路技术解析
一、JS逆向概述
// download:itazs.fun/4804/
JavaScript逆向工程是指通过分析、理解和修改JavaScript代码,揭示其内部逻辑和实现机制的过程。在现代Web开发中,JS逆向技术广泛应用于:
- 安全审计与漏洞挖掘
- 爬虫开发与数据采集
- 前端性能优化分析
- 第三方接口研究
- 反爬机制破解
二、逆向技术基础
1. 必备工具集
调试工具:
- Chrome DevTools (Elements/Network/Sources/Console面板)
- Firefox Developer Tools
- Fiddler/Charles (网络抓包)
- Wireshark (底层协议分析)
反混淆工具:
- AST反混淆工具 (Babel、esprima)
- js-beautify (代码格式化)
- de4js (在线反混淆)
- WebStorm (代码分析)
辅助工具:
- Postman (API测试)
- Node.js (本地执行环境)
- Python + Requests (自动化测试)
- IDA Pro/Ghidra (二进制分析)
2. 核心分析技能
- 调用栈分析 (Call Stack)
- 断点调试 (Breakpoint)
- Hook技术 (Proxy/Object.defineProperty)
- 内存分析 (Memory Snapshot)
- 事件监听分析 (Event Listeners)
三、逆向全链路流程
1. 目标定位阶段
1.1 网络请求分析
- 使用Network面板记录所有请求
- 过滤XHR/Fetch请求
- 分析关键API请求参数
- 检查请求签名/加密逻辑
1.2 关键入口定位
- 搜索关键字符串 (如"encrypt"、"sign")
- 全局搜索API端点
- 事件监听器分析
- 调用栈回溯
2. 代码分析阶段
2.1 反混淆处理
// 典型混淆代码示例
var _0x3f2a = ['\x48\x65\x6c\x6c\x6f', '\x77\x6f\x72\x6c\x64'];
function _0x45a1(_0x3f2a12, _0x45a1d2) {
return _0x3f2a[_0x3f2a12];
}
console[_0x45a1('0x0')](_0x45a1('0x1'));
反混淆策略:
- 字符串提取还原
- 控制流平坦化处理
- 常量传播优化
- 死代码消除
2.2 AST分析与重构
// 使用Babel进行AST转换示例
const parser = require('@babel/parser');
const traverse = require('@babel/traverse').default;
const generator = require('@babel/generator').default;
const code = `function add(a, b) { return a + b; }`;
const ast = parser.parse(code);
traverse(ast, {
BinaryExpression(path) {
if (path.node.operator === '+') {
path.node.operator = '*';
}
}
});
const output = generator(ast).code;
// 输出: function add(a, b) { return a * b; }
3. 算法还原阶段
3.1 加密算法识别
- 常见加密特征识别:
- AES: 固定块大小(128bit),常见模式(CBC/ECB)
- RSA: 使用公钥/私钥对
- Base64: 结尾常有'='填充
- MD5/SHA: 固定长度哈希值
3.2 参数逆向示例
// 假设目标网站签名算法逆向示例
function generateSign(params) {
// 1. 参数排序
const sortedParams = Object.keys(params)
.sort()
.map(k => `${k}=${params[k]}`)
.join('&');
// 2. 拼接密钥
const secret = 'x$12*_d#@';
const signStr = sortedParams + secret;
// 3. MD5哈希
return md5(signStr).toUpperCase();
}
4. 模拟实现阶段
4.1 Node.js实现示例
const crypto = require('crypto');
function md5(text) {
return crypto.createHash('md5').update(text).digest('hex');
}
function createRequest(params) {
const sign = generateSign(params);
return {
url: 'https://api.example.com/data',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Signature': sign
},
body: JSON.stringify(params)
};
}
4.2 Python实现示例
import hashlib
import requests
def generate_sign(params):
sorted_params = '&'.join([f'{k}={v}' for k, v in sorted(params.items())])
sign_str = sorted_params + 'x$12*_d#@'
return hashlib.md5(sign_str.encode()).hexdigest().upper()
def make_request(params):
sign = generate_sign(params)
headers = {
'X-Signature': sign,
'Content-Type': 'application/json'
}
return requests.post(
'https://api.example.com/data',
json=params,
headers=headers
)
四、高级逆向技术
1. WebAssembly逆向
分析流程:
- 提取wasm模块
- 使用wabt工具链反编译
- 分析导出函数
- 使用Emscripten生成胶水代码
# 使用wasm2wat反编译
wasm2wat module.wasm -o module.wat
# 使用wasm-decompile
wasm-decompile module.wasm -o module.dcmp
2. 反调试技术绕过
常见反调试手段:
- console.log检测
- devtools检测
- 调试器断点检测
- 执行时间检测
绕过方法:
// 重写console方法
console.log = function(){};
console.warn = function(){};
// 禁用调试器检测
Object.defineProperty(window, 'debuggerCheck', {
get: function() { return false; },
configurable: false
});
// 使用Worker执行关键代码
const workerCode = `postMessage(computeSomething());`;
const blob = new Blob([workerCode]);
const worker = new Worker(URL.createObjectURL(blob));
3. 浏览器自动化
Puppeteer示例:
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
(async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
// 绕过WebDriver检测
await page.evaluateOnNewDocument(() => {
Object.defineProperty(navigator, 'webdriver', { get: () => false });
});
await page.goto('https://target.site');
// 执行逆向后的函数
const result = await page.evaluate(() => {
return window.encryptData('test123');
});
console.log('Encrypted:', result);
await browser.close();
})();
五、防护与对抗
1. 常见防护措施
代码层面:
- 变量名混淆
- 控制流混淆
- 字符串加密
- 代码分块加载
- WebAssembly核心逻辑
架构层面:
- 动态密钥轮换
- 请求频率限制
- 行为指纹分析
- 验证码验证
- 设备指纹识别
2. 混淆技术示例
高级混淆实现:
// 控制流平坦化示例
function obfuscatedAdd(a, b) {
const states = [0, 1, 2, 3, 4];
let state = 0;
let result;
while (states.includes(state)) {
switch (state) {
case 0:
result = 0;
state = 1;
break;
case 1:
result += a;
state = 2;
break;
case 2:
result += b;
state = 3;
break;
case 3:
return result;
default:
throw new Error('Invalid state');
}
}
}
六、实战案例分析
案例1:某电商平台签名算法逆向
分析过程:
- 发现所有请求都有
x-sign头部 - 全局搜索"x-sign"定位生成代码
- 分析生成逻辑包含:
- 参数按ASCII排序
- 拼接时间戳
- HMAC-SHA256加密
- Base64编码
还原实现:
const crypto = require('crypto');
function generateECommerceSign(params, timestamp, secret) {
const sorted = Object.keys(params)
.sort()
.map(k => `${k}=${params[k]}`)
.join('&');
const signStr = `${sorted}&t=${timestamp}`;
const hmac = crypto.createHmac('sha256', secret);
hmac.update(signStr);
return hmac.digest('base64');
}
案例2:某视频网站加密参数破解
挑战:
- 核心逻辑在WebAssembly中
- 动态加载代码片段
- 反调试保护
解决方案:
- 使用Memory断点定位关键数据
- 导出wasm模块进行静态分析
- 使用Emscripten生成C伪代码
- 发现核心是AES-CBC加密
- 通过XHR断点捕获动态密钥
七、法律与道德边界
-
合法合规逆向:
- 仅用于安全研究
- 遵守网站robots.txt
- 不绕过付费内容
- 不侵犯用户隐私
-
风险规避:
- 控制请求频率
- 使用合理User-Agent
- 不传播逆向结果
- 遵守DMCA规定
-
推荐实践:
- 优先使用官方API
- 联系平台获取合作
- 遵循数据最小化原则
- 尊重知识产权
八、未来发展趋势
- Wasm的普及:更多核心逻辑转向WebAssembly
- AI辅助逆向:机器学习辅助代码分析
- 动态防护增强:运行时代码自修改技术
- 硬件级验证:WebAuthn等硬件绑定技术
- 联邦学习应用:分布式模型保护关键算法
结语
JS逆向工程是一项需要深厚技术积累的工作,涉及网络协议、加密算法、浏览器原理等多领域知识。随着Web技术的不断发展,逆向与防护的对抗将持续升级。技术人员应当以提升安全防御能力为目的,在法律和道德框架内合理应用这些技术。