You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Frida无法Hook非静态方法,拦截isRooted与isEmulator遇阻

Frida Hook DeviceDetails类失败问题解决

问题分析

你之前的脚本用Java.choose查找com.moe.device.DeviceDetails的实例,但onMatch从未触发——核心原因是这个类里全是静态方法,从未被实例化过,内存中根本不存在该类的实例对象,所以Java.choose自然找不到任何匹配项。

另外原脚本里的instance.collect()调用逻辑也错误:collect是静态方法,应该通过类而非实例调用,而且原方法需要传入Context和Map两个参数,你的写法完全不符合方法签名。

正确解决方案

针对目标类的静态方法特性,有两种直接有效的Hook方式:

方案1:Hook静态collect方法,修改传入的Map参数

直接拦截collect方法,在原方法执行后修改Map中的目标键值:

Java.perform(() => {
    try {
        // 指定类加载器(如果默认加载器找不到类,替换成你之前找到的classLoaderToUse)
        // var classLoaderToUse = Java.enumerateClassLoadersSync()[2];
        // Java.classFactory.loader = classLoaderToUse;
        
        const DeviceDetails = Java.use("com.moe.device.DeviceDetails");
        const DeviceInformationInspector = Java.use("com.moe.device.DeviceInformationInspector");

        // Hook静态collect方法,匹配参数签名:Context + Map
        DeviceDetails.collect.implementation = function(context, map) {
            console.log("[*] 已Hook collect方法");
            // 先执行原方法,让它填充其他设备信息
            this.collect(context, map);
            // 修改目标键值
            map.put("isRooted", "false");
            map.put(DeviceInformationInspector.IS_EMULATOR.value, String.valueOf(false));
            console.log("[*] 已修改isRooted和IS_EMULATOR的值");
        };
    } catch (error) {
        console.log("[!] 错误:", error);
    }
});

方案2:直接Hook isRooted和isEmulator静态方法,篡改返回值

如果不需要关心Map的其他内容,直接Hook两个静态检测方法的返回值更简单:

Java.perform(() => {
    try {
        // 如需指定类加载器,取消下方注释
        // var classLoaderToUse = Java.enumerateClassLoadersSync()[2];
        // Java.classFactory.loader = classLoaderToUse;
        
        const DeviceDetails = Java.use("com.moe.device.DeviceDetails");

        // Hook isRooted方法,强制返回"false"
        DeviceDetails.isRooted.implementation = function() {
            console.log("[*] 已Hook isRooted方法,返回'false'");
            return "false";
        };

        // Hook isEmulator方法,强制返回false(注意原方法返回的是boolean类型)
        DeviceDetails.isEmulator.implementation = function() {
            console.log("[*] 已Hook isEmulator方法,返回false");
            return false;
        };
    } catch (error) {
        console.log("[!] 错误:", error);
    }
});

注意事项

  • 类加载器:如果默认类加载器找不到目标类,保留你之前通过枚举找到的classLoaderToUse并设置给Java.classFactory.loader。
  • 方法签名匹配:如果collect方法有重载,需要在Hook时明确指定参数类型,比如DeviceDetails.collect.overload("android.content.Context", "java.util.Map").implementation = ...。
  • 静态常量访问:访问DeviceInformationInspector.IS_EMULATOR这类静态常量时,必须加上.value才能获取到实际的键值。

内容的提问来源于stack exchange,提问作者Cooter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 12:50:15