免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
内容参考于:图灵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代码