我正在try 拦截并更改isRootedisEmulator,但似乎无法挂接该实例.

Java.perform(() => {
  var classLoaderToUse = Java.enumerateClassLoadersSync()[2]; //found through trial and error
  Java.classFactory.loader = classLoaderToUse;

  try {
    Java.choose("com.moe.device.DeviceDetails", {
      onMatch: function (instance) {
        console.log("[ * ] Instance found in memory: " + instance);
        a=instance.collect();
        a.map.put("isRooted", "false");
        a.map.put(DeviceInformationInspector.IS_EMULATOR, String.valueOf(false));
      },
      onComplete: function () {},
    });
  } catch (error) {
      console.log(error);
  }
});

下面是我试图挂接的函数的模型:

package com.moe.device;
    public final class DeviceDetails{
        public static void collect(Context context, Map<String, String> map) {
            map.put("deviceManufacturer", Build.MANUFACTURER);
            map.put("hardwareModel", Build.MODEL);
            map.put("deviceBoard", Build.BOARD);
            map.put("deviceBrand", Build.BRAND);
            map.put("buildDisplayId", Build.DISPLAY);
            map.put("isRooted", isRooted());
            map.put(DeviceInformationInspector.IS_EMULATOR, String.valueOf(isEmulator()));
        }
    
         private static String isRooted() {
           return "False"
         }
         private static String isEmulator() {
           return False
         }
    }

我不能让"实例在内存中找到:"来显示,但onComplete中的任何console.log()都可以.我不确定我是否正确地完成了map个替换,但现在我只是试图了解该方法.

推荐答案

Frida使用的常见方法不是在内存中挂钩现有的类实例.相反,您只需挂钩整个类,以便每个现有的或将来创建的实例都将使用您挂钩的方法(S).

常见的方法是使用以下挂钩代码:

Java.perform(() => {
  
  let DeviceDetailsClass = Java.use("com.moe.device.DeviceDetails");
  
  DeviceDetailsClass.isRooted.implementation =  function () {
    return "False";
  };
  
  
  DeviceDetailsClass.isEmulator.implementation =  function () {
    return "False";
  };
  
});

Android相关问答推荐

在Android Studio Iguana 2023.2.1中,哪里可以找到能量分析器?

广播接收者意图从服务内设置,而不被其他服务接收

道查询注释部分房间表名称

原始mp3文件不显示与proguard

如何更新Kotlin中的显示?

如何使可拖动内容停留在可组合框的边界内

如何防止在Android Studio中设置kotlin断点时优化变量

如何使用 Wea​​r OS 上的运行状况服务模拟位置?

如何在jetpack compose中使可组合的屏幕zoom 到不同的手机(屏幕)尺寸?

在一个函数中组合相同的流 struct

java.lang.ExceptionInInitializerError -- 原因:java.lang.NullPointerException

获取 ArithmeticException:除以零,但我没有在任何地方除以零

如何将一个 Composable 作为其参数传递给另一个 Composable 并在 Jetpack Compose 中显示/运行它

Composable 不会在单击按钮时重新组合

Kotlin 调用带参数的函数 Any is xxx ||任何 yyy 都不起作用

如何在 Jetpack Compose 中擦除画布时变得透明,现在我得到白色?

Android:在模块 jetified-play-services-measurement 和 jetified-play-services-measurement-impl 中发现重复类

如何在 flow.stateIn() 之后从流中的另一个函数发出emits ?

单击后退按钮时,应用程序会在一秒钟后崩溃

实际类型别名ApplicationContext没有相应的预期声明