一、目标

市面上生鲜App一大堆,买菜也确实是高频次的刚需,这些生鲜App还都有一些有意思的共性:

  • 大都加壳了
  • 大都不好抓包

今天我们分析的是 某生鲜App v9.9.59 的 mfsig 签名。

二、步骤

上jadx

jadx1:jadx

看看这么少的包名和类名,基本可以断定是加壳了。

那就先复习下 某酒店App sign、appcode签名解析(二) 脱壳分析

BlackDex脱壳

脱完壳的结果拖到PC上,赶紧jadx一下,搜一搜 "mfsig"

我去,一个结果都没有。

二种可能,一是 App有别的道道,mfsig签名相关运算和过程都在so里面;另一种可能就是脱壳不干净,关键数据木有出来。

不管是哪种可能,都得再想想别的办法了。

hook_libart

我们观察一下, mfsig签名的值都是 mfsnm 开头。这就有突破点了。

复习下 某种草电商App签名算法解析(一) 把字符串匹配安排上。

if (addrNewStringUTF != null) {
    Interceptor.attach(addrNewStringUTF, {
        onEnter: function (args) {
            if (args[1] != null) {
                var string = Memory.readCString(args[1]);

                if(string != null) {
                    if(string.toString().indexOf("mfsnm") >= 0   )
                                            {
                        console.log("[NewStringUTF] bytes:" + string);

                        var threadef = Java.use('java.lang.Thread');
                        var threadinstance = threadef.$new();

                        var stack = threadinstance.currentThread().getStackTrace();
                        console.log("Rc Full call stack:" + Where(stack));

                        console.log(Thread.backtrace(this.context, Backtracer.FUZZY)
                                .map(DebugSymbol.fromAddress).join("\n"))

                    }
                }
            }
        },
        onLeave: function (retval) {}
    });
}

跑起来

frida -U -f cn.mxxxfxxxh.application -l ms.js  --no-pause

运气太好了,轻松逮住。

[Pixel 2 XL::cn.mxxxfxxxh.application]-> [NewStringUTF] bytes:mfsnmtyBmRQEmRmAVpF48icnVLkAGJ1KJJ0bGZOGIKWEFIgLLKO7KJK9JKCHJJ5IKk50KZW7I+SII59FG+GHLZcBI654Jl9MKmcDJKWCJkO8IZ95KKP5mBY1ma
Rc Full call stack:dalvik.system.VMStack.getThreadStackTrace(Native Method)
java.lang.Thread.getStackTrace(Thread.java:1720)
cn.mxxxfxxxh.wsg.SecurityLib.nativeSign(Native Method)
cn.mxxxfxxxh.wsg.SecurityLib.a(SecurityLib.java:24)
cn.mxxxfxxxh.wsg.a.a(SecurityManager.java:42)

赤果果的就是这个 nativeSign,之前脱壳出来的代码有用武之地了,盘它。

上Frida

var signatureCls = Java.use('cn.mxxxfxxxh.wsg.SecurityLib');
signatureCls.nativeSign.overload('android.content.Context', 'long', '[B').implementation = function(a,b,c){
    var retval = this.nativeSign(a,b,c);

    var StrCls = Java.use('java.lang.String');
    var inStr = StrCls.$new(c);

    console.log(">>> signature inStr  = " + inStr);
    console.log(" >>>  signature rc= " + retval);
    return retval;
}

再跑一下,入参和结果都出来了。

rc1:rc

Tip:

这里解释一下byte[] 参数的打印,我们通过堆栈回溯,发现

String a = C15603SecurityLib.m17628a(f13866a, C3748b.m17632a(str).getBytes("UTF-8"));

这个byte[] 其实就是String转的,所以我们要打印它,只需要调用String的构造方法就行了。

三、总结

脱壳才是第一生产力,所以要多掌握一些脱壳工具和rom。

套路就是那么的相似,多熟练几个套路,遇到新的App就先都给他安排上。

ffshow

当我们为生活疲于奔命的时候,生活已经离我们远去。

本文转载自网络,如有侵权,请联系删除。