【Android安全】Frida 主动加载apk

Frida 主动加载apk

最近遇到一个app,该app会动态加载assets目录下的apk文件,之后再通过反射调用apk的dex中的类的方法。

我想hook动态加载的类的方法,所以需要切换到对应的loader(参考:https://blog.csdn.net/qq_39441603/article/details/126732909);
但是,如果直接切换loader并hook类的方法,由于apk未被加载,会报错提示类不存在(TypeError: cannot read property ‘overload’ of undefined)。

如果等待app自己去加载apk中的dex,确实是可以hook,但是app自己加载完dex之后,我想hook的方法已经被调用完了,hook就没意义了。

所以需要用Frida去主动加载apk,代码示例如下:

jscode = """
Java.perform(function () {

    // 主动加载apk
    var DEXCL = null
    var DEXFactory = null
    function loadAPK(path) {
        var ActivityThread = Java.use("android.app.ActivityThread");
        var app = ActivityThread.currentApplication();
        Java.classFactory.cacheDir = "/data/data/" + app.getPackageName() + "/cache";
        Java.classFactory.codeCacheDir = "/data/data/" + app.getPackageName() + "/code_cache";
        var DexClassLoader = Java.use("dalvik.system.DexClassLoader");
        DEXCL = DexClassLoader.$new(path, Java.classFactory.codeCacheDir, null, DexClassLoader.getSystemClassLoader());
        DEXFactory = Java.ClassFactory.get(DEXCL);
        DEXFactory.cacheDir = "/data/data/" + app.getPackageName() + "/cache";
        DEXFactory.codeCacheDir = "/data/data/" + app.getPackageName() + "/code_cache";
    }

// 这里为了简便直接硬编码了apk路径,其实可以通过 enumerateClassLoaders找class获取到apk路径   
loadAPK('/data/user_de/0/com.google.android.gms/app_chimera/m/00000009/CronetDynamite.apk');


    Java.enumerateClassLoaders({
        onMatch: function (loader) {
            try {
                // cronet apk contains class: org.chromium.net.AndroidNetworkLibrary
                if (loader.findClass("org.chromium.net.AndroidNetworkLibrary")) {
                    // should be: /data/user_de/0/com.google.android.gms/app_chimera/m/00000009/CronetDynamite.apk
                    if (loader.toString().indexOf("CronetDynamite") != -1) {
                        Java.classFactory.loader = loader;
                        send("loader: " + loader);
                        // console.log(loader);
                    }

                }
            } catch (error) {

            }
        }, onComplete: function () {
        }
    });

    // android.net.http.X509TrustManagerExtensions.checkServerTrusted(java.security.cert.X509Certificate[], java.lang.String, java.lang.String) : java.util.List

    var class_name = 'android.net.http.X509TrustManagerExtensions';
    var DymClass = DEXFactory.use(class_name);

    const ArrayList = Java.use("java.util.ArrayList");
    DymClass.checkServerTrusted.overload('[Ljava.security.cert.X509Certificate;', 'java.lang.String', 'java.lang.String').implementation = function (arg1, arg2, arg3) {

        var bt = Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new());
        if (bt.indexOf("dh.a") != -1) {
            // if (1) {
            console.log("Backtrace:" + bt);

            send('orin arg1 : ' + arg1);
            send('orin arg2 : ' + arg2);
            send('orin arg3 : ' + arg3);

            const res = ArrayList.$new();
            for (let cert of arg1) {
                res.add(cert);
            }
            return res;
        }
        return this.checkServerTrusted(arg1, arg2, arg3);
    }
});

"""

参考:http://www.manongjc.com/detail/23-ufhpuglczgmhgxs.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值