啓xin寶app的token算法破解

啓xin寶app的token算法破解——抓包分析篇(一)

轉:https://blog.csdn.net/qq_34067821/article/details/100050472

爲了提升逆向技術,最近幾日研究了企cha查的sign和啓xin寶的token算法,目前已經成功破解,兩個app均是最新版,並將企cha查寫成爬蟲小demo,放在github上,詳情查看 https://juejin.im/post/5d609fd26fb9a06acb3eab29 具體不在多說,今日繼續啓xin寶的token破解。
啓xin寶的token破解可謂是有點小難,祕鑰在ndk裏面,比較難取,不過用一個比較火的技術就很快搞定了,後邊詳細說。
對於啓xin寶我麼就需要先進行抓包了,這裏使用Charles進行手機端抓包:


這裏隨便抓了一個url,我們看到有token、push-registration、imei等等,那這麼多的請求頭裏面是都需要嗎??
我們做一個驗證,使用requests或者就Charles重發驗證,這裏使用Charles重發驗證,需要先進行更改請求頭,然後重新發送即可。

1.右鍵在url上選擇撰寫
2.點擊請求頭
3.對請求頭進行更改
4.執行(還可以進行還原操作)

經過我的驗證發現只有token、appversion是最重要的,其他都沒有太大作用,有興趣的小夥伴可以自己試試。


對於app-version我們直接就可以拿來用,但是對於token怎麼辦,下一篇繼續分析吧。
 

啓xin寶app的token算法破解——逆向篇(二)


對於一個app而言,我們要逆向app,需要知道什麼呢?

逆向工具
Java基礎,甚至c和彙編基礎
加固類型和脫殼工具
安卓開發基礎
對安卓系統的認知
對xposed的認知
smali基礎
以上這些是必須瞭解甚至掌握的,爬蟲逆向路上越走越遠了。
迴歸正題,該app是怎樣一種app呢??
如何去查看app是否加固(加殼)呢?
我們要藉助易開發這款app進行檢驗(同時帶有脫殼功能)

可以看到該app是360加固,我們直接脫殼,然後導出脫殼數據分享到電腦上,導出數據爲dex。

dex又是什麼呢?
這篇文章可以瞭解一下淺談 Android Dex 文件
本文不做相關基礎的書寫。還需要讀者自己進行學習。
我們現在有了安卓apk的dex,現在就需要對dex進行逆向了。
這裏推薦的工具有gda(中國人自己寫的)、jeb(功能強大,需要付費)、jadx(逆向出更利於閱讀的代碼),如果涉及到ndk,我們還需要ida,工具的具體用法這裏就不詳細說了。本次使用jadx進行逆向dex文件,然後保存成Java源代碼進行分析,Java源碼代碼分析,這裏使用idea(Java開發工具)。
在使用jadx反編譯dex的時候,內存使用比較大,請注意內存的大小。


上圖保存成Java源代碼之後,使用idea打開,然後繼續分析token,下一篇繼續。
 

啓xin寶app的token算法破解——token分析篇(三)


本篇就愛你是對token靜態分析,其實很簡單就可以搞定那種。通過idea的全局搜索,直接搜索"token"直接找到token在哪裏,上圖。

 

找到了,進去看看,這是MessageUtil類裏面,可以看下MessageUtil的具體方法:

具體代碼就不貼了,分析到這裏發現使用ndk,也就是c編譯之後的so文件,這就有點難辦了,先不管這個,繼續分析下。
static {
    System.loadLibrary("encrypt-lib");
    }

在該類裏面有這個return b.a(str);方法,該方法是具體的算法分析。

    /* renamed from: a reason: collision with root package name */
    public static String f1288a = "CryptoTool_KEY";
    public static String b = "CryptoTool_IV";
    public static String c = MessageUtil.getKey();
    public static String d = MessageUtil.getIV();
    private static final String e = "AES/CBC/PKCS5Padding";
    private static byte[] f = a.a(c);
    private static SecretKeySpec g = new SecretKeySpec({}, "AES");
    private static Cipher h;
    

    public static String a(String str) {
        try {
            if (h == null) {
                f = a.a(c);
                g = new SecretKeySpec(f, "AES");
                h = Cipher.getInstance(e);
                h.init(1, g, new IvParameterSpec(a.a(d)));
            }
            byte[] bytes = str.getBytes("UTF-8");
            byte[] bArr = new byte[h.getOutputSize(bytes.length)];
            h.doFinal(bArr, h.update(bytes, 0, bytes.length, bArr, 0));
            return Base64.encodeToString(bArr, 2);
        } catch (Exception e2) {
            e2.printStackTrace();
            return null;
        }
    }

看到該token使用的是AES進行加密,具體的祕鑰和偏移則在encrypt-lib裏面。
如何能拿到祕鑰和偏移呢?這裏可以藉助frida和xposed的hook進行提取,下一篇進行frida的hook提取。

啓xin寶app的token算法破解——frida篇(四)

本篇就將對token的祕鑰進行hook,使用上篇提到的frida進行hook,hooknative方法,獲取到祕鑰和偏移。

對於frida是什麼?

Frida是一個動態代碼插樁框架,這裏的介紹主要以應用在Android平臺應用程序上。動態二進制插樁(DBI)是將外部代碼注入到現有的正在運行的二進制文件中,從而讓它執行額外操作。DBI可以:

1.訪問進程內存
2.在應用程序運行時覆蓋函數
3.從導入的類調用函數
4.在堆上查找對象實例並使用
5.Hook、跟蹤和攔截函數等

怎麼使用呢?

pip install frida (python環境)
1.下載服務器二進制文件frida-server要和pip的版本相同
2.$ adb push frida-server-10.0.1-android-arm /data/local/tmp/frida-server
3.$ adb shell
4.cd /data/local/tmp
5.chmod 755 frida-server
6../frida-server
查看frida-server是否啓動成功:
frida-ps -U能看到安卓的應用進程就行

啓動成功後開始寫python和具體的hook代碼。
python代碼:

import sys
import frida
def onmsg(msg, data):
    print(msg)
jscode = open('qxb.js', 'r', encoding='utf8').read()
session = frida.get_usb_device().attach("com.bertadata.qxb")
script = session.create_script(jscode)
script.on('message', onmsg)
script.load()
sys.stdin.read()

現在可以對該app的具體方法hook
需要hook是MessageUtil類下的具體方(該代碼爲參考代碼,並不是該app的實際應用代碼)

setImmediate(function () {
//延遲1秒調用Hook方法
    console.log('start----')
    setInterval(test, 1000);
    // test()
});

function test() {
    Java.perform(function () {

        var hook = Java.use('com.類名');
        hook.方法.overload('傳參類型', 'java.lang.String', 'java.lang.String').implementation = function (a1, a2, a3) {
            var ss = this.方法(a1, a2, a3);//調用是本方法
            console.log('a1參數1 =' + a1);//打印
            console.log('a2參數2 =' + a2);
            console.log('a3參數3 =' + a3);
            console.log('res=' + ss);
            return ss;
        };

執行python代碼就可以直接打印出需要祕鑰和偏移

拿到祕鑰之後我們就需要驗證該祕鑰了,使用第一篇的token進行解密就可以咯。在實際中需要對改密要進行byte數組轉換,更具體的轉換方法。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章