Frida 操作

frida -U -l hook.js -f com.example.app
frida -U -h hook.js -p target_pid

大部分反编译器支持直接生成Frida Hook 代码

Hook Java层函数

主要函数:

Java.use()

implementation

overload

function hook() {
    Java.perform(function() {
        let classname = Java.use("com.example.app.class"); // Hook 函数的类名
        classname[methodname].overload("Java.lang.String").implementation = function(str) {
            // 具体的函数名,参数变量
            str = "str"; // 修改参数值
            var result = this.methodname(str); // 调用原来的函数
            result = "result"; // 修改返回值
            return result; // 返回结果
        };
    });
}

SetImmediate(hook); // 异步调用

Java 调用静态函数和非静态函数

Java.choose

function hook() {
    Java.perform(function() {
        // 调用static 函数
        let classname = Java.use("com.example.app.class"); // Hook 函数的类名
        classname.setStatic_bool_var();
        // 调用非static 函数
        let classname = "";
        Java.choose("com.example.app.class", {
            onMatch: function(obj) { // 每枚举到一次
                classname = obj;
            },
            onComplete() { // 当所有的类都被枚举后
                if (classname) {
                    classname.setBool_var();
                }
            }
        })
    })
}

SetImmediate(hook); // 异步调用

设置成员变量

设置和函数名相同的成员变量

function hook() {
    Java.perform(function() {
        // 设置静态成员变量
        let classname = Java.use("com.example.app.class"); // Hook 函数的类名
        classname.setStatic_bool_var.value = true;
        // 调用非静态成员变量
        let classname = "";
        Java.choose("com.example.app.class", {
            onMatch: function(obj) { // 每枚举到一次
                classname = obj;
                classname.bool_var.value = true; // 没有和函数名相同的变量 
                classname._same_name_bool_var.value = true; // 和函数名相同的变量需要在变量明前加一个下划线
            },
            onComplete() {} // 当所有的类都被枚举后
        })
    })
}

SetImmediate(hook); // 异步调用

Hook 内部类,枚举类的函数

hook 内部类需要使用$符号

function hook_InnerClasses() {
    Java.perform(function() {
        // hook 内部类需要使用$符号
        var InnerClasses = Java.use("com.example.app.class$InnerClass");
        InnerClasses.methodname.implementation = function() {
            return this.methodname();
        }
    })
}

SetImmediate(hook_InnerClasses())

查找接口,hook动态加载dex

function hook() {
    Java.perform(function() {
        Java.enumerateClassLoaders({
            onMatch: function(loader) {
                // 查找加载对应class的classloder
                if (loader.findClass("com.example.app.DynamicClass")) {
                    Java.classFactory.loader = loader;
                } 
              }, onComplete: function() {}
            }
        });
        console.log(Java.ClassFactory.loader)
        // 使用classloader加载目标class
        var dynamic = Java.use("com.example.DynamicClass");
        consolo.log(dynamic);
        dynamic.methodname.implementation = function() {
            return this.methodname();
        }
    })
}

SetImmediate(hook())