使用APK进行Frida注入,免电脑联机麻烦,批量解决更新脚本或frida麻烦

代码来源于,本文记录其实现过程
https://github.com/iGio90/FridaAndroidInjector

我们平时测试最多的是使用android端的server + 电脑端的frida-tools结合使用注入脚本到进程,这是开发最方便的。

使用frida-inject可以直接脱离frida-tools或者python绑定,注入脚本到进程。
如下图,看下help参数。
在这里插入图片描述

在这里插入图片描述

而server参数是通过socket端口监听与frida-tools通讯的。
参数如下:
在这里插入图片描述

摘取apk端重要注入代码如下

   ApplicationInfo ownAi = fridaAgent.getPackageManager().getApplicationInfo(
                        fridaAgent.getPackageName(), 0);
                String ownApk = ownAi.publicSourceDir;
                ApplicationInfo targetAi = fridaAgent.getPackageManager().getApplicationInfo(packageName, 0);
                String targetPath = new File(targetAi.publicSourceDir).getPath().substring(0,
                        targetAi.publicSourceDir.lastIndexOf("/"));
                if (targetPath.startsWith("/system/")) {
                    RootManager.getInstance().remount("/system", "rw");
                }
                RootManager.getInstance().runCommand("cp " + ownApk + " " + targetPath + "/xd.apk");
                RootManager.getInstance().runCommand("chmod 644 " + targetPath + "/xd.apk");
                Log.w("Frida", "cp " + ownApk + " " + targetPath + "/xd.apk");

                if (targetPath.startsWith("/system/")) {
                    RootManager.getInstance().runCommand("chown root:root " + targetPath + "/xd.apk");
                    RootManager.getInstance().remount("/system", "ro");
                } else {
                    RootManager.getInstance().runCommand("chown system:system " + targetPath + "/xd.apk");
                    Log.w("Frida", "chown system:system " + targetPath + "/xd.apk");
                }

    private void inject(String packageName, String agentPath) {
        RootManager.getInstance().runCommand(mInjector.getPath() + " -n " + packageName +
                " -s " + agentPath + " --runtime=v8 -e");
    }

注入脚本如下

// 所有log重定向到安卓日志,使用电脑端的python发回python
console.log = function () {
  var args = arguments;
  Java.performNow(function () {
    for (var i = 0; i < args.length; i++) {
      Java.use("android.util.Log").e("FridaAndroidInject", args[i].toString());
    }
  });
};

// 通过广播传送消息到控制端
Java["send"] = function (data) {
  Java.performNow(function () {
    var Intent = Java.use("android.content.Intent");
    var ActivityThread = Java.use("android.app.ActivityThread");
    var Context = Java.use("android.content.Context");
    var ctx = Java.cast(
      ActivityThread.currentApplication().getApplicationContext(),
      Context
    );
    var intent = Intent.$new("com.frida.injector.SEND");
    intent.putExtra("data", JSON.stringify(data));
    ctx.sendBroadcast(intent);
  });
};

// 测试代码 》》》(把测试代码换成我们要的业务代码即可)
function log(what) {
  Java.performNow(function () {
    Java.use("android.util.Log").e("FridaAndroidInject", what.toString());
  });
}
Java.performNow(function () {
  var TextView = Java.use("android.widget.TextView");
  TextView.setText.overloads[0].implementation = function () {
    arguments[0] = Java.use("java.lang.String").$new("It works!");
    return this.setText.apply(this, arguments);
  };
});
// 测试代码 《《《
setTimeout(function () {
  Java.perform(function () {
    // 调用注入端的JAVA函数
    var app = Java.use("android.app.Activity");
    app.onResume.overloads[0].implementation = function () {
      this.onResume.apply(this, arguments);
      // activityInterface 是注入的函数
      Java.activityInterface(Java.cast(this, app), "otherArg1", "otherArg2");
    };
  });
}, 2000);
setTimeout(function () {
  Java.send({ pid: Process.id });
}, 5 * 1000);


Java.performNow(function () {
  var app = Java.use("android.app.ActivityThread").currentApplication();
  var context = app.getApplicationContext();
  var pm = context.getPackageManager();
  var ai = pm.getApplicationInfo(context.getPackageName(), 0);
  var apkPath = ai.publicSourceDir.value;
  apkPath = apkPath.substring(0, apkPath.lastIndexOf("/")) + "/xd.apk";
  var cl = Java.use("dalvik.system.DexClassLoader").$new(
    apkPath,
    context.getCacheDir().getAbsolutePath(),
    null,
    context.getClass().getClassLoader()
  );
  // xd_loader 是随便起的名字,js是动态语言可随便给类增加属性
  Java.classFactory["xd_loader"] = cl;
});
Java["activityInterface"] = function () {
  // 暂时替换下frida当前的默认类加载器
  var defaultClassLoader = Java.classFactory.loader;
  Java.classFactory.loader = Java.classFactory["xd_loader"];
  var clazz = Java.use(
    "com.igio90.fridainjectorexample.Interfaces$ActivityInterface"
  ).$new();
  var args = [];
  for (var i = 0; i < arguments.length; i++) {
    args[i] = arguments[i];
  }
  clazz.call(Java.array("java.lang.Object", args));
  // 替换回去,不然hook不了目标程序包的代码
  Java.classFactory.loader = defaultClassLoader;
};

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用Frida对UniApp APK进行动态分析并非易事,需要掌握一定的技能和工具。以下是一些步骤和工具供您参考: 1. 安装Frida和Python Frida是一个动态插桩工具,可以用于分析和修改运行中的应用程序。在使用Frida之前,您需要先安装Frida和Python。具体安装步骤可以参考Frida官网和Python官网。 2. 下载UniApp APK并解压 您需要下载UniApp APK,并使用解压工具将其解压缩。 3. 安装UniApp插件 UniApp插件是一个Frida插件,可以帮助您分析UniApp应用程序。您可以使用以下命令安装UniApp插件: ``` pip install frida-universal ``` 4. 启动Frida-server 在您的设备上启动Frida-server,具体步骤可以参考Frida官网。 5. 使用Frida分析UniApp应用程序 现在,您可以使用Frida分析UniApp应用程序了。以下是一些常用的Frida命令: - 查看应用程序中的所有类和方法: ``` frida -U -l <UniApp插件路径> -f <应用程序包名> --no-pause ``` - 查看应用程序中指定类的所有方法: ``` frida -U -l <UniApp插件路径> -f <应用程序包名> --no-pause -m <类名> ``` - 监听应用程序中指定方法的调用: ``` frida -U -l <UniApp插件路径> -f <应用程序包名> --no-pause -m <类名>.<方法名> --print ``` 请注意,以上命令仅供参考,具体命令可能因应用程序的不同而异。建议您先了解Frida的基本用法,再根据具体情况进行分析。 希望以上信息对您有所帮助。如果您有其他问题或需求,请随时提出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值