分析其signature参数的生成逻辑:
首先使用jadx搜索大法,此处先搜索signature,发现有太多搜索结果:
考虑到生成的逻辑,有可能是通过比如"signature=加密参数"这样的方式来赋值的,那么我们尝试搜索一下**"signature**,发现定位到了关键代码:
经观察可以发现signature生成的位置:
尝试hook一下这个地方:
var d_d_test = Java.use('com.iCitySuzhou.suzhou001.d.d')
d_d_test.a.overload('java.lang.String', 'java.lang.String').implementation = function(s1,s2){
console.log('enter d_d_test!' + '传入的参数s1为:' + s1 + ',传入的参数s2为'+ s2)
return this.a(s1,s2)
}
然后点入com.huolang.framework.b.a.a里面,看到:
再尝试hook一下这个函数:
var a_a_test = Java.use('com.hualong.framework.b.a')
a_a_test.a.implementation = function(s1){
console.log('enter a_a_test!' + '传入的参数为:',s1)
let return_value = this.a(s1)
console.log('a_a_test.a的返回值为',return_value)
return this.a(s1)
}
输出结果:
看到加密结果为a58414330d87cad53bf77b0d7d20c508,此时比对一下抓包工具里的加密结果:
可以看到加密结果是一样的,因此我们定位到了加密的关键代码在com.huolang.framework.b.a.a里。
接下来可以尝试在Frida中用java代码还原一下:
//此处构造传入的str对象
var str_input = Java.use('java.lang.String').$new('IMEI867686020611446-IMSI460024281539610&&1647162519&&f1190aca-d08e-4041-8666-29931cd89dde')
//此处构造instance对象
var instance = Java.use('java.security.MessageDigest').getInstance("MD5")
//此处构造StringBuffer对象
var StringBuffer = Java.use('java.lang.StringBuffer').$new()
//此处构造Integer对象,源代码里没有$new(),这里也保持一致
var Integer = Java.use('java.lang.Integer')
//与源代码保持一致
instance.update(str_input.getBytes())
var digest = instance.digest()
//用js代码来写源代码中的循环
var len_digest = digest.length
for(let i=0;i<len_digest;i++){
StringBuffer.append(Integer.toString((digest[i] >>> 4) & 15,16)).append(Integer.toString(digest[i] & 15,16))
}
console.log(StringBuffer.toString())
输出结果看一下,发现结果一致,说明还原正确:
这段代码同样也可以用python还原:
import hashlib
str_input = 'IMEI867686020611446-IMSI460024281539610&&1647162519&&f1190aca-d08e-4041-8666-29931cd89dde'
signature = ''
instance = hashlib.md5()
instance.update(bytearray(str_input.encode('utf8')))
digest = instance.digest()
for i in digest:
signature = signature + format((i>>4)&15,'x') + format(i&15,'x')
print('signature为:',signature)