大潤發優鮮app之paramsMD5引數分析

2022-01-13 10:00:08

今天我們要分析的app 是大潤發優鮮, 版本號1.4.0,小夥伴們可以去各大應用商定自行下載,軟體使用360殼且混淆,APP校驗了HTTPS證書,需要使用xposed的JustTrustMe模組。

參考連結:https://core.vivcms.com/2020/08/14/420.html,
根據這篇文章提供的思路,按照流程自己走了一遍。

轉載請註明出處:
https://blog.csdn.net/weixin_38819889/article/details/122456132

1.抓個包

開啟charles抓個包,裡面有一個引數叫paramsMD5,這就是今天要研究的引數。然後開啟jadx,搜尋半天發現啥也沒有搜到,猜測該app是加殼。
在這裡插入圖片描述

2.查殼

我們先開啟查殼工具,查一查殼,這裡是mac終端使用的,工具叫ApkScan-PKID,有些殼查不到,但是這裡勉強夠用了。

在這裡插入圖片描述
可以看到用的是360的殼。

3. 脫殼

然後我們用下肉絲姐的工具FRIDA-DEXDump,進到frida_dexdump所在的目錄,直接執行python3 main.py,預設三秒鐘,然後就成功把軟體的殼脫掉了,拿到dex檔案。
在這裡插入圖片描述

再然後把一個個dex檔案重新合併拼裝,打包成一個新的apk檔案,效果如下:
在這裡插入圖片描述

4.jadx靜態分析

這裡搜尋鍵碼 "paramsMD5",就2個地方,點進去看看這個this.f13604a.put("paramsMD5", b(a2));
在這裡插入圖片描述
然後來到這裡,
在這裡插入圖片描述
發現 data = a2paramsMD5=b(a2);,其實這裡面的a2就是抓包拿到的data,也就是請求傳遞的body,b()方法是個啥,跟進去看看。
在這裡插入圖片描述

來到這裡,b() 方法java程式碼如下:

public static String b(String str) {
    try {
        JSONObject jSONObject = new JSONObject(str);
        boolean z = false;
        if (jSONObject.has(f13597d)) {
            z = jSONObject.getBoolean(f13597d);
        }
        String str2 = "";
        if (jSONObject.has(f13599f)) {
            str2 = jSONObject.getString(f13599f);
        }
        String str3 = "";
        if (jSONObject.has(f13598e)) {
            str3 = jSONObject.getString(f13598e);
        }
        String str4 = "";
        if (jSONObject.has(f13600g)) {
            str4 = jSONObject.getString(f13600g);
        }
        return b.a(str + (z + str2 + str3 + str4));
    } catch (JSONException e2) {
        e2.printStackTrace();
        return b.a(str);
    }
}

這裡直接看返回值 b.a(str + (z + str2 + str3 + str4));,z和str2和str3和str4到底是個啥,跟進去看看。
在這裡插入圖片描述
看到這裡我們大概明白了,就是宣告一個JSONObject jSONObject = new JSONObject(str);,就是json物件,然後依次判斷取出這四個欄位,組裝成一個新的字串,交給b.a()方法執行。

b.a()程式碼如下:

  public static String a(String str) {
        String str2 = "@456yx#*^&HrUU99";
        if (e.f13526e.equals(e.a().b()) || e.f13527f.equals(e.a().b())) {
            str2 = "@yx123*&^DKJ##CC";
        }
        try {
            SecretKeySpec secretKeySpec = new SecretKeySpec(str2.getBytes(), "HmacSHA256");
            Mac instance = Mac.getInstance(secretKeySpec.getAlgorithm());
            instance.init(secretKeySpec);
            return Base64.encodeToString(instance.doFinal(str.getBytes()), 2);
        } catch (Exception e2) {
            e2.printStackTrace();
            return null;
        }
    }

看名字,大概就能猜到這裡使用的HmacSHA256+base64組合演演算法(如果不瞭解該演演算法,請看文章: https://blog.csdn.net/weixin_38819889/article/details/122455802),到這裡靜態分析差不多,拿出我們的frida動態偵錯一下。

5.frida動態偵錯

js程式碼如下:

Java.perform(function (){
    var g_class = Java.use("com.rt.market.fresh.application.g");
    g_class.b.overload("java.lang.String").implementation = function(v1){
        console.log("↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
        console.log("Sig入參-引數:" + v1);
        var res = g_class.b(v1);
        console.log("Sig加密後的資料:" + res);
        console.log("↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
        return res;
    }

    var b_class = Java.use("com.rt.market.fresh.application.g$b");
    b_class.a.overload("java.lang.String").implementation = function(n1){
        console.log("a方法入參-引數:" + n1);
        var res = b_class.a(n1);
        console.log("a方法返回-資料:" + res);
        return res;
    }

})

執行命令看看效果:

frida -U com.rt.market.fresh -l hook_dufxian.js

在這裡插入圖片描述
好了,到此分析完成。

6.演演算法還原

加密還算簡單,最後已經還原成python,測試對比一下paramsMD5: e675/mblyBuNdX8+uWUpx5FwGOHWclKILz2UDDtPDaw=,值對得上。
在這裡插入圖片描述
完成,手工!