js逆向解析技巧

js逆向解析技巧

一、总结

一句话总结:

1、chrome浏览器的使用--js断点调试 找到js加密的关键部位
2、使用execjs或者pyV8等比较主流的python调用js模块

以对美团店铺抓取时需要破解的_token加密为准。


二、js逆向解析技巧

转自或参考:js逆向解析技巧--selenium_JavaScript_weixin_34235457的博客-CSDN博客
https://blog.csdn.net/weixin_34235457/article/details/91469725

   下面内容以对美团店铺抓取时需要破解的_token加密为准。

1. chrome浏览器的使用--js断点调试

    以美团为例,点进美团的美食页面,使用f12打开开发者工具。清空当前产生的各种请求,然后点击下一页,会发现重新生成大量的请求。切换到xhr页面观察是否通过ajax进行的请求,我们发现getPoiList开头的请求返回了我们需要的结果。

   然而观察该请求所携带的参数我们发现,大多数参数是可以通过找规律的办法得到解决的,但_token这个参数是被加密过得,我们无法获取到它的值,这就需要通过反编译来解决问题。

   通常情况下,我们可以全局搜索_token来看是否能找到对其进行加密的js,但有的时候,数据的整个键值对都是被加密过得(参考知乎登陆的加密),我们无法通过键找到对应值得加密算法。这时候可以尝试搜索请求url中的关键部分来定位加密部位。

   我们可以看到,根据getPoiList我们找到了_token的的值为d,d又是通过Rohr_Opt.reload(p)方法进行加密得到想要的结果的。

   我们在这个位置打上断点,再次执行下一页,当执行到reload时,我们进入找到了_token的加密js,打上断点继续观察就可以看到加密的整个流程了,如果你是js高手,可以尝试解密js,然后用python重写,这样结果的性能会好一些,但我这里使用了python直接调用js的方法进行加密。

   以上就是js加密的关键部位了。到这里chrome的断点调试完成。

2. python实现js代码的调用

   通常来讲,使用execjs或者pyV8是比较主流的python调用js模块,但因为我两者都安装失败了,暂时没法使用,因此使用selenium的execute_script方法进行js调用。首先,我们将其改造成一个html文件rohr.html,并且为其添加一个可被外界调用的返回函数ssss,如下:

  1. <html>
  2. <head>
  3. <meta http-equiv="content-type" content="text/html;charset=utf-8" />
  4. <title>Checkbox</title>
  5. <script type="text/javascript">
  6. var Rohr_Opt = new Object;
  7. Rohr_Opt.Flag = 100007;
  8. Rohr_Opt.LogVal = "rohrdata";
  9.  
  10. (function() { var _$_543c = ["x75x6Ex64x65x66x69x6Ex65x64",
  11. .................
  12. ])})();
  13.  
  14. function ssss(url){
  15. return Rohr_Opt.reload(url);
  16. }
  17. </script>
  18. </head>
  19. <body></body>
  20. </html>复制代码

   使用python对其进行调用:

  1. from selenium import webdriver
  2. import os
  3.  
  4. file_path = 'file:///' + os.path.abspath('rohr.html')
  5. print(file_path)
  6. browser = webdriver.Chrome()
  7. browser.get(url=file_path)
  8. jv = "https://bj.meituan.com/meishi/api/poi/getPoiList?cityName=北京&cateId=0&areaId=0&sort=&dinnerCountAttrId=&page=3&userId=&uuid=7dc6d913fda1472c8d42.1552289338.1.0.0&platform=1&partner=126&originUrl=https://bj.meituan.com/meishi/pn3/&riskLevel=1&optimusCode=1"
  9. data = browser.execute_script('return ssss()', jv) # 这里使用execute_script调用了ssss函数,并传入参数jv
  10. print(data) # data即我们加密后的_token
  11. browser.close()复制代码

第一行是rohr.html文件的绝对路径,第二行即我们所需要的_token的加密结果

转载于:https://juejin.im/post/5c893dd36fb9a049a712adc5

 
原文地址:https://www.cnblogs.com/Renyi-Fan/p/12650390.html