今天给大家带来某头条的_signature签名破解。
目标URL:
aHR0cHM6Ly93d3cudG91dGlhby5jb20v
用base64解密得到。
图1-1
在推荐模块,这就是我们想要抓取的内容,X条的是下拉XHR请求,所以……抓包看一下吧。
抓包分析
因为是XHR异步请求,所以在抓包的时候将XHR请求过滤出来。当下拉加载触发后,可以看到请求列表中只有一条请求。
图2-1
我们观察发现此请求的response正是我们想要抓取的结果。
再来看一看请求参数。
图2-2
max_behot_time:明显是一个时间戳。
as:看不出来,应该是个加密。
cp:同as。
_signature:一大串加密字符串。
真让人头大……三个加密参数。没法,硬着头皮破解吧。
破解as/cp
虽然说是破解as/cp,可是全局搜索as/cp显然不太好使,上来就查看调用栈也有些麻烦,所以先搜索一下_signature。
图3-1
如图3-1,我们先进入第一个看看。进去之后在文件内搜索_signature。
图3-2
可以看出signature是由o赋值的,而o又是由:
o = (0,p.calcSignature)(this.url, this.params)
这个函数获得的,如果在断点时刻将this.params输出到控制台的话:
图3-3
可以发现其实_signature是由as/cp两个参数通过一系列加密获得的,_signature暂且不谈。
图3-2的this._setParams(t)这个函数十分可疑,怀疑为as/cp的生成函数,因为this.params这个参数在this._setParams(t)执行过后会发生变化。所以二话不说打上断点跳进去。
图3-4
这是跳进来的入口,观察发现var e的值就是新生成的as/cp的值,然后在函数的最后,也就是s.default出将新的as/cp覆盖到this.params上面,这就好办了,在光标位置打好断点再次跳入。
图3-5
这就是as/cp的加密地点了,将其扣出来,试运行一下,发现不行,显示o.default未定义,在浏览器上对应的这一行重新打好断点,跳进去看看o.default这个函数这个到底什么样。
图3-6
发现就是C函数啊,这就好办了。将1285-1439行的全部复制下来,顺便将图3-5内的o.default改成大写的C。预览一下,大概是这个样子的。
图3-7
运行一下:
图3-8
哦!我的老天鹅啊,出来了。
破解_signature参数
有了as/cp的基础,再回到我们最初的地方。
图4-1
从光标处跳入。
图4-2
这里的window.byted_acrawler.sign(a)就是生成_signature的地方了,a的值就是一个字典对象,里面包含一个带参数的url。
二话不说跳进去吧。
图4-3
跳进来之后你会惊呼WTF什么鬼?在想一个一个的追踪扣函数,那会扣的你头皮发麻,各种跳来跳去的for 循环搞得你怀疑人生。这一步也是卡了我好久。
将这页代码copy出来,放到webstrom上,按ctrl+shitf+-折叠一下
更多内容请关注我的公众号,web爬虫与js逆向,我也是个js逆向新人,大家一起交流进步。
【教程仅限学习交流,请勿用于非法用途】