一、目标

一、目标

今天的目标是某二手电商App的 x-sign 签名分析,抓个包先:

main
1:main

说实话,看到这个Headers,真让人哭笑不得,你说至于嘛,发个请求搞这么多乱七八糟的参数……

二、步骤

上jadx

算了,既然选择了,就硬着头皮上吧,搜索下 x-sign

getUnifiedSign
1:at1a

不错哦,只有4处,很容易就定位到了 getUnifiedSign 这个函数。点进去看看,发现是一个接口。

我们继续搜索 getUnifiedSign 的实现。

signimpl
1:signimpl

好幸运,有理由怀疑 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

正是我们想要的结果。

rc1
1:rc1

一个新问题

我们仔细观察下 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 的算法就明明白白在里面了。

三、总结

字符串定位,还是一如既往的好用。类成员变量的分析有助于解决找不到接口实现类的情况。

rcok
1:rcok

我醉了八千万年,/醒来的时候,同伴已经是化石。/我醉了八千万年,/醒来的时候,我已不是主宰。

100

关注微信公众号,最新技术干货实时推送

100