我尝试使用Frida和位于Android虚拟设备上的服务器(模拟)读取堆上的内存,但是一直出现内存access violation
错误。
首先,我正在寻找一个有趣的类的实例:
Java.performNow(function() {
Java.choose("com.example.model.interestingObject", {
onMatch: function(instance) {
console.log(instance.toString());
}, onComplete: function() {
}
});
});
作为输出,我得到(我想)内存中的地址:
com.example.model.interestingObject@d735e35
但是当我尝试从该地址读取内容时:
Memory.readByteArray(ptr("0xd735e35"), 64);
,然后出现以下错误:
Error: access violation accessing 0xd735e35
at frida/runtime/core.js:282
at /repl18.js:26
问题是,如何从该地址读取字节?我对Frida很新,所以可能做错了。希望得到任何帮助!
答案 0 :(得分:1)
我认为您只需要强制转换在onMatch
中找到的实例
Java.cast(instance,Java.use("com.example.model.interestingObject")).toString()
docs对其他一切都很好;
Java.choose(className, callbacks)
:通过扫描Java堆来枚举className类的活动实例,其中回调是一个指定以下对象的对象:
onMatch:函数(实例):对使用即用型实例找到的每个活动实例调用一次,就像调用Java.cast()具有该特定实例的原始句柄一样。 此函数可能返回字符串stop以尽早取消枚举。
onComplete:函数():在枚举所有实例后调用
要打印班级成员,您可以使用Object.getOwnPropertyNames(obj.__proto__).join('\n\t')
答案 1 :(得分:0)
查看Java函数Object.toString()
,您可以看到值d735e35
不是地址,而是对象的哈希码:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
因此,您正在查看错误的内存地址,这会导致您观察到access violation
。
通常对于Java / Android,您永远不要尝试直接访问内存。而是使用Frida的可用功能列出所有字段及其值。