JS逆向之新榜登錄
- 2019 年 12 月 4 日
- 筆記
分享一個破解JS登錄的案例
抓包調試
下面是登錄的抓包:

登錄
一個 XHR 請求,下斷點。或者搜索請求參數

斷點
打完斷點後,重新發起請求,結果如下:

分析
此時的斷點位置,一般是一個 XMLHttpRequest 的請求操作。所以我們順著調用棧往回追。

找到了密碼加密地方,程式碼調用了兩次 h 函數。 其中第二次調用的的參數是將第一次返回的結果加上 d.mdValue 的值!我們點擊進入 h 函數

函數h
將這部分程式碼扣下來,寫到本地 JS 文件中

在本地運行一下和網站上結果進行比對驗證


可以看到 password 這個參數對上了。 後面還有兩個 nonce 和 xyz 的參數,直接全局搜索,找到加密位置打上斷點如下!

注意關鍵地方
var j = h(); return g.nonce = j, i += "&nonce=" + j, g.xyz = d(i)
參數 nonce 是從函數 h 返回的。參數 xyz 是從函數 d 返回的!繼續往下調試:

原來和之前函數加密是同一個函數。 到這裡基本上加密函數都找出來了,接下來就是理清思路,找對參數。
驗證
其實,這兩個 JS 加密函數都可以用 Python 程式碼來轉換! 其中密碼加密的那個函數是 MD5
def md5(parm): hl = hashlib.md5() hl.update(parm.encode(encoding='utf-8')) sign = hl.hexdigest() return sign
nonce 就是一個隨機生成的參數,也能用 Python 改寫,如下:
def non(): li = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"] nonce = ''.join(li[random.randint(0, 15)] for _ in range(9)) return nonce
直接來驗證下吧,結果如下:

登錄成功了!
總結
JS 逆向需要耐心調試,同時要理清思路,調試過程中發現的加密過程要記錄下來,以免後續再發費時間尋找。同時需要大膽的去假設,多嘗試。