免責聲明:內容僅供學習參考,請合法利用知識,禁止進行違法犯罪活動!
內容參考于:圖靈Python學院
工具下載:
鏈接:https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwd=zy89
提取碼:zy89
復制這段內容后打開百度網盤手機App,操作更方便哦
上一個內容:25.安卓逆向2-frida hook技術-攔截彈框事件(攔截強制更新彈框和解決jadx加載dex文件不全問題)
如下圖的數據包,它是一個被加密后的數據包
首先使用jadx反編譯apk(apk沒辦法反編譯的,看上一個內容砸殼,通過內存獲取源碼)反編譯之后搜索下圖紅框的encrypt_data
搜索完后有兩個結果,它倆都在一個類中,隨便雙擊一個就可以了
然后就來到下圖紅框位置
代碼說明
jSONObject.has("encrypt_data")表示jSONObject中是否存在encrypt_data這個內容
下方的代碼表示如果jSONObject中存在encrypt_data這個內容,就執行Des3.ees3DecodeECB(jSONObject.getString("encrypt_data"))這行代碼,jSONObject.getString("encrypt_data")這個代碼的意思是從jSONObject里面獲取encrypt_data它的值也就是加密數據,然后調用 Des3.ees3DecodeECB方法
if (jSONObject.has("encrypt_data")) {return Des3.ees3DecodeECB(jSONObject.getString("encrypt_data")); }
通過上方的初步分析,可以使用frida調試查看它的入參,首先選擇復制為firda片段
然后注入frida(注意如果有強制更新彈框的時候,注入代碼直接寫到關閉強制更新彈框里面),然后就能看到入參了,入參是通過 Charles 抓到的數據
然后帶著執行了dealCallBackResult方法后就能得到明文數據,也就是執行了ees3DecodeECB方法后得到明文數據
然后分析它使用什么加密算法,然后雙擊下圖紅框的ees3DecodeECB方法
然后就進入了ees3DecodeECB方法,如下圖紅框
然后開始分析
首先使用 Base64.decode 進行解碼
然后使用 SecretKeyFactory.getInstance("desede") 獲取一個desede的算法
然后調用 generateSecret(new DESedeKeySpec(SECRET_KEY.getBytes())) 傳入一個key
然后Cipher.getInstance("desede/ECB/PKCS5Padding");獲取一個ECB加密模型
然后new IvParameterSpec(IV.getBytes());創建一個IV
然后 cipher.init(2, generateSecret); 初始化算法
然后 cipher.doFinal(decode) 解密,然后就返回了
算法需要的key和iv都在這個類中,如下圖紅框,可以直接破了
![]()
Python還原算法
desede算法可以使用DSE3算法代替,Python代碼
from Crypto.Cipher import DES3 from Crypto.Util.Padding import unpad import base64 import jsondef decrypt_des3(params):"""使用DES3算法解密數據參數:params (dict): 包含解密所需參數的字典- ciphertext (str): 待解密的Base64編碼密文- key (str): 密鑰字符串(必須是24字節長度)- iv (str): 初始化向量(僅CBC模式需要,必須是8字節長度)- mode (str): 加密模式,支持'ECB'或'CBC'(默認'CBC')- encoding (str): 解密后明文的編碼格式(默認'utf-8')返回:dict: 解密并解析后的JSON數據"""# 1. 提取并驗證密鑰key = params['key'].encode(params.get('encoding', 'utf-8'))if len(key) != 24:raise ValueError("密鑰長度必須為24字節(192位)")# 2. 解碼Base64密文ct = base64.b64decode(params['ciphertext'])# 3. 根據模式創建解密器if params.get('mode') == 'ECB':# ECB模式不需要IV,但安全性較低cipher = DES3.new(key, DES3.MODE_ECB)else: # CBC模式(默認)# CBC模式需要IV來增加加密隨機性iv = params['iv'].encode(params.get('encoding', 'utf-8'))if len(iv) != 8:raise ValueError("IV長度必須為8字節")cipher = DES3.new(key, DES3.MODE_CBC, iv)# 4. 執行解密并去除填充decrypted_bytes = cipher.decrypt(ct)plaintext_bytes = unpad(decrypted_bytes, DES3.block_size)# 5. 轉換為字符串并解析JSONplaintext = plaintext_bytes.decode(params.get('encoding', 'utf-8'))return json.loads(plaintext)# 使用示例 encrypted = {'ciphertext': '', # 填入實際的Base64密文'key': 'sjdqmp20161205#_316@gfmt', # 24字節密鑰'iv': '01234567', # 修正為8字節長度(原示例中長度錯誤)'mode': 'ECB', # 加密模式,ECB或CBC'encoding': 'utf-8' # 明文編碼 }try:print(f"解密結果: {decrypt_des3(encrypted)}") except ValueError as ve:print(f"參數錯誤: {ve}") except json.JSONDecodeError:print("JSON解析失敗: 解密結果不是有效的JSON格式") except Exception as e:print(f"解密失敗: {e}")
效果圖:
![]()