目錄
- 一、前言
- 二、網站代碼分析
- 三、環境安裝
- 四、代碼部分
- 導庫
- 完整代碼
- 方法1
- 方法2
- 五、總結
一、前言
對于爬蟲來說除了抓取資料以外, 還有的就是面對各種網站的反爬機制, 有圖片驗證碼, 滑塊, 問題類等等的反爬機制, 而js逆向也是最常見的一種, 而微信公眾號登錄的請求也是對密碼進行了一個js加密的, 對于明文的方式請求是絕對失敗的. 所以就要模擬一下他的js加密然后把加密后的資料當作引數進行請求介面.
二、網站代碼分析
- 通過瀏覽器抓包找到登錄的介面, 查看傳遞的引數其中pwd是進行加密了的資料, 對于一些熟悉加密的朋友來說, 大概就知道了這個是md5的一個加密方法.

- 對引數pwd進行全域搜索找到相關的js加密檔案
- 通過搜索之后出來的結果就只有3個, 一個是css 一個是js 另外一個是主頁的html, 所以應該就是這個js了

- 通過搜索之后出來的結果就只有3個, 一個是css 一個是js 另外一個是主頁的html, 所以應該就是這個js了
- 點擊js之后格式化js進行全域搜索pwd關鍵字, 對可疑地方打斷點

- 我大概對5個可疑的地方打了斷點, 反正可疑的都打上, 也不虧

- 打完斷點之后, 重新請求登錄介面, 對代碼進行分析
- 請求登錄介面之后可以看到這個地方,我們的pwd還是以明文的方式在代碼里面的,所以到這里還是未進行加密的, 但是這里呼叫了一個目前還未知的方法名為’l’的方法, 我們需要點擊右上角↓的按鈕或者點擊F11步入方法查看.

- 請求登錄介面之后可以看到這個地方,我們的pwd還是以明文的方式在代碼里面的,所以到這里還是未進行加密的, 但是這里呼叫了一個目前還未知的方法名為’l’的方法, 我們需要點擊右上角↓的按鈕或者點擊F11步入方法查看.
- 可以看到進入方法之后, 是直接回傳了一個加密之后的資料, 然后把這個回傳的資料和請求介面的pwd進行對比后發現是一致的, 可以確定是這里加密的了.

- 向上可以看到一大堆看不懂的類似于這樣的東西就大概可以確定是md5加密了

- 把一整個代碼塊復制, 然后用發條js除錯工具除錯→沒有的自己去百度下載
- 在運行的時候發現報錯, 'n’未定義

- 在運行的時候發現報錯, 'n’未定義
- 在最上面定義一個空的字典n, 就可以加載成功了

- 因為該函式未命名, 所以我們給他改一個名字, 然后再次加載代碼, 測驗運行一下是否正常回傳加密后的密碼
- 因為之前看到t和n兩個變數都是undefined, 所以我們不需要給他任何引數
- 修改完之后在下面的框直接呼叫函式并且把密碼123456傳進去, 點擊計算運算式
- 修改完之后必須點擊加載代碼后在計算運算式
- 可以看到計算計過是跟抓包工具里面的一模一樣可以說我們的逆向已經完成了. 接下來就到python表演的時候了

三、環境安裝
- node.js
- 不會安裝的點擊這里
- PyExecJS
- pip install PyExecJs(使用anaconda的也需要這個命令, 因為conda里面沒有這個庫)
四、代碼部分
- 創建一個js檔案,把剛才發條js里面的代碼復制進去.
導庫
import execjs
完整代碼
方法1
# -*- coding: utf-8 -*-
import execjs
password = '123456'
# js源檔案編譯
with open('code.js', 'r', encoding='utf-8') as fp:
ctx = execjs.compile(fp.read())
# 執行js函式
pwd = ctx.call("getPwd", password)
print(pwd)
方法2
# -*- coding: utf-8 -*-
import execjs
password = '123456'
# 實體化node物件
node = execjs.get()
# js源檔案編譯
with open('code.js', 'r', encoding='utf-8') as fp:
ctx = execjs.compile(fp.read())
# 執行js函式
func_name = 'getPwd("{}")'.format('123456')
pwd = ctx.eval(func_name)
print(pwd)
五、總結
- 沒啥好總結的, 里面已經很詳細了
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/257462.html
標籤:python
上一篇:日期與時間處理詳解
下一篇:day26 七段碼
