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

本文介绍如何使用 FridaAndroidInjector 进行 Android 应用的动态分析。通过示例代码展示了如何将脚本注入到目标应用进程中,并实现日志重定向、广播发送等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码来源于,本文记录其实现过程
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;
};

Frida inject是指使用Frida框架进行注入操作。Frida是一款功能强大的开源工具,可以在多平台上进行动态插桩分析。通过Frida inject,我们可以将自己的代码注入到目标应用程序中,以便实现动态修改、监控和分析目标应用程序的功能。 使用Frida inject可以实现多种功能。首先,可以实时修改目标应用程序中的代码逻辑,例如修改函数参数、返回值等。这是非常有用的,特别是在需要调试应用程序者绕过某些限制时。其次,Frida inject可以帮助我们监控目标应用程序的运行状态,包括跟踪函数调用、分析内存等。通过监控,我们可以更好地了解目标应用程序的工作原理,同时也有助于检测和解决潜在的问题。最后,Frida inject可以用于应用程序的逆向工程,帮助我们分析目标应用程序的内部结构、数据和算法。这对于安全研究和漏洞挖掘等领域非常重要。 Frida inject的工作原理是通过Hook技术实现的。Hook是一种在应用程序负责的执行过程中插入自己代码的技术。Frida利用了操作系统提供的API和框架,实现了对目标应用程序的Hook操作。通过Frida注入技术,我们可以在目标应用程序的执行过程中注入自己的代码,并对其进行操控和监控。 总之,Frida inject是一种非常强大的动态分析工具,能够帮助我们实现对目标应用程序的修改、监控和逆向分析等功能。在移动应用程序开发、安全研究和软件测试等领域都有广泛的应用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值