我們來看下空中網的逆向分析

js逆向分析
抓包后,經過分析,我們看到password在一個login-handler xxx.js檔案中

我們點進去搜索password:

但我們看到,password在一段很長的文本中,
這里就涉及到了js混淆,
js混淆:
什么是js混淆:
將js核心的相關代碼進行變相的加密,加密后的資料就是js混淆之后的結果,
js反混淆:
-
反混淆的線上工具(不理想)
-
瀏覽器自帶的反混淆工具設定(推薦)
開發者工具中的
Sourse -> settings -> Sources ->第一項勾選

進行關鍵字的全域搜索 ->VMxx(就是反混淆后的代碼)

然后我們點進去,搜索password,發現有好幾處疑是加密的關鍵詞,都打上斷點,測驗下:

我們看到了代碼停留在了120行,說明這行就是密碼加密,
我們在除錯工具中來寫一段js代碼,
function getPwd(pwd) {
return encrypt(pwd, data["dc"]);
}
這里有一個data["dc"],我們不知道是什么,稍后再處理,
我們點擊encrypt所在的函式進去,把里面所有的代碼復制到除錯工具里,
代碼加載成功后,我們再來搜索這個data["dc"].

果然不出所料,這里是搜索不到的,我們只能換種方式了,
我們知道,秘鑰不是在前臺網頁中,就是請求獲取到的,我們可以分析下請求后的回應資料,看看有沒有類似的資料:

果然我們在這個請求回應中找到了dc的值,我們復制值來測驗下:

但這里又出現了錯誤,
在剛才的js代碼中,encrypt(pwd, dc)前是有個this.的,那么這個this代表的是哪個物件呢?我們來分析下:
點擊encrypt查看最上面的參考,看到物件就是KZLoginHandler.

好,那我們就繼續改寫代碼:

計算結果,得出了正確的值,
Python代碼實作
創建kongzhongwang.js檔案,把上述js代碼改寫并復制進去:
function getPwd(pwd, dc) {
return KZLoginHandler.encrypt(pwd, dc);
}
Python代碼:
import requests
import re
import execjs
# 獲取秘鑰
url = 'https://sso.kongzhong.com/ajaxLogin?j=j&jsonp=j&service=https://passport.kongzhong.com/&_=1635517824810'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
}
page_text = requests.get(url=url, headers=headers).text
print(page_text)
寫到這里,我們發現并沒有列印出內容,
那是因為,這個url的headers還需要Referer:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36',
'Referer': 'https://passport.kongzhong.com/'
}
我們來繼續寫代碼:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import requests
import re
import execjs
import json
# 獲取秘鑰
url = 'https://sso.kongzhong.com/ajaxLogin?j=j&jsonp=j&service=https://passport.kongzhong.com/&_=1635517824810'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36',
'Referer': 'https://passport.kongzhong.com/'
}
page_text = requests.get(url=url, headers=headers).text
ex = r'KZLoginHandler.jsonpCallbackKongZ\((.*?)\)'
dc = re.findall(ex, page_text)[0]
dc = json.loads(dc)['dc']
# 加密的逆向
node = execjs.get()
ctx = node.compile(open('./kongzhongwang.js', encoding='utf-8').read())
funcName = 'getPwd("{0}","{1}")'.format('123456', dc)
password = ctx.eval(funcName)
print(password)
這樣,我們就獲取到了密文!
知識點
- 了解
js混淆 秘鑰找不到時,可以到回應資料里找headers里必要時,要加上Referer、Cookies等資料
關注Python濤哥!學習更多Python知識!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/356990.html
標籤:python
