如何使用Frida读取堆上的内存?

时间:2019-01-07 22:29:28

标签: android frida

我尝试使用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很新,所以可能做错了。希望得到任何帮助!

2 个答案:

答案 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的可用功能列出所有字段及其值。