python+JS?實現(xiàn)逆向?SMZDM?的登錄加密
實戰(zhàn)場景
這次被我們盯上的平臺是【SMZDM】。
本次目標站點是:aHR0cHM6Ly93d3cuc216ZG0uY29tLw==。
正式開始前,先注冊一個賬號,然后模擬一下登錄,看一下有哪些參數(shù)被偷偷的藏起來了~
當看到登錄之后的所有請求參數(shù)時,我們還是默默的把站點關(guān)閉,撤吧。

從上圖可以看到username,password是重要加密區(qū),geetest_開頭的參數(shù)是下述點選驗證碼涉及的內(nèi)容,本階段不做拆解,可以持續(xù)關(guān)注后續(xù)驗證碼部分邏輯。
登錄的點選驗證碼可以先忽略,這個階段搞定它不是很容易。

接口請求參數(shù)是:
- 請求網(wǎng)址: zhiyou.smzdm.com/user/login/ajax_normal_check
- 請求方法: POST
參數(shù)分析
本次我們先不添加斷點,先通過請求啟動器進行分析,打開該鏈接的請求調(diào)用堆棧,然后依次分析相關(guān)地址。

根據(jù)經(jīng)驗可以發(fā)現(xiàn)有一個common_submit函數(shù),其所在的文件是window.js,可以重點關(guān)注。
接下來添加一個 XHR 斷點,關(guān)鍵字是login/ajax_normal_check。
斷點打住之后,可以直接進入目標函數(shù):

結(jié)果直接找到了相關(guān)加密邏輯,如下圖所示:

核心代碼進行提取,然后進一步進行分析。
var _ = login_obj.encryptPassword(i); (i = _), (r = btoa(r));
結(jié)果發(fā)現(xiàn)login_obj.encryptPassword函數(shù)竟然調(diào)用了一個新的接口。
encryptPassword: function(r) {
var t = null;
return $.ajax({
url: "http://zhiyou.smzdm.com/user/login/pre",
type: "get",
async: !1,
dataType: "json"
}).done(function(e) {
var o;
t = e && 0 != e.error_code ? null : ((o = new JSEncrypt).setPublicKey(atob(e.data.pub_key)),
o.encrypt(r))
}),
t
},關(guān)于賬號使用的是 js btoa,這個沒有什么特別的,就是簡單的 base64 加密
通過開發(fā)者控制臺,測試使用 btoa加密 12345,然后在通過 Python 進行相同的加密。

import base64 wtext = "12345" # 編碼 a = base64.b64encode(wtext.encode()) print(a.decode()) # 輸出 MTIzNDU=
二者結(jié)果一致,username參數(shù)解決。
下面繼續(xù)看password參數(shù),密碼加密的流程是:
- 通過一個 API 獲取
pub_key; - 對
pub_key進行atob編碼; - 設(shè)置
JSEncryptRSAKey加密 KEY; - 對用戶密碼進行加密。
測試 pub_key 加密接口是否可以直接調(diào)用
import requests
headers = {
"Host": "zhiyou.smzdm.com",
"Accept": "application/json, text/javascript, */*; q=0.01",
"Referer": "https://zhiyou.Python加密混淆.com/user/login/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) 自己的 UA"
}
res = requests.get('https://zhiyou.Python加密混淆.com/user/login/pre', headers=headers, timeout=3)
print(res.text)運行代碼得到如下響應(yīng),其中pub_key也被獲取到。

多次測試接口之后,發(fā)現(xiàn)錯誤,觸發(fā)了賬戶限制,在大家編碼的時候,建議多準備幾個不同的賬號,防止被封禁。

進一步調(diào)試發(fā)現(xiàn) JS 加密使用的是一個插件,直接下載對應(yīng) JS 如下:
https://res.Python混淆.com/resources/public/user/zhiyou/js/jsencrypt.min.js
在本地搭建一個 JS 代碼可以運行的環(huán)境 編寫如下代碼,其中涉及上述提及的文件。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>測試環(huán)境</title>
<script src="jsencrypt.min.js"></script>
<script>
function getQueryVariable(variable) {
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split("=");
if (pair[0] == variable) {
return pair[1];
}
}
return false;
}
pk = getQueryVariable("pk");
b64 = atob(pk);
(o = new JSEncrypt()).setPublicKey(b64);
aaa = o.encrypt("123456");
document.write(aaa);
</script>
</head>
<body></body>
</html>然后可以用 Selenium 進行調(diào)用,通過 URL 參數(shù)傳遞 pub_key 即可。

邏輯也非常簡單,Python 調(diào)用接口生成 KEY,然后將 KEY 傳遞到我們自己構(gòu)建的 JS 環(huán)境中,最后通過 Python 調(diào)用目標站點(自己搭建)的地址,獲取加密值,然后進行傳遞。
到此這篇關(guān)于python+JS 實現(xiàn)逆向 SMZDM 的登錄加密的文章就介紹到這了,更多相關(guān)SMZDM 登錄加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python循環(huán)中else,break和continue的用法實例詳解
這篇文章主要介紹了Python循環(huán)中else,break和continue的用法,結(jié)合實例形式詳細分析了Python for循環(huán)、while循環(huán)中else,break和continue的功能、用法及相關(guān)操作注意事項,需要的朋友可以參考下2019-07-07
Python 如何將integer轉(zhuǎn)化為羅馬數(shù)(3999以內(nèi))
這篇文章主要介紹了Python 將integer轉(zhuǎn)化為羅馬數(shù)(3999以內(nèi))的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
如何在Python中導(dǎo)入EXCEL數(shù)據(jù)
這篇文章主要介紹了使用Python處理EXCEL基礎(chǔ)操作篇1,如何在Python中導(dǎo)入EXCEL數(shù)據(jù),文中提供了解決思路和部分實現(xiàn)代碼,一起來看看吧2023-03-03
python通過opencv實現(xiàn)圖片裁剪原理解析
這篇文章主要介紹了python通過opencv實現(xiàn)圖片裁剪原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-01-01
python pow函數(shù)的底層實現(xiàn)原理介紹
這篇文章主要介紹了python pow函數(shù)的底層實現(xiàn)原理介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
關(guān)于CUDA out of memory的解決方案
這篇文章主要介紹了關(guān)于CUDA out of memory的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
Python的Django中django-userena組件的簡單使用教程
這篇文章主要介紹了Python的Django中django-userena組件的簡單使用教程,包括用戶登陸和注冊等簡單功能的實現(xiàn),需要的朋友可以參考下2015-05-05

