知乎web后端api小逆向
知乎web后端api请求小逆向
前言
其实这个有点小水,但是水又不太可能,因为我最近打算用react native框架,搓一个第三方知乎的客户端,客户端就肯定要有api,知乎等这些大厂的后端api请求,都是有加密的,看的就是加密的难和易了,不过经过我的实际验证,可以证明,知乎的加密和反爬虫非常厉害,有大量的混淆和拆分,逆向过程还算是比较艰难的,这也就是不可能水的原因。
但是其实在这之前,我已经通过逆向一个开源知乎app的项目,已经做到了知乎api的逆向,这个基本上没有什么难度,稍微读一下源代码就完成了,所以已经对知乎整个加密过程已经有了一大部分的掌握了,也拿到了它们用来加密的base64的加密密钥,但是现在又来重新逆向玩一下知乎api,所以说有点先射箭再画靶的感觉,所以说有点小水。
思路
XHR断点
这种逆向的通用思路,肯定第一步都是下断点,找到发出请求的位置,随便找个关键词下XHR断点,我用了me作为关键词,因为api请求地址就是这个,并且还算比较唯一,这个没什么难度,直接就可以断到了发出请求的位置
于是我想尝试跟小黑盒后端逆向一样,把整个js文件拿到,然后直接去做分析,不过这一次还是异想天开了,知乎的反爬虫很厉害,首先它把文件拆成了很多份,很多不同的模块,不像小黑盒,就是vue打包出来的一个main.js,堆栈最顶上的js文件并没有任何有用的信息,其实实际上就算有用的信息,也收集不到,因为知乎的反爬虫非常厉害,它们也根本没用明文来存Base64的自定义字符表,而是一点点的字符串拼接而成的,还配有了各种的混淆,非常的阴间。
分析堆栈
既然栈顶的文件没有什么用处,那就只能往后面来,按照堆栈的顺序,从新到旧来找调用,看到什么时候的在函数的参数里面没有看到header的 x-zse-96 ,就顺着这个调用堆栈往下面依次来找就可以了。
最终我发现了可疑的一个点。
就是在调用堆栈的这个位置,你会发现函数传进来的参数已经找不到x-zes-96了,那么显而易见,从这里到上一个位置,就是生成了加密的核心 x-zes-96 的代码了,定位到这里,就已经完成逆向的50%了。
断点单步
既然找到关键位置了,那么必不可少的,下断点,单步执行,再这之前,记得把之前的XHR断点取消了,那个断点已经没有用了,我们现在只需要跟着断点走,就肯定会找到加密部分的js代码了。
现在要做的,就是频繁的单步或者跳出函数,慢慢往下走,尝试看能不能找到关键的代码,同时在单步的同时,主要看一下中间变量的header参数,只要没有出现 x-zes-96 ,那就肯定没执行到那里,需要继续往下走。
当你单步执行到这里的时候,就找到关键位置了,这里就是生成加密的核心,可以看到, 101 ,还有 _ 这种字符串拼接的字符。
1 | var tc = function(tt) { |
并且可以分析上面的代码,很容易可以看到,这是从tu里面传出来的,而tu又是由最上面的1514函数传进来的,所以下一步我们要做的,就是对1514函数下手了。
分析加密函数
定位到1514函数附近
这个1514函数非常长,这就是生成密钥的关键部分了,这个也算是知乎反爬虫的精华了,技术顶尖。
这个可以理解是一个手写的cpu,把js代码拆成很小的汇编指令集,顶级的混淆,很难从中分析出具体的逻辑,不过我也不打算从中拿到具体的处理逻辑,我只尝试了获取到自定义字符集的内容。
闭包获取字符集
尽管代码被高度混淆,但自定义字符集最终还是会在某个地方被定义或组装。通过在关键位置设置断点,并利用闭包的特性,我们可以检查函数作用域内的变量,从而获取到这个字符集。
1 | var D = function(tt) { |
在1514函数的末尾处,有一个这样的调用,利用js中闭包的特性,D函数导出了__g,ZP又把D导出了,那么__g就不会随着函数的结束而被销毁,而是被留在了内存中。
这就是js中的闭包,接下来我们在这里设下断点,并且运行到这里,打印出__g。
这里面的内容,就是我们苦苦追寻的答案了。
其中 “6fpLRqJO8M/c3jnYxFkUVC4ZIG12SiH=5v0mXDazWBTsuw7QetbKdoPyAl+hN9rgE”,这个就是知乎的base64的自定义字符集,等号需要去掉,这里是他们作为分割符放到这里了。
总结
本次逆向知乎web后端API的过程,再次验证了知乎在反爬虫和代码混淆方面的强大实力。尽管过程充满挑战,尤其是在面对其将JS代码拆解成“汇编指令集”式的顶级混淆时,但通过XHR断点、堆栈分析、单步调试以及利用JS闭包特性,我们最终成功定位并提取了生成加密核心 x-zse-96 的关键逻辑,获取到了知乎自定义的Base64字符集。
但是要知道,获取到这个信息,只是整个逆向的一小步,还没有触及到它们的核心加密逻辑的部分,这里还是不得不佩服其他早已经完成知乎后端逆向api的人,道阻且长。







