一、目标
今天的目标是某二手电商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 的算法就明明白白在里面了。
三、总结
字符串定位,还是一如既往的好用。类成员变量的分析有助于解决找不到接口实现类的情况。
我醉了八千万年,/醒来的时候,同伴已经是化石。/我醉了八千万年,/醒来的时候,我已不是主宰。
TIP: 本文的目的只有一个就是学习更多的逆向技巧和思路,如果有人利用本文技术去进行非法商业获取利益带来的法律责任都是操作者自己承担,和本文以及作者没关系,本文涉及到的代码项目可以去 奋飞的朋友们 知识星球自取,欢迎加入知识星球一起学习探讨技术。有问题可以加我wx: fenfei331 讨论下。
关注微信公众号 奋飞安全 ,最新技术干货实时推送