有段时间没有更新文章了,之前写好的某吧发帖脚本突然全部失效。排查后发现,某吧进行了一次大更新,接口新增了一个 sign 参数。这章我们就针对 sign 这个参数进行某吧 sign 参数逆向分析,彻底解决脚本调用问题。
本文目录
一、抓包定位 sign 参数
首先需要确定分析的切入点。按 F12 打开谷歌浏览器抓包工具,随便打开一个某吧点一下“最新”选项卡,可以发现抓包工具抓到了一个 /c/f/frs/page_pc 的 POST 请求包,请求主体包含 sign 参数。
请求方式:POST
请求地址:https://tieba.baidu.com/c/f/frs/page_pc
{
"kw": "bilibili",
"pn": "1",
"is_good": "0",
"cid": "",
"sort_type": "0",
"is_newfrs": "1",
"is_newfeed": "1",
"rn": "30",
"rn_need": "10",
"tbs": "f3a8f22bc1cc74f71776578469",
"subapp_type": "pc",
"_client_type": "20",
"sign": "cffbccb8badb00467d9a0e73c509844b"
}

二、搜索定位 sign 生成位置
找到目标参数后,下一步就是定位它的生成逻辑。通过浏览器搜索 sign: 关键词,看 sign 参数是在哪里赋值的。发现有很多 JS 文件都包含 sign 参数。

这里有个实用的筛选技巧:像 sign: 'xxxxx' 和 assign: 这种写死的就不用关注了。我们只关注 sign: xxx() 或 sign: e 这种类型,这些都是在调用函数或者是使用变量动态赋值的,也是我们寻找某吧 sign 加密算法入口的关键特征。
三、断点调试锁定生成函数
我们先给 sign: xxx() 这样类型的全部打上断点,然后再点一下贴吧的“精华”选项卡,就看到断点成功断下来了。断下来的位置在:
sign: A(n, '', '')
分析代码结构可以看出,sign 参数的值就是由 A 函数生成的了。在 sign: A(n, '', '') 处设置断点,准备深入分析其内部逻辑。

四、控制台验证生成逻辑
为了确认判断无误,复制 A(n, '', '') 这段代码在控制台运行一下来确认。经过运行,确实是由 A 函数生成的,其中 A 函数里面的 n 传递的是组装好的 URL 请求参数。生成的 sign 的值和抓包到的 sign 长度是一致的,由此完成了贴吧 sign 参数解密的初步验证。

五、代码扣取与依赖补全
直接跟进函数 A 里面开始扣代码。把 A 函数扣下来在本地调用运行,发现缺少 h 函数,还依赖了其他函数。

解决这个问题的方法很简单:从 A 函数所在的位置往上追溯,找到最顶层的 s 函数,把 A 函数往上到 s 函数全部复制下来,确保所有依赖的函数都完整不缺失。

六、本地运行验证
再进行运行,发现生成的 sign 值和浏览器生成的值一致,说明没有问题。最后看了一下代码,这是一个标准的 MD5 算法。

七、常见问题与解决方案
- Q1:断点没有断下来是什么原因?
- 原因分析:可能是断点打在了错误的位置,或者页面加载时还没有绑定事件。
- 解决方案:刷新页面后重新触发操作(点击”最新”或”精华”选项卡),确保断点在代码执行时被命中。
- Q2:扣下来的代码本地运行报错 “h is not defined”?
- 原因分析:
A函数依赖了同模块内的其他函数,单扣A函数会缺失依赖。 - 解决方案:从
A函数往上追溯,把整段包含依赖函数的代码块全部复制下来。
- 原因分析:
- Q3:生成的 sign 值和抓包不一致怎么办?
- 原因分析:传入
A函数的参数n与抓包时的请求参数不完全一致。 - 解决方案:在断点处仔细查看
n的具体值,确保本地传入的参数字符串与之一模一样。参数拼接顺序通常按 ASCII 码升序排列。
- 原因分析:传入
总结
通过本次某吧 sign 参数逆向分析,我们定位到了加密入口并成功在本地复现。该算法本质是标准 MD5 哈希,逆向难度不高。配合之前逆向的 Acs-Token 等参数,某吧的请求模拟已可正常进行。
本文由林石工作室提供技术支持,转载请注明出处。