免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
内容参考于:图灵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}")
效果图:
![]()