frida-hook 学习日记——安卓逆向

// hook静态方法
function hook_getCalc() { // 定义hook方法
    Java.perform(function () { // 进入Java环境
        var utils = Java.use('com.luoge.com.Utils'); // 获取MainActivity类
        utils.getCalc.implementation = function (arg1, arg2) { // 实现onCreate方法
            console.log('utils.getCalc的参数1:', arg1); // 打印日志
            console.log('utils.getCalc的参数2:', arg2); // 打印日志
            var res = this.getCalc(arg1, arg2); // 调用原onCreate方法
            return 800;
        };
    });
}

// hook实例方法
function hook_getFlag() { // 定义hook方法
    Java.perform(function () { // 进入Java环境
        var utils = Java.use('com.luoge.com.Utils');
        utils.getFlag.implementation = function () {
            var res = this.getFlag(); // 调用原onCreate方法
            console.log('utils.getFlag的返回值:', res); // 打印日志
            return "likeme";
        };
    });
}

// hook方法重载
/**
 *         .overload()
 *         .overload('int')
 *         .overload('com.luoge.com.Money')
 */
function hook_getOver() { // 定义hook方法
    Java.perform(function () { // 进入Java环境
        var utils = Java.use('com.luoge.com.Utils'); // 获取MainActivity类
        console.log("开始hook方法重载")
        /*utils.getOver.overload().implementation = function() {
            var res = this.getOver(); // 调用原onCreate方法
            console.log('utils.getOver的返回值:', res); // 打印日志
            return "likeme666" ;
        };
        utils.getOver.overload('int').implementation = function(arg1) {
            console.log('utils.getOver的参数1:', arg1); // 打印日志
            var res = this.getOver(arg1); // 调用原onCreate方法
            console.log('utils.getOver的返回值:', res); // 打印日志
            return "likeme888" ;
        };
        utils.getOver.overload('com.luoge.com.Money').implementation = function(arg1) {
            console.log('utils.getOver的参数3:', arg1); // 打印日志
            var res = this.getOver(arg1); // 调用原onCreate方法
            console.log('utils.getOver的返回值:', res); // 打印日志
            return "likeme66668888" ;
        };
        // hook全部重载方法(utils.getOver)
        for(var i=0;i<utils.getOver.overloads.length;i++){
            console.log("进入第"+i+"个重载方法")
            utils.getOver.overloads[i].implementation = function() {
                for (var j=0;j<arguments.length;j++){
                    console.log("重载方法"+i+":参数"+j+": "+arguments[j])
                }
                return this.getOver.apply(this,arguments)
            }

        }*/

        // utils.getOver.overload().implementation = function() {
        //     var money = Java.use("com.luoge.com.Money")
        //     var moneyInstance = money.$new();
        //     var res3 = utils.getOver.overload('com.luoge.com.Money').call(this,moneyInstance)
        //     console.log("utils.getOver的返回值res3:",res3)
        // }

    });
}

// hook构造方法
function hook_money() {
    Java.perform(function () {
        var money = Java.use("com.luoge.com.Money");
        money.$init.overload('java.lang.String', 'int').implementation = function (str, num) {
            console.log('money.constructor的参数1:', str + " : " + num); // 打印日志
            str = "欧元"
            num = 6868
            var moneyInstance = this.$init(str, num); // 调用原构造方法
            return moneyInstance;
        }

        // 调用Money的getInfo方法
        money.getInfo.implementation = function () {
            console.log("money.getInfo被调用")
            var str = this.getInfo(); // 调用原getInfo方法
            console.log("money.getInfo的返回值:", str); // 打印日志
            return "欧元88888";
        }

    });
}

//主动调用方法
function hook_zhudong() {
    Java.perform(function () {
        var res = Java.use("com.luoge.com.Money").$new("zjj", 10000).getInfo();
        console.log("res:", res)
    });
    Java.choose("com.luoge.com.Money", {
        onMatch: function (instance) {
            console.log("instance:", instance.getInfo())
            var res = instance.getInfo();
            console.log("res:", res)
            instance._name.value = "ouyuan"; //字段名与方方法名相同 前面需要加个下划线
            console.log(instance._name.value)
            instance.num.value = 150000;
            console.log(instance.num.value)
        },
        onComplete: function () {
            console.log("onComplete")
        }
    })
}


// hook java类
function hook_class() {
    Java.perform(function () {
        var res = Java.use("com.luoge.com.Money");
//获取已有对象的方法,非静态字段的修改
        Java.choose("com.luoge.com.Money", {
            onMatch: function (obj) {
                obj._name.value = "ouyuannnn"; //字段名与方方法名相同 前面需要加个下划线
                console.log(obj._name.value)
                obj.num.value = 150000;
                console.log(obj.num.value)
            },
            onComplete: function () {
                console.log("complete!!!!")
            }
        });
    })

}

//hook 内部类
function hook_innerClass() {
    Java.perform(function () {
        var inner_cls = Java.use("com.luoge.com.Money$innerClass");
        inner_cls.$init.overload('java.lang.String', 'int').implementation = function (res1, res2) {
            console.log("inner_cls.$init被调用,参数1:", res1 + " : " + res2)
            this.$init(res1, 888); // 先实例化内部类
            var str = this.outPrint(); // 调用内部类的方法
            console.log("inner_cls.$init的返回值:", str); // 打印日志
        }
    });
}


//hook枚举类和方法
function hook_enum() {
    Java.perform(function () {
        var utils = Java.use("com.luoge.com.Utils");   //获取枚举类
        var methods = utils.class.getDeclaredMethods();
        console.log("枚举类的方法:", methods);
        for (var i = 0; i < methods.length; i++) {
            var method = methods[i];
            console.log(method.getName());
        }

        // hook构造函数
        var money = Java.use("com.luoge.com.Money");
        var constructors = money.class.getDeclaredConstructors(); // 获取构造函数
        console.log("Money的构造函数:", constructors);
        for (var i = 0; i < constructors.length; i++) {
            var constructor = constructors[i];
            console.log(constructor.getName());
            console.log(constructor.toString())
        }

        // hook字段
        var fields = money.class.getDeclaredFields(); // 获取字段
        console.log("Money的字段:", fields);

        // hook方法hook内部类(); // hook内部类
        // money.class.getDeclaredClasses().forEach(function (cls) {
        //     console.log("Money的内部类:", cls.getName());
        //     var constructors = cls.getDeclaredConstructors(); // 获取内部类的构造函数
        //     console.log("Money的内部类的构造函数:", constructors);
        // })
        var myclass = money.class.getDeclaredClasses()
        for (var i = 0; i < myclass.length; i++) {
            var cls = myclass[i];
            console.log("Money的内部类:", cls.getName());
        }

    });// 根据枚举值获取枚举对象
}

// setImmediate(hook_getCalc); // hook静态方法
// setImmediate(hook_getFlag); // hook实例方法
// setImmediate(hook_getOver); // hook方法重载
// setImmediate(hook_money); // hook构造方法
// setImmediate(hook_class); // hook java类
// setImmediate(hook_zhudong); // 主动调用方法
// setImmediate(hook_innerClass); // hook java内部类
setImmediate(hook_enum); // hook枚举类和方法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值