您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“python+JS怎么實現(xiàn)逆向SMZDM登錄加密”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當(dāng),希望這篇“python+JS怎么實現(xiàn)逆向SMZDM登錄加密”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。
這次被我們盯上的平臺是【SMZDM】。
本次目標站點是:aHR0cHM6Ly93d3cuc216ZG0uY29tLw==
。
正式開始前,先注冊一個賬號,然后模擬一下登錄,看一下有哪些參數(shù)被偷偷的藏起來了~
當(dāng)看到登錄之后的所有請求參數(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
本次我們先不添加斷點,先通過請求啟動器進行分析,打開該鏈接的請求調(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: "//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)用目標站點(自己搭建)的地址,獲取加密值,然后進行傳遞。
讀到這里,這篇“python+JS怎么實現(xiàn)逆向SMZDM登錄加密”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。