我正在学习frida,并尝试挂钩如下函数:

`.method public final fn()[B`


它返回一个字节数组。这是我的代码:

Java.perform(function () {
    var test = Java.use("com...");
    test.fn.overload().implementation = function () {
        var ret = this.fn();
        console.log("how to write here?");
        return ret;
    };
});


如何打印函数返回的ret变量?这是一个字节[]。我尝试了console.log,但是它只打印一个[object],而hexdump抱怨“期望指针”。如何打印数组?

评论

stackoverflow.com/a/957652/2967945应该为您工作。它可能有一个长度字段。

#1 楼



var ret = this.fn();
var buffer = Java.array('byte', ret);
console.log(buffer.length);
var result = "";
for(var i = 0; i < buffer.length; ++i){
    result+= (String.fromCharCode(buffer[i]));
}
console.log(result);


评论


但这仅适用于具有表示可打印字符的字节值的数组。仅使用result + =(buffer [i]&0xff).toString(16);之类的十六进制表示形式打印数组会更好吗?

–罗伯特
20年5月8日,9:33

#2 楼

Frida的Java字节数组元素表示形式当前为带符号数字。因此,您的字节数组可能包含负数。我们应该编辑已接受的答案以反映这一点:

var buffer = Java.array('byte', ret);
var result = "";
for(var i = 0; i < buffer.length; ++i){
    result += (String.fromCharCode(buffer[i] & 0xff)); // here!!
}
console.log(result);


相关的https://stackoverflow.com/a/9609447/9304999和https://github.com/frida / frida / issues / 289

#3 楼

将字节数组转储为十六进制(仅适用于Android)

如果您在Android上使用Frida,则可以使用Android内置的Apache commons编解码器Hex编码器。据我所知,所有Android版本都应包含org.apache.commons.codec.binary.Hex类。不幸的是,Android中可用的版本无法直接输出String,因此您还必须使用java.lang.String类:

function encodeHex(byteArray) {
    const HexClass = Java.use('org.apache.commons.codec.binary.Hex');
    const StringClass = Java.use('java.lang.String');
    const hexChars = HexClass.encodeHex(byteArray);
    return StringClass.$new(hexChars).toString();
}