在frida js脚本中打印[B字节数组

逆向工程 安卓 函数挂钩
2021-06-28 06:40:46

我正在学习 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函数返回变量?这是一个byte[]我试过了,console.log但它只打印一个[object],并hexdump抱怨'expected a pointer'如何打印数组?

3个回答

 

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);

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/9304999https://github.com/frida/frida/issues/289

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

如果您在 Android上使用Frida,还有一种替代方法,即使用 Android 内置的 Apache 公共编解码器十六进制编码器。据我所知,所有 Android 版本都应该包含org.apache.commons.codec.binary.Hex该类。不幸的是,Android 中可用的版本不直接输出字符串,因此您还必须使用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();
}