案例https://ctbpsp.com/#/
截至2025.07.19可用
定位加密位置
加密位置:
定位方式,XHR,跟棧?
跟棧?
QL打斷點,重新斷住
?分析為,一個函數傳入四個參數
?var QL = QI[d9(Nv.mQ)](QJ, Qh, Qv, this[d9(Nv.m9)][0xa1a * 0x2 + -0xd2a + -0x35 * 0x22]);
QI[d9(Nv.mQ)]為函數
QJ,QH,QV, this[d9(Nv.m9)][0xa1a * 0x2 + -0xd2a + -0x35 * 0x22]為傳入函數里的四個參數
進入函數
事實上這種傳參方式特別常見,
基本就是函數傳入幾個參數,再傳入一個函數?,函數里面返回一個函數,函數的作用也是傳入幾個參數,一個函數,嵌套幾層,最后的結果就是傳入的函數,然后傳入的參數給傳入的函數傳參。
有點亂
用python演示
def b(a,b):return a(b)
def hhh(h,a):return b(h,a)
def a(b):print(b)
hhh(a,3)
hhh(a,3)經過很多次調用最后執行a(3),這種網頁調試里面很常見的(留個心眼),所以要不斷進入函數內部。
簡單來說就是一個函數調用傳參本來可以直接用,非要嵌套幾層函數再調用
最后不斷進入函數,一共進入了四層
進入到一個控制流里面
控制流也特別常見,每一個分支打上斷點,加密位置也就找到了。
接下來扣代碼
混淆代碼解釋
這是一個混淆的JS代碼,首先得扣三個主要
大數組函數或大數組,自執行方法,解密函數
不懂這些作用得請先參考JS逆向之JS混淆_js代碼混淆-CSDN博客
大數組一般在js文件最上方
知道大數組叫?Q(),另外兩個函數也容易找了
再解密函數里面必須調用大數組(不一定是傳參,也可能是賦值)
所以很顯然,a函數是解密函數?
解密函數后面要經過多次被調用(留個心眼),非常重要
接下來是自執行方法
事實上有兩個 自執行函數,看被大數組Q被那個調用。(不一定是傳參,也可能是賦值)
第一個坑
先把這三個關鍵函數扣下來,然后先運行試試,發現不斷運行,結束不了。
這種情況一般有兩種
一種是在循環里異常捕獲,導致跳不出去循環,一種是定時器,定時運行
但是沒有報window未定義,所以不是定時器的問題。所以只剩下異常捕獲
這是這個網站的第一個坑
直接搜索try
很顯然,死循環,手動輸出異常是什么,m8,記得要break,不然輸出死循環
結果是E2未定義
E2可以寫死,383
補好E2,程序可以運行
扣代碼?
混淆的代碼主要扣對象,次要扣函數了
現在咱們可以肆無忌憚的扣代碼了
G為定義,直接搜?
?
直接扣
直接定位搜索
a函數進入后發現解密函數,這很正常?,在混淆代碼里,解密函數多次被調用
?繼續運行
?
直接扣下來。接下來基本都是缺對象了(嗚嗚嗚)或者缺調用解密方法,缺什么補什么
但你補著補著,發現要補的對象還是很多的
仔細觀察,你會把很多對象一把扣了。(這就是老辣的經驗)
接下來分析
?Qk解釋
經分析,Qk就是這么長一坨
Qk = mO[Um(ik.m8)](mO[Um(ik.m9)](mO[Um(ik.mm)](mO[Um(ik.mO)](mO[Um(ik.mQ)](Qk, '|'), mO[Um(ik.ma)](mE)), '|'), new Date()[Um(ik.mZ)]()), '|1');
?這就是對象嵌套對象調用對象屬性,非常的繞,不過沒事,咱們只扣對象
發現又是解密函數a
?發現另一個Qk
接下來又是喜聞樂見的扣對象,調用解密函數a?
?
傳入參數是接口url未帶加密參數的編碼部分
最后差一個mE
?
第二個坑 (可有可無)
把mE補上,才發現,有第二個坑(事實上做第一次沒有發現這個坑)
這兩個Qv是不一樣的,這個是0,補上出結果
完美收官?
最后封裝
?對url進行編碼
from urllib.parse import quote
encoded_url = quote(url, safe='')
直接出結果,最后是一串加密數據,非常簡單的·DES解密。
這個網站詳情有軌跡驗證,請求多了有阿里滑塊(我是菜雞,解決不了一點)
總結
僅供學習!!!
扣混淆代碼,先扣三個函數(大數組,自執行方法,解密函數)
自執行方法會調用大數組函數(不一定是傳參,也可能是賦值)
解密函數也會調用大數組函數(不一定是傳參,也可能是賦值)
僅供學習!!!
混淆代碼跟棧經常會是喜聞樂見的函數嵌套函數傳參函數,一步一步進去即可
僅供學習!!!
扣混淆代碼以扣對象為主,次要扣函數。期間解密函數一直會被調用賦值
僅供學習!!!