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 = ["\x75\x6E\x64\x65\x66\x69\x6E\x65\x64",
  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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM