声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向分析
版本 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)
结果
总结
1.出于安全考虑,本章未提供完整流程,调试环节省略较多,只提供大致思路,具体细节要你自己还原,相信你也能调试出来。