大家好,续《Python爬虫之Js逆向案例(1)-知乎搜索》分享之后,有小伙伴在评论区说让分享一下关于x-zst-81字段的逆向。今天本着分析这个字段来看如何分析这个字段,就目前来看,还没发现这个加密字段是用在哪里的,如果有小伙伴知道其用途的话,可以在评论区里说一下,不过虽然没有用到,但并不影响我们对这个字段进行逆向的研究和学习!
下面会进行以下几步进行分析(下方演示过程全部使用chrome浏览器);
- 破解关键字段;
老步骤,直接搜索x-zst-81字段,如下图,此时会有很多个位置出现,我们只需留意x-zst-81: XXX这种赋值格式的位置即可;
通过断点,发现x-zst-81字段是由xZst81字段赋值的,如下图:
所以我们继续搜索xZst81字段出现的赋值位置,通过断点,定位到如下位置:
断点到这个位置后,我在控制台直接运行这个n(),发现打印的结果也确实是接口请求头里的内容,接下来我们就重点来看这个n函数到是如何处理这个加密数据的。
点击上面图中的链接,跳转到n函数如下图的位置2772行:
这时我们还发现了一个x-zst-81字段中起始位置的3_2.0,看来重头戏实在2760行后半部分这个函数的逆向了。
通过对M函数内部几行断点,我们发现,G,D这两个字符串的名字对应osa|osd,查看localStore和cookie确实找到了这两个内容;所以2722行,2723行,的值就找到了;
通过断点,我们发现e[c("0x19b")](Z, t, n, C)这句话的意思就是将t,n,C三个参数传到Z函数里运行而已;
2723行的t|n都找出来了,还有个Z和C,断点后发现,Z就是一个函数,C是个加密内容,我们先看C是如何生成的?
三.确定加密字符串C通过查找,很容易找到这个字段C,如下图:
这段代码我们直接扣出来,把里面加密的字段如c("0x114") 在控制台直接输出一下放到抠出来的代码里,可直接运行,我们不用管这个函数内部是如何实现加密的,结果如下图:
现在还差一个Z函数了?
Z函数的位置也是不要太明显了,如下图:
通过断点我们发现2760行上面这个for循环其实就是把,传进来的三个字段进行拼接成一个字符串,赋值给了t变量,e[c("0x1a2")](f, t)这行的意思同上面那个一样,参数t传给函数f去执行;
现在重点变成了2760行的f是如何运行的?
五.解密函数f通过断点,我们进去到函数f的具体实现位置,如下图:
encodeURI就不用说了吧,那么重点就变成了__g._e2函数了,这时我们发现这个R函数上下文是个独立的模块,于是把这个模块扣下来改写一下运行,如下图:
报错了,缺啥补啥,通过调试发现,这个atob是代码里自己实现的一个atob,那就atob函数抠出来,不深究,再运行,如下图:
我艹,成了!!!开心到起飞!!!
这时细心的我发现好像哪里不对劲吧,对比一下,R函数运行的结果,发现输出的内容跟他们输出的不一致呀!!!因为上面的tt是我断点时从控制台打印出来的加密前的字符串,瞬间头秃了不是???那就继续研究为什么会这样呢???
六.加密结果不一致研究有经验的同学可能一下就怀疑到一个地方,运行不报错,但是结果不一样的话,一般都是代码里的try-catch块可能捕获了异常,所以我们把抠出来的代码块里的catch里加上console.log打印一下看看,是不是被捕获了,如下图:
通过控制台的报错信息我们大致可以猜到,加密时调用了一些原生函数,顿时感觉情况不太妙啊!!!
在加密过程中,如果调用原生函数的话,有两个可能:
- 简单取值;
- 校验浏览器环境;
通过调试,发现很不幸,确实是在考验浏览器环境,,,
时间原因,今天先分析到这里,等我补完一个环境之后把后续的继续分享!!!
想看后续的老铁,在评论区讲出来,你们的点赞、评论就是我的动力!动力!动力!



