refactor: 将文件从子目录提升到仓库根目录

所有文件从 hello_js_reverse_skill/ 子目录移至仓库根目录,
使项目结构更清晰,便于作为 Skill 直接引用。

Made-with: Cursor
This commit is contained in:
白夜
2026-03-18 22:55:27 +08:00
parent cfd0cc919d
commit fb14cf7916
29 changed files with 0 additions and 0 deletions
+152
View File
@@ -0,0 +1,152 @@
# 示例:某网站请求签名逆向分析
> 这是一个虚拟的分析示例,展示完整的逆向分析流程。
## Phase 1:目标侦察
### 目标信息
- **网站**: https://example.com/data
- **目标**: 采集商品列表数据
- **接口**: `GET /api/v1/products?page=1&sign=xxx&t=1710000000`
### 网络请求分析
使用 MCP 工具捕获请求:
```
[js-reverse] list_network_requests(resourceTypes=["XHR"])
→ 发现数据接口: /api/v1/products
[js-reverse] get_network_request(reqid=42)
→ 获取完整请求信息
```
**请求详情**:
```
URL: https://example.com/api/v1/products?page=1&sign=a1b2c3d4e5f6...&t=1710000000
Method: GET
Headers:
Cookie: session=abc123; token=xyz789
X-Request-Id: 9f8e7d6c
```
**加密参数分析**:
| 参数 | 示例值 | 长度 | 字符集 | 初步判断 |
|------|--------|------|--------|---------|
| sign | a1b2c3d4e5f67890... | 32 | hex | MD5 |
| t | 1710000000 | 10 | 数字 | 时间戳(秒) |
## Phase 2:静态分析
### 搜索加密入口
```
[js-reverse] search_in_sources(query="sign=")
→ 在 /static/js/app.js 第 1234 行找到: params.sign = generateSign(page, timestamp)
[js-reverse] search_in_sources(query="generateSign")
→ 在 /static/js/utils.js 第 567 行找到函数定义
```
### 读取关键代码
```
[js-reverse] get_script_source(url="https://example.com/static/js/utils.js", startLine=560, endLine=590)
```
还原后的关键代码:
```javascript
function generateSign(page, timestamp) {
var SECRET = 'my_secret_key_2024';
var raw = page + '|' + timestamp + '|' + SECRET;
return md5(raw);
}
```
## Phase 3:动态验证
### 注入 Hook 验证
```
[js-reverse] inject_before_load(script="XHR Hook + generateSign Hook")
[js-reverse] navigate_page(type="reload")
[js-reverse] list_console_messages()
```
Hook 输出:
```
[Hook:Custom] generateSign 调用
[Hook:Custom] 参数: [1, 1710000000]
[Hook:Custom] 返回: "e10adc3949ba59abbe56e057f20f883e"
```
### 验证 MD5
```javascript
const crypto = require('crypto');
const raw = '1|1710000000|my_secret_key_2024';
const sign = crypto.createHash('md5').update(raw).digest('hex');
console.log(sign); // e10adc3949ba59abbe56e057f20f883e ✓ 匹配!
```
## Phase 4:Node.js 还原
选择 **模式A:纯 Node.js 算法还原**。
### 加密函数
```javascript
const crypto = require('crypto');
const SECRET = 'my_secret_key_2024';
function generateSign(page, timestamp) {
const raw = `${page}|${timestamp}|${SECRET}`;
return crypto.createHash('md5').update(raw).digest('hex');
}
```
### 请求脚本
```javascript
async function fetchPage(page) {
const t = Math.floor(Date.now() / 1000);
const sign = generateSign(page, t);
const response = await axios.get('https://example.com/api/v1/products', {
params: { page, sign, t },
headers: {
Cookie: 'session=abc123',
'User-Agent': 'Mozilla/5.0 ...',
},
});
return response.data;
}
```
## Phase 5:验证
运行结果:
```
[*] 项目:商品数据采集
[+] 正在采集第 1/5 页... ✓ 获取 20 条数据
[+] 正在采集第 2/5 页... ✓ 获取 20 条数据
[+] 正在采集第 3/5 页... ✓ 获取 20 条数据
[+] 正在采集第 4/5 页... ✓ 获取 20 条数据
[+] 正在采集第 5/5 页... ✓ 获取 20 条数据
[+] 采集完成,共 100 条数据
============================== 计算结果 ==============================
答案:125890
======================================================================
```
## 涉及的逆向技能点
1. Network 抓包分析
2. JS 源码搜索定位
3. MD5 签名还原
4. XHR Hook 验证
5. Node.js 纯算法模拟请求