这篇文章记录一下,我是如何用 python 完成 JS 逆向的,逆向的网站是 x 志愿。本教程只是为了学习相关知识。
1. 案发现场:消失的 200 OK
作为一名合格的爬虫 LSP(Large-Scale Parser,别想歪了),我本来以为爬取一个大学信息列表不过是手到擒来的事。结果,当我兴冲冲地在 Python 里敲下 requests.get() 之后,服务器反手就给了我一个“身份验证失败”。
我盯着那个空的 JSON 响应,陷入了沉思。难道是我的姿势不对?打开 F12 一看,好家伙,原来在 x 志愿 的请求头(Headers)里,藏着一个叫 u-sign 的玄学参数。
这个 u-sign 长得一副 MD5 的“大众脸”(32位字符串),而且只要你换个页码或者改个参数,它就原地变身,导致你的请求瞬间夭折。
2. 侦探上线:追踪“嫌疑人”
逆向的第一步,不是写代码,而是寻根溯源。
搜索是最高级的懒惰
在 Chrome 的开发者工具里,按下那个改变命运的组合键 Ctrl + Shift + F,全局搜索 u-sign。
找到图上的内容,所有的 u-sign。
X 标记了宝藏
找到位置后,我们直接在疑似加密函数的入口处(比如视频中提到的 i 方法)打下一个断点。 刷新页面,程序瞬间被“定身”。这时候我们就像上帝一样,可以俯瞰所有的局部变量。记得所有找到的都要打上这样的蓝色的标。
3. 硬核拆解:剥开 MD5 的外壳
通过滚动加载,触发之前打好的断点。
这里可以看到 u-sign 的生成主要靠一个 o 函数和,2个形参。
获取所要的内容
像我这样通过在断点触发的情况下,如图上操作,就可以获取需要的函数和参数内容。
4. 降维打击:让 AI 替我掉头发
从console中打印出 o 函数以及函数中的2个变量的值,然后将 e 函数和2个变量的内容丢给AI,因为u-sign的生成就是依据固定的算法生成的,所以直接丢给AI,让AI给出完整的可以使用的代码
5. 战果汇报:Python 模拟实现
最后,我们将“秘制配方”封装成一个 Python 函数。大概长这样(严谨起见,这里只展示结构):
Python
import hashlib
def build_u_sign(url: str, data: dict[str, Any] | None = None) -> str:
# build_sign_source 是还原后的的 i 函数
raw = build_sign_source(url=url, data=data)
return hashlib.md5(raw.encode("utf-8")).hexdigest()
带上动态生成的 u-sign 再次请求,那种 JSON 数据如泉水般涌出的感觉,真香![00:06:44]
结语:路漫漫其修远兮
x 志愿 的逆向过程告诉我们一个道理:防守者的门槛,往往就是进攻者的阶梯。
虽然 MD5 签名只是入门级的对抗,但它背后的参数定位、断点调试和逻辑还原思想,是通往更高阶逆向(比如魔改签名、环境自检等)的必经之路。
本教程仅供交流学习,请勿用于非法用途。 毕竟,监狱的伙食可能并没有外卖好吃。
评论区