声明:
本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
逆向分析
学了3-4天得物,学到挺多的。基本把坑重头踩到尾。从抓到到so层,再到反frida,IDA技巧、Jadx技巧基本都用上了。
逆向过程
得物 版本5.31
抓包问题,pixel2反复出现charles一下可以抓包,一下不可以这点是真牛逼。每次都要重启,昨天晚上洗个澡回来突然又抓不到包,发现防火墙把包全给拦了,剩下还有一些SSL问题一下可以一下不可以没搞懂。(有大佬解决的教教我)实在突然不行有黄鸟都可以抓包。
主要加密就这几个剩下hook部分就不细说了。
def pad_pkcs5(data): """ 对数据进行 PKCS5 填充 :param data: 需要填充的数据(字节类型) :return: 填充后的数据 """ block_size = AES.block_size padding_length = block_size - (len(data) % block_size) return data + bytes([padding_length] * padding_length) def unpad_pkcs5(data): """ 去除 PKCS5 填充 :param data: 需要去除填充的数据(字节类型) :return: 去除填充后的数据 """ padding_length = data[-1] return data[:-padding_length] def encrypt_aes_ecb_pkcs5(plaintext, key): """ 使用 AES_128_ECB_PKCS5Padding 模式加密明文 :param plaintext: 明文字符串 :param key: 加密密钥(必须是16字节长) :return: Base64格式的密文字符串 """ key_bytes = key.encode('utf-8') cipher = AES.new(key_bytes, AES.MODE_ECB) plaintext_bytes = plaintext.encode('utf-8') padded_plaintext = pad_pkcs5(plaintext_bytes) ciphertext_bytes = cipher.encrypt(padded_plaintext) ciphertext_base64 = base64.b64encode(ciphertext_bytes).decode('utf-8') return ciphertext_base64 def decrypt_aes_ecb_pkcs5(ciphertext_base64, key): """ 使用 AES_128_ECB_PKCS5Padding 模式解密密文 :param ciphertext_base64: Base64格式的密文字符串 :param key: 解密密钥(必须是16字节长) :return: 解密后的明文字符串 """ key_bytes = key.encode('utf-8') ciphertext_bytes = base64.b64decode(ciphertext_base64) cipher = AES.new(key_bytes, AES.MODE_ECB) plaintext_bytes = cipher.decrypt(ciphertext_bytes) unpadded_plaintext = unpad_pkcs5(plaintext_bytes) plaintext = unpadded_plaintext.decode('utf-8') return plaintext import hashlib def md5_encrypt(plaintext): """ 使用 MD5 加密明文 :param plaintext: 明文字符串 :return: MD5 加密后的十六进制字符串 """ # 创建 MD5 哈希对象 md5_hash = hashlib.md5() # 更新哈希对象的明文字节 md5_hash.update(plaintext.encode('utf-8')) # 获取加密后的十六进制字符串 ciphertext_hex = md5_hash.hexdigest() return ciphertext_hex
结果
总结
1.出于安全考虑,本章未提供完整流程,调试环节省略较多,只提供大致思路,具体细节要你自己还原,相信你也能调试出来。