使用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
相关产品推荐
相关产品推荐

