🎬 HoRain 云小助手:个人主页
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
目录
JavaScript逆向工程:破解Mytoken的请求参数
步骤 1:捕获目标请求
-
使用抓包工具:
- 打开浏览器开发者工具(F12),进入 Network 面板。
- 刷新页面或触发目标API请求(如点击“查询数据”按钮)。
- 找到目标请求(通常为
XHR
或Fetch
类型),记录其 URL、Headers 和 Query Parameters。重点关注加密参数(如sign
、token
)。
-
分析请求参数:
- 检查参数是否包含时间戳(如
timestamp=1620000000
)、随机数(nonce=12345
)或加密签名(sign=abcd1234
)。 - 对比多次请求,观察哪些参数是动态变化的,推测其生成逻辑。
- 检查参数是否包含时间戳(如
步骤 2:定位关键JavaScript代码
-
全局搜索关键词:
- 在开发者工具的 Sources 面板,使用 Ctrl+Shift+F 全局搜索以下内容:
- 参数名(如
sign
、encryptKey
)。 - 加密算法关键词(如
md5
、sha256
、CryptoJS
)。 - 拼接字符串的操作(如
params.join('')
)。
- 参数名(如
- 在开发者工具的 Sources 面板,使用 Ctrl+Shift+F 全局搜索以下内容:
-
定位加密函数:
- 示例代码片段:
function generateSign(params) { const sortedKeys = Object.keys(params).sort(); let rawStr = ''; sortedKeys.forEach(key => { rawStr += `${key}=${params[key]}&`; }); rawStr = rawStr.slice(0, -1) + 'SECRET_KEY'; // 拼接密钥 return md5(rawStr); }
- 关键点:参数排序、拼接方式、密钥处理、哈希算法。
- 示例代码片段:
步骤 3:动态调试代码
-
设置断点:
- 在疑似生成参数的代码行设置断点(点击行号左侧)。
- 重新触发请求,代码执行会在断点处暂停。
-
跟踪变量值:
- 使用 Scope 面板查看局部变量(如
rawStr
、sign
)。 - 在 Console 中实时执行表达式(如
md5(rawStr)
)。
- 使用 Scope 面板查看局部变量(如
-
绕过反调试:
- 若遇到无限
debugger
语句,点击调试器的 Deactivate breakpoints(停用断点)图标。 - 使用插件(如 Tampermonkey)注入脚本覆盖
debugger
函数:// ==UserScript== // @name Bypass Debugger // @namespace http://tampermonkey.net/ // @version 1.0 // @description 绕过无限debugger // @match https://mytoken.com/* // @run-at document-start // ==/UserScript== window._originalDebugger = window.debugger; window.debugger = function() {};
- 若遇到无限
步骤 4:还原加密逻辑
-
参数拼接规则:
- 常见方式:按字母排序参数键,拼接为
key1=value1&key2=value2
。 - 可能附加固定字符串(如
&secret=xxx
)或动态密钥。
- 常见方式:按字母排序参数键,拼接为
-
哈希算法识别:
- MD5:生成32位十六进制字符串(如
d41d8cd98f00b204e9800998ecf8427e
)。 - SHA-1:40位十六进制字符串。
- HMAC:需要密钥,常见于
CryptoJS.HmacSHA256
。
- MD5:生成32位十六进制字符串(如
-
代码模拟示例(Python):
import hashlib import time def generate_sign(params, secret_key): # 1. 参数按key排序 sorted_params = sorted(params.items(), key=lambda x: x[0]) # 2. 拼接为 key1value1key2value2... raw_str = ''.join([f"{k}{v}" for k, v in sorted_params]) # 3. 附加密钥并MD5哈希 sign_str = raw_str + secret_key return hashlib.md5(sign_str.encode()).hexdigest() params = { "symbol": "BTC", "timestamp": int(time.time()) } secret = "mytoken_secret_123" # 从JS代码中提取的密钥 sign = generate_sign(params, secret) print(f"Generated sign: {sign}")
步骤 5:验证与优化
-
发送测试请求:
- 使用工具(如 Postman 或 Python requests)携带生成的参数发送请求。
- 示例代码:
import requests url = "https://api.mytoken.com/data" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ..." } params = { "symbol": "BTC", "timestamp": 1620000000, "sign": sign } response = requests.get(url, params=params, headers=headers) print(response.json())
-
处理动态密钥:
- 若密钥通过接口动态获取(如
GET /api/get_secret
),需先请求密钥再生成签名。
- 若密钥通过接口动态获取(如
-
应对代码混淆:
- 使用反混淆工具(如 de4js、JStillery)还原代码结构。
- 动态Hook关键函数(示例使用 Chrome Overrides):
- 在 Sources > Overrides 中创建本地文件夹。
- 找到混淆的JS文件,右键选择 Save for overrides,编辑后保存,刷新页面生效。
注意事项
-
法律与道德:
- 仅用于学习或授权测试,不得用于非法爬取或商业用途。
- 遵守目标网站的
robots.txt
和服务条款。
-
反爬策略:
- IP限制:使用代理池轮换IP。
- 验证码:集成打码平台或OCR识别。
- 请求频率限制:添加随机延迟(如
time.sleep(random.uniform(1,3))
)。
-
调试技巧:
- 使用 Charles Map Local 功能替换线上JS文件为本地修改版本。
- 在 Console 中重写加密函数,直接输出中间值:
window._originalMD5 = window.md5; window.md5 = function(input) { console.log("MD5 input:", input); return _originalMD5(input); }
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙