声明:
本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
逆向分析
版本 11.5.5
现在AI真的有点太猛了,把so文件直接全部喂给他,直接还原算法。首先思路是直接搜关键字是可以搜到的,但是怎么向上追。可以通过打印堆栈。
SignUtil.getSign.overload('java.util.Map').implementation = function (map) { console.log('===================SignUtil.getSign.overload(\'java.util.Map\').implementation==============================') var treeMap = Java.use('java.util.LinkedHashMap') console.log('map:', Java.cast(map, treeMap)) var result = this.getSign(map) console.log('result:', result) return result } SignUtil.getDeviceId.implementation = function () { console.log('===================SignUtil.getDeviceId.implementation==============================') var result = this.getDeviceId() console.log('result:', result) return result }
算法demo 全是ai写的。删除了部分代码防止被线下单杀。
import hashlib def get_sign(input_str, device_id): # 检查输入参数 if not input_str or not device_id: return None # 模拟应用签名验证(此处假设验证通过) app_sign_sha1 = get_app_sign_sha1() if app_sign_sha1 != "expected_app_sign": return None # 将输入字符串和设备ID转换为UTF-8字节数组 input_bytes = input_str.encode('utf-8') device_id_bytes = device_id.encode('utf-8') input_len = len(input_bytes) device_len = len(device_id_bytes) # 初始化结果数组,长度为输入字节数组的长度 result_bytes = bytearray(input_len) # 按照C++逻辑进行异或操作 # 拼接固定字符串并计算MD5 md5_hash = hashlib.md5(result_bytes).hexdigest() return md5_hash def get_app_sign_sha1(): # 模拟正确的应用签名 return "expected_app_sign" # 示例用法 input_str = "a%3Dbc%3Ddkeyword%3D%E5%8C%85%E8%87%80%E8%A3%99" device_id = "" sign = get_sign(input_str, device_id) print("Sign:", sign)