一、目标
今天的目标是某二手电商App的 x-sign 签名分析,抓个包先:
说实话,看到这个Headers,真让人哭笑不得,你说至于嘛,发个请求搞这么多乱七八糟的参数……
二、步骤
上jadx
算了,既然选择了,就硬着头皮上吧,搜索下 x-sign 先
不错哦,只有4处,很容易就定位到了 getUnifiedSign 这个函数。点进去看看,发现是一个接口。
我们继续搜索 getUnifiedSign 的实现。
好幸运,有理由怀疑 mtopsdk.security.InnerSignImpl 就是我们要找的实现类。
可以写个脚本去验证下,不过这年头代码这么贵,能少写点就少写点。我们用上次学的 objection ,来验证:
objection -g com.txxxx.ixxxx explore
android hooking watch class 'mtopsdk.security.InnerSignImpl'
结果不错, getUnifiedSign 确实被调用了。
(agent) [710845] Called mtopsdk.security.InnerSignImpl.a(java.util.Map, java.lang.String, boolean)
(agent) [710845] Called mtopsdk.security.InnerSignImpl.a(java.util.Map, java.lang.String, boolean)
(agent) [710845] Called mtopsdk.security.InnerSignImpl.pc()
(agent) [710845] Called mtopsdk.security.InnerSignImpl.pc()
(agent) [710845] Called mtopsdk.security.InnerSignImpl.getUnifiedSign(java.util.HashMap, java.util.HashMap, java.lang.String, java.lang.String, boolean, java.lang.String)
监控一下它的入参和返回值
android hooking watch class_method 'mtopsdk.security.InnerSignImpl.getUnifiedSign' --dump-args --dump-return
正是我们想要的结果。
一个新问题
我们仔细观察下 getUnifiedSign 函数,发现里面并没有 x-sign 运算过程,虽然直接调用 getUnifiedSign 可以得到 x-sign。 不过我们还是很好奇,到底 x-sign 是怎么算出来的,这下好奇心就害死猫了。
HashMap<String, String> output = this.f52559a.getSecurityFactors(input);
从 getUnifiedSign 中,我们有理由怀疑 getSecurityFactors 才是真正的幕后黑手,但是 只能找到 IUnifiedSecurityComponent 接口中有 getSecurityFactors 函数。其他再怎么搜索也没有找到 getSecurityFactors 的实现。
怎么办?
如果我们有办法知道 this.f52559a 这个对象是什么类型,是不是就可以知道 getSecurityFactors 的实现了?
说干就干,Hook getUnifiedSign 之后,我们拿到 this对象,然后把this的所有成员变量打印出啦。
console.log(" ========== ");
var fields = Java.cast(this.getClass(),Java.use('java.lang.Class')).getDeclaredFields();
//console.log(fields);
for (var i = 0; i < fields.length; i++) {
var field = fields[i];
field.setAccessible(true);
var name = field.getName();
var value =field.get(this)
console.log("name:"+name+"\tvalue:"+value);
}
console.log(" ========== ");
嗯嗯,不错哦, 我们发现了 com.axxx.wireless.security.middletierplugin.b.a.a$a
==========
name:a value:com.axxx.wireless.security.middletierplugin.b.a.a$a@8658790
name:a value:null
name:a value:null
name:b value:com.axxx.wireless.security.open.SecurityGuardManager@7aac0af
name:TAG value:mtopsdk.InnerSignImpl
==========
就是它了,hook 一下,翻一翻它的底子。
一个忧伤的故事
Error: java.lang.ClassNotFoundException: Didn't find class com.axxx.wireless.security.middletierplugin.b.a.a$a
纳尼,没有这个类? 不科学呀,明明都发现它的对象了,居然hook不到它的类?
我们先来找找它在哪
var targetClass = "com.axxx.wireless.security.middletierplugin.b.a.a$a";
Java.enumerateClassLoaders({
onMatch: function (loader) {
try {
var iUseCls = loader.findClass(targetClass);
if(iUseCls){
console.log("loader find: " + loader);
}
} catch (error) {
//console.log("classloader failed" + error);
}
}, onComplete: function () {
}
});
就是它了, /lib/arm/libsgmiddletier.so,拉出来 jadx一下, x-sign 的算法就明明白白在里面了。
三、总结
字符串定位,还是一如既往的好用。类成员变量的分析有助于解决找不到接口实现类的情况。
我醉了八千万年,/醒来的时候,同伴已经是化石。/我醉了八千万年,/醒来的时候,我已不是主宰。
关注微信公众号,最新技术干货实时推送