14.安卓逆向-frida基础-编写hook脚本2

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

内容参考于:图灵Python学院

本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。

工具下载:

链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3

提取码:6tw3

复制这段内容后打开百度网盘手机App,操作更方便哦

上一个内容:13.安卓逆向-frida基础-编写hook脚本1

接着上一个内容继续,接下来是HOOK构造方法

如下图红框,它有两个构造方法

app中调用构造方法的位置

脚本代码

function demo4(){// HOOK构造方法
   var money = Java.use("com.luoge.com.Money")
   money.$init.overload("java.lang.String","int").implementation = function(str, ii){// 重写构造方法
    console.log(str, ii) // 查看原本参数的值
    str = "飞机"// 修改参数
    ii = 22222// 修改参数
    this.$init(str,ii) // 调用原本的构造方法
   }

}

效果图:

主动调用

效果图:

function demo5(){
    var res = Java.use("com.luoge.com.Money").$new("xxx",23313).getInfo()
    console.log("主动调用", res)
}

第二种主动调用

function demo5(){
    var res = Java.use("com.luoge.com.Money").$new("xxx",23313).getInfo()
    console.log("主动调用", res)
    Java.choose("com.luoge.com.Money", {
        onMatch:function(obj){ // 这里每找到一个Money对象就会调用一次
            console.log('Java.choose', obj.getInfo())
        },
        onComplete:function(){
            console.log('Money对象搜索完执行的代码')
        }
    })
}

HOOK字段

字段就是下图红框里的东西

HOOK静态的字段

function demo6(){
 var money = Java.use("com.luoge.com.Money")
 console.log("flag类型", JSON.stringify(money.flag));
 console.log("flag的值", money.flag.value);
 money.flag.value = "mmmm"
  console.log("flag修改之后的值", money.flag.value);
}

HOOK非静态的字段

function demo6(){
 var money = Java.use("com.luoge.com.Money")
// console.log("flag类型", JSON.stringify(money.flag));
// console.log("flag的值", money.flag.value);
// money.flag.value = "mmmm"
//  console.log("flag修改之后的值", money.flag.value);

    Java.choose("com.luoge.com.Money", {
        onMatch:function(obj){ // 这里每找到一个Money对象就会调用一次
            console.log('Java.choose非静态变量(字段)', obj._name.value)
            obj._name.value = '张飞'
            console.log('Java.choose修改之后非静态变量(字段)', obj._name.value)
        },
        onComplete:function(){
            console.log('Money对象搜索完执行的代码')
        }
    })

}

HOOK内部类

下图红框的就是内部类

效果图:

function demo7(){
 var innerClass = Java.use("com.luoge.com.Money$innerClass")// 内部类的对象使用$符号加类名获取
 innerClass.$init.overload("java.lang.String","int").implementation = function(s,i){
    console.log('demo7s', s);
    console.log('demo7i', i);
    this.$init(s,i);
    console.log(this.outPrint())
    
 }
}

获取全部类和方法

function demo8(){
    console.log(Java.enumerateLoadedClassesSync().join('\n'))
}

获取指定类的普通方法

function demo8(){
//    console.log(Java.enumerateLoadedClassesSync().join('\n'))
    var utils = Java.use("com.luoge.com.Utils")
    var methods = utils.class.getDeclaredMethods()
    for(var i = 0; i < methods.length; i++){
        console.log(methods[i].getName());
    }
}

获取指定类的构造方法

function demo8(){
//    console.log(Java.enumerateLoadedClassesSync().join('\n'))
    console.log('普通方法')
    var utils = Java.use("com.luoge.com.Utils")
    var methods = utils.class.getDeclaredMethods()
    for(var i = 0; i < methods.length; i++){
        console.log(methods[i].getName());
    }
        console.log('构造方法')
     var money = Java.use("com.luoge.com.Money")
     methods = money.class.getDeclaredConstructors()
    for(var i = 0; i < methods.length; i++){
        console.log(methods[i].toString());
        console.log(methods[i].getName());
    }

}

获取指定类的字段

获取指定类的内部类

function demo8(){
//    console.log(Java.enumerateLoadedClassesSync().join('\n'))
    console.log('普通方法\n')
    var utils = Java.use("com.luoge.com.Utils")
    var methods = utils.class.getDeclaredMethods()
    for(var i = 0; i < methods.length; i++){
        console.log(methods[i].getName());
    }
        console.log('构造方法\n')
     var money = Java.use("com.luoge.com.Money")
     methods = money.class.getDeclaredConstructors()
    for(var i = 0; i < methods.length; i++){
        console.log(methods[i].toString());
        console.log(methods[i].getName());
    }
    console.log('字段\n')
    var field = money.class.getDeclaredFields()
    for(var i = 0; i < field.length; i++){
        console.log(field[i].toString())
        console.log(field[i].getName())
    }

   console.log('内部类\n')
    var c = money.class.getDeclaredClasses()
    for(var i = 0; i < c.length; i++){
        console.log(c[i].toString())
        console.log(c[i].getName())
    }

}

安装 @types/frida-gum 插件,可以自动补齐Frida代码


img

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值