美文网首页
某汽车社区App 签名和加解密分析

某汽车社区App 签名和加解密分析

作者: fenfei331 | 来源:发表于2021-11-22 14:20 被阅读0次

    一、目标

    稼轩长短句有云:宝马雕车香满路。从此香车美女就成了标配。这不李老板还没聊几个mm,又开始准备换车了。

    今天我们的目标是 某汽车社区App v8.0.1。

    二、步骤

    脱个壳

    李老板说这个App很拽,貌似是某个企业版的壳,连 Xcube都不好使,调试不了。

    我们先不管他拽不拽,先用 BlackDex 把壳脱了先。

    BlackDex提示脱壳成功,但是对应的目录下只有一个dex文件,明显不对

    zgmf.jpeg

    还好我们有备用方案,据说 FDex2 脱壳也不错,搞起来。

    忧伤的是,FDex2说不支持我的手机。 原因是我的系统版本太高 Android 10。

    罢了,手机咱还是有好多部的。当年找李老板申请从Android 4 - Android 10 都买了一部,测试用嘛。

    先找了一台Android 8.1 。正好这台机器上也有 BlackDex。顺手试试吧。

    xcww.png

    难道脱壳还和系统有关系? 正告各位兄弟: 高低版本的Android都备着,哪个能脱用哪个

    抓个包

    main.png

    数了数signature,还是32位,这就尴尬了,难道还是MD5。

    不管了,先搜搜哦

    findstr1.png

    结果不多,这个 Map.put 太赤果果了,盘它。

    sign1.png

    感觉上应该是这个sign了。

    上Frida

    var utilCls = Java.use("com.alibaba.sdk.android.oss.common.utils.OSSUtils");
    utilCls.sign.implementation = function(a,b,c){
        console.log(TAG + "a = " + a);
        console.log(TAG + "b = " + b);
        console.log(TAG + "c = " + c);
        var rc = this.sign(a,b,c);
        console.log(TAG + "sign = " + rc);
        return rc;
    }
    

    跑起来。

    TIP: 忘了插播一下,这个App没有那么拽,手机里面跑葫芦娃 hluda-server-15.xx,然后就可以跑起来。

    忧伤的是,木反应。 不科学呀。

    仔细看看 Signaturesignature 傻傻的分不清楚。居然犯这种低级错误。千万不能让李老板知道,不然快年底了,他肯定以这个为理由不给我加工资。

    sign2.png

    把忽略大小写勾掉。再搜一遍,这次只有两个结果了,但是这两个结果看上去都不咋地。

    这时需要祭出 找朋友 大法了。从同一个请求包里面另外找一个看上去比较稀有的参数来搜。这次我们看上了 nonce

    sign3.png

    这里看上去有戏。

    sign4.png

    进去看看,我们看到了亲爱的MD5。毫不犹豫的Hook之。

    var utilsExCls =  Java.use("com.aliyun.common.utils.MD5Util");
    utilsExCls.getMD5.implementation = function(a){
        console.log(TAG + "a = " + a);
        var rc = this.getMD5(a);
        console.log(TAG + "Md5 sign = " + rc);
        return rc;          
    }
    

    这次逮住了

    Md5 sign = 35c40cb2b0fcf2a61ad316be7e912370
    

    可以收工了。

    lxbz.png

    返回数据加解密

    code.png

    我们从抓包结果来看,请求包和结果里面都有一组 sd= 开头的加密数据。 看上去像是详情页面的数据。

    如何定位呢?我们先分析下特征,这组数据有三个特征:

    1、sd= 开头

    2、数据都是大写的M开头

    3、== 结尾,那大概率是Base64

    先从Base64入手

    var Base64Class = Java.use("android.util.Base64");
    Base64Class.encodeToString.overload("[B", "int").implementation = function(a,b){
        var rc =  this.encodeToString(a,b);        
        console.log(">>> Base64 " + rc);
        return rc;
    }
    

    跑起来,忧伤的是,木有结果。(可能是Base64在so层做或者干脆自己实现Base64算法)

    那就换个方法,搜索 sd= 或者 "sd"

    轻松定位到了 CheckCodeUtils 这个类

    var CheckCodeUtils = Java.use("com.cloudy.lxxxlxxxbang.model.request.retrofit2.CheckCodeUtils");
    var encrypt = CheckCodeUtils.encrypt.implementation = function (paramString, paramInt) {
        console.log(TAG + 'aaa encrypt paramString:' + paramString);
        console.log(TAG + 'aaa encrypt paramInt:' + paramInt);
        var result = this.encrypt(paramString, paramInt);
        console.log(TAG + 'aaa encrypt result:' + result);
        return result;
    }
    
    var decrypt = CheckCodeUtils.decrypt.implementation = function (paramString) {
        console.log(TAG + 'aaa decrypt paramString:' + paramString);
        var result = this.decrypt(paramString);
        console.log(TAG + 'aaa decrypt result:' + result);
        return result;
    }
    

    完美,结果就不截图了。

    三、总结

    关键字符串搜不到的时候,可以考虑考虑找找他们的朋友。

    逆向分析是实践课,没有定法。不要纠结细枝末节,也不要探究方法是否正统。能抓到老鼠就行。

    预告一下,下节课咱们用 unidbg来跑这个算法。顺便尝试还原它

    ffshow.jpg

    金屑虽贵,落眼成翳

    相关文章

      网友评论

          本文标题:某汽车社区App 签名和加解密分析

          本文链接:https://www.haomeiwen.com/subject/tblbtrtx.html