0

我正在学习弗里达。

例如,我只是通过 StringBuilder 创建了一个字符串并附加它。

我用“frida”钩住了“append”。

但它不起作用。

    String val;
    val = "Log Data....";
    StringBuilder log = new StringBuilder("LOG : ").append(val);
    log.append("[[");
    log.append("]]");
Java.perform(function () {

    var StringBuilder = Java.use('java.lang.StringBuilder');
    var ctor = StringBuilder.$init.overload('java.lang.String');

    ctor.implementation = function (arg) {
        var log_arg = '';
        var result = ctor.call(this, arg);
        if (arg !== null) {
            log_arg = arg.toString();
        }

        console.log('new StringBuilder("' + log_arg + '");');
        return result;
    };

    var append = StringBuilder.append.overload('java.lang.String');


    append.implementation = function (arg) {
        var result = append.call(this, arg);
        var log_arg = '';
        if (result !== null) {
            log_arg = result.toString();
        }
        console.log('StringBuilder.append1(); => ' + log_arg);
        return result;
    };
});

结果: new StringBuilder("LOG : ");

“日志数据....[[]]”-我看不到消息....可能没有挂钩。

4

1 回答 1

2

您要附加的钩子没有钩住已初始化的实例。

var ctor = StringBuilder.$init.overload('java.lang.String');

这是您初始化和分配的地方,因此您需要在此处进行调用。更像的东西

var append = ctor.implementation = function(arg)...

应该管用。但是因为 StringBuilder 有大量的重载来覆盖大量的数据类型并且它可以被调用很多次,所以简单地挂钩它的 toString 方法要容易得多,这样您就不必进行任何转换或编写大量的过载。

const StringBuilder = Java.use('java.lang.StringBuilder');
 StringBuilder.toString.implementation = function () {
var res = this.toString();
var tmp = "";
if (res !== null){
    tmp = res.toString().replace("/n", "");
    console.log(tmp);
}

return res;
};

应该挂钩它将输出的实际字符串。

于 2019-10-25T03:23:19.203 回答