Frida04 - 基本API用法

125 阅读1分钟

​参考文档

api-caller.com/2019/03/30/…

frida.re/docs/javasc…

执行脚本

frida -U -f com.example.demo1 --no-pause -l agent/demo1/demo1.js

智能提示

编写脚本时没有智能提示很烦人,如何有智能提示在第一篇已经说过了,再次贴一下链接:

github.com/oleavr/frid…

代码演示

全部上传到了 github 上:github.com/aprz512/And…

hook实例方法/重载方法/静态方法

// 相当于是找到类 Class 对象
var fridaDemo1Class = Java.use("com.example.demo1.FridaDemo1")

// hook com.example.demo1.FridaDemo1#func(int, int)
fridaDemo1Class.func.overload('int''int').implementation = function (arg1, arg2) {
    // 获取原函数的结果
    var result = this.func(arg1, arg2);
    // 打印参数与结果
    console.log("arg1, arg2, result", arg1, arg2, result)
    // 改变函数的结果
    return 9527;
}

// hook com.example.demo1.FridaDemo1#func(java.lang.String)
fridaDemo1Class.func.overload('java.lang.String').implementation = function (arg1) {
    // 构造一个 String 对象
    var helloStr = Java.use('java.lang.String').$new('Hello')
    // 改变传递的参数,执行原函数
    var result = this.func(helloStr);

    console.log("arg1, result", arg1, result)

    // 返回 world
    return Java.use('java.lang.String').$new("World");
}

// hook com.example.demo1.FridaDemo1#nice
fridaDemo1Class.nice.implementation = function () {
    // 获取原函数的结果
    var result = this.nice();
    // 打印参数与结果
    console.log("nice result", result)
    return result;
}

调用实例方法

// 找到类的实例对象
Java.choose("com.example.demo1.MainActivity", {
    onMatchfunction (instance) {
        console.log("found instance :", instance)
        console.log("found instance :", instance.abc())
    }, onCompletefunction () { }
})

调用静态方法

var result = Java.use("com.example.demo1.MainActivity").sabc();
console.log(result);

未标题-1.jpg

定时触发

function trigger() {
    Java.perform(function () {
        // 找到类的实例对象
        Java.choose("com.example.demo1.MainActivity", {
            onMatchfunction (instance) {
                console.log("trigger test method ... ", instance.test())
            }, onCompletefunction () { }
        })
    })
}

// 2s后执行trigger函数
setTimeout(trigger, 2000)

立即触发

function main() {
    Java.perform(function () {
   ...
    }
}

// 立即执行 main 函数
setImmediate(main)

测试代码

public class FridaDemo1 {

    private static final String secret = "secret";
    private StringBuilder builder = new StringBuilder();

    public static String secret2() {
        return secret;
    }

    String func(String x) {
        String s = x.toLowerCase();
        builder.append(s);
        return s;
    }

    int func(int x, int y) {
        builder.append(x + y);
        return x + y;
    }

    String secret() {
        return builder.toString();
    }

    static int nice() {
        return 333;
    }

}
public class MainActivity extends AppCompatActivity {

    private void test() {
        FridaDemo1 demo1 = new FridaDemo1();
        demo1.func(9933);
        String s = FridaDemo1.secret2();
        demo1.func(s);
        demo1.secret();
        FridaDemo1.nice();
    }

    public String abc() {
        Log.e("MainActivity""you invoked adc");
        return "abc";
    }

    public static String sabc() {
        Log.e("MainActivity""you invoked static adc");
        return "sabc";
    }

}