原文链接

寻找请求条件与参数

准备爬虫的时候,我们要知道什么?我们必须知道API请求的参数,请求的方法、请求的头是哪些。入下图:

爬虫之JS解密(逆向) - Arvin's Blog - 图1
请求头里面有JWT和一个token,可能是我们必须要求的。我们也没有在cookies中找到他,那可能是JS里面发起的请求。

我们就必须知道他是由什么请求生成的JWT。开启浏览器抓包,刷新页面,我们要注意是否有数据包返回值为token:qgemv4jr1y38jyq6vhvi和JWT密文。找了所有返回包,仅仅发现有JWT的返回包,如下图:

爬虫之JS解密(逆向) - Arvin's Blog - 图2
并无返回结果为token:qgemv4jr1y38jyq6vhvi的返回包,那么有可能这个token是在JS中有浏览器的id加密成的也有可能就是在JS中的硬编码。直接在浏览器中搜索JS文件是否存在qgemv4jr1y38jyq6vhvi。如下图所示:

爬虫之JS解密(逆向) - Arvin's Blog - 图3
他是存在JS中的硬编码,那么就可以不管它,直接拿来用即可。对https://api.interpreter.caiyunai.com/v1/user/jwt/generate以JSON格式发起POST请求,并附带上参数{browser_id: “cba5c021d7ef12a51be1f97fb0d1dc5e”}即可得到JWT
这样一来我们就有了token和JWt那么就可以对翻译接口发起请求结果返回图下图。Emmmm这结果居然被加密的如下图所示:

爬虫之JS解密(逆向) - Arvin's Blog - 图4
API返回的结果是H3SfVBnmdBJScD==,从头到尾的的返回包,就没有见到“Sql
注入”的影子,那么结果只有一个。这个是加密过后的数据,那么并没有其他请求已H3SfVBnmdBJScD==作为参数向服务器发送请求解密,所以他只能用JS进行解密。

JS调试

JS如何调试?在没有一切反调之前,他是如下图所示:

爬虫之JS解密(逆向) - Arvin's Blog - 图5
在粘贴待翻译的文本在文本框的同时快速点击箭头指向的⏸按钮,即可进入调试模式。在调试模式中,我们可以一直按

爬虫之JS解密(逆向) - Arvin's Blog - 图6
直到出现加密结果,接下来JS肯定是解密,要不然做其他没意义的事情,只会影响用户体验。现在我可以使用步入一个一个看,很快就能找到解密处,入下图:

爬虫之JS解密(逆向) - Arvin's Blog - 图7
不会解密的也没关系,我们只要复制这一段代码。放到Python中用python执行JS代码即可。

  1. function le(t) {
  2. var e;
  3. return function(t) {
  4. return Zt.decode(t)
  5. }((e = function(t) {
  6. return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".indexOf(t)
  7. }
  8. ,
  9. t.split("").map(function(t) {
  10. return e(t) > -1 ? "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm"[e(t)] : t
  11. }).join("")))
  12. }
  1. import execjs
  2. #最终return的是这个是根据最后解密后的变量的名称,这里是t
  3. decode=execjs.compile(
  4. """
  5. function le(t) {
  6. var e;
  7. return function(t) {
  8. return t
  9. }((e = function(t) {
  10. return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".indexOf(t)
  11. }
  12. ,
  13. t.split("").map(function(t) {
  14. return e(t) > -1 ? "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm"[e(t)] : t
  15. }).join("")))
  16. }
  17. """
  18. )
  19. t="H3SfVBnmdBJScD=="
  20. result=decode.call('le',t)
  21. print(result)

注意这个注释。如下图:

爬虫之JS解密(逆向) - Arvin's Blog - 图8
爬虫之JS解密(逆向) - Arvin's Blog - 图9
python执行的结果,和JS调试的结果一样,但是得到这个解密后的字符串好像也不是我们要的答案,最后t会进入Zt.decode()由于我调试了之后,是base64解码我就不详细讲解。

爬虫之JS解密(逆向) - Arvin's Blog - 图10
回到JS刚刚解密方式,如果用python来那么我也不算是逆向了,其实玩了几年的CTF我真的是一眼看出来他是凯撒密码。

写个凯撒解密跑一下偏移,得到偏移位为13。

在很多很多爬虫中经常会遇到我们想要的结果被加密,可以尝试用JS逆向