Java.perform(function(){ var money = Java.use("com.xiaojianbang.hook.Money"); money.getInfo.implementation = function () { var result = this.getInfo(); console.log("money.getInfo result: ", result) return result; } money.setFlag.implementation = function (a) { console.log("money.setFlag param: ", a); returnthis.setFlag(a); } });
函数参数和返回值的修改
Java.perform(function(){ var money = Java.use("com.xiaojianbang.hook.Money"); money.getInfo.implementation = function () { var result = this.getInfo(); console.log("money.getInfo result: ", result) return"这是修改后的返回值"; } money.setFlag.implementation = function (a) { console.log("money.setFlag param: ", a); returnthis.setFlag("这是我新设置的参数"); } });
构造方法的hook $init
Java.perform(function(){ var money = Java.use("com.xiaojianbang.hook.Money"); money.$init.implementation = function (a, b) { console.log("money.$init param: ", a, b); returnthis.$init("美元", 200); } });
对象参数的修改 $new
Java.perform(function(){ var wallet = Java.use("com.xiaojianbang.hook.Wallet"); var money = Java.use("com.xiaojianbang.hook.Money"); wallet.deposit.implementation = function (a) { console.log("wallet.deposit param: ", a.getInfo()); returnthis.deposit(money.$new("美元", 200)); } });
HashMap的打印
这里很奇怪,使用spawn启动时,不会输出结果,不知道为什么
Java.perform(function(){ var utils = Java.use("com.xiaojianbang.hook.Utils"); var stringBuilder = Java.use("java.lang.StringBuilder"); utils.shufferMap.implementation = function (a) { var key = a.keySet(); var it = key.iterator(); var result = stringBuilder.$new(); while(it.hasNext()){ var keystr = it.next(); var valuestr = a.get(keystr); result.append(valuestr); } console.log("utils.shufferMap param: ", result.toString()); var result = this.shufferMap(a); console.log("utils.shufferMap result: ", result); return result; } });
重载方法的hook
Java.perform(function(){ var utils = Java.use("com.xiaojianbang.hook.Utils"); utils.getCalc.overload('int', 'int').implementation = function (a, b) { console.log("utils.getCalc param: ", a, b); returnthis.getCalc(a, b); } utils.getCalc.overload('int', 'int', 'int').implementation = function (a, b, c) { console.log("utils.getCalc param: ", a, b, c); returnthis.getCalc(a, b, c); } utils.getCalc.overload('int', 'int', 'int', 'int').implementation = function (a, b, c, d) { console.log("utils.getCalc param: ", a, b, c, d); returnthis.getCalc(a, b, c, d); } });
hook方法的所有重载
Java.perform(function(){ var utils = Java.use("com.xiaojianbang.hook.Utils"); var overloadsArr = utils.getCalc.overloads; for(var i =0; i<overloadsArr.length; i++){ var overload = overloadsArr[i]; overload.implementation = function (){ var param =""; for(var j=0; j<arguments.length; j++){ param+=arguments[j]+" "; } console.log(param); returnthis.getCalc.apply(this, arguments); } } });
functiontest(){ Java.perform(function () { var wallet = Java.use("com.xiaojianbang.hook.Wallet"); var methods = wallet.class.getDeclaredMethods(); var constructors = wallet.class.getDeclaredConstructors(); var fields = wallet.class.getDeclaredFields(); var classes = wallet.class.getDeclaredClasses();
Java.perform(function () { Java.openClassFile("/data/local/tmp/patch.dex").load(); var test = Java.use("com.xiaojianbang.myapplication.Test"); var utils = Java.use("com.xiaojianbang.hook.Utils"); utils.shufferMap.implementation = function (map) { var result = test.print(map); console.log(result); return result; } });
var current_application = Java.use('android.app.ActivityThread').currentApplication(); var context = current_application.getApplicationContext();
Java.perform(function () { var current_application = Java.use('android.app.ActivityThread').currentApplication(); var context = current_application.getApplicationContext(); var path = Java.use("android.content.ContextWrapper").$new(context).getExternalFilesDir("Download").toString(); console.log(path); var ios = newFile(path + "/hyq.txt", "w"); ios.write("hyq is very very very good!!!\n"); ios.flush(); ios.close(); });
Java.cast
向上转型的,不能用toString直接得到结果,比如Map、List类型的打印
Java.perform(function () { var utils = Java.use("com.xiaojianbang.hook.Utils"); utils.shufferMap.implementation = function (hashMap){ console.log("shufferMap: ", hashMap); returnthis.shufferMap(hashMap); } utils.shufferMap2.implementation = function(map){ console.log("map: ", map); var result = Java.cast(map, Java.use("java.util.HashMap")); console.log("result: ", result); returnthis.shufferMap2(map); } });
Java.array
有两个参数,第一个参数传数组元素的类型,第二个参数传数组
Java.perform(function () { var utils = Java.use("com.xiaojianbang.hook.Utils"); //Stirng类型的数组 var strArr = Java.array("Ljava.lang.String;", ["xiaojianbang", "QQ:24358757", "VX:xiaojianbang8888", "公众号:非攻code"]); console.log(utils.myPrint(strArr)); //也可以直接使用 console.log(utils.myPrint(["xiaojianbang", "QQ:24358757", "VX:xiaojianbang8888", "公众号:非攻code"])); //Object类型的数组,有些类型frida不会帮助我们变成对象,比如int需要我们自己处理 var utils = Java.use("com.xiaojianbang.hook.Utils"); var bankCard = Java.use("com.xiaojianbang.hook.BankCard"); var bankCardObj = bankCard.$new("xiaojianbang", "123456789", "CBDA", 1, "15900000000"); var integer = Java.use("java.lang.Integer"); var boolean = Java.use("java.lang.Boolean"); var objArr = Java.array("Ljava.lang.Object;", ["xiaojianbang", integer.$new(30), boolean.$new(true), bankCardObj]); console.log(utils.myPrint(objArr)); //也可以直接使用 console.log(utils.myPrint(["xiaojianbang", integer.$new(30), boolean.$new(true), bankCardObj])); });
ArrayList的主动调用
Java.perform(function () { var arrayList = Java.use("java.util.ArrayList").$new(); var integer = Java.use("java.lang.Integer"); var boolean = Java.use("java.lang.Boolean"); var bankCard = Java.use("com.xiaojianbang.hook.BankCard"); var bankCardObj = bankCard.$new("xiaojianbang", "123456789", "CBDA", 1, "15900000000"); arrayList.add("xiaojianbang"); arrayList.add(integer.$new(30)); arrayList.add(boolean.$new(true)); arrayList.add(bankCardObj); var utils = Java.use("com.xiaojianbang.hook.Utils"); console.log(utils.myPrint(arrayList)); });
让hook只在某一个指定函数内生效
Java.perform(function () { var mainActivity = Java.use("com.xiaojianbang.app.MainActivity"); var stringBuilder = Java.use("java.lang.StringBuilder"); mainActivity.generateAESKey.implementation = function (){ console.log("mainActivity.generateAESKey is called!"); stringBuilder.toString.implementation = function (){ var result = this.toString(); console.log(result); return result; } var result = this.generateAESKey.apply(this, arguments); stringBuilder.toString.implementation = null; return result; } });
hook定位接口的实现类
Java.perform(function () { var classes = Java.enumerateLoadedClassesSync(); for (var index in classes) { let className = classes[index]; if(className.indexOf("com.xiaojianbang") === -1) continue; let clazz = Java.use(className); let resultArr = clazz.class.getInterfaces(); if(resultArr.length === 0) continue; for (let i = 0; i < resultArr.length; i++) { if(resultArr[i].toString().indexOf("com.xiaojianbang.app.TestRegisterClass") !== -1){ console.log("className: ", className); console.log("resultArr: ", resultArr[i]); } } } });
hook定位抽象类的实现类
Java.perform(function () { var classes = Java.enumerateLoadedClassesSync(); for (const index in classes) { let className = classes[index]; if(className.indexOf("com.xiaojianbang") === -1) continue; let clazz = Java.use(className); let resultClass = clazz.class.getSuperclass(); if(resultClass == null) continue; if(resultClass.toString().indexOf("com.xiaojianbang.app.TestAbstract") !== -1){ console.log(className, resultClass); } } });