//修改"类名"的"method"方法实现,这个新的实现会接受两个参数 utils.method.implementation = function (a, b) { //更改参数的值 a = 123; b = 456; //调用修改过的“method”方法,并将返回值存储在变量 retval 中 var retval = this.method(a, b);
/* 当hook的目标方法或构造函数存在多个重载时,需要使用 overload 来指定具体的参数类型 例如: public class MyClass { public MyClass() { } public MyClass(String str) { } public MyClass(String str, int num) { } } */
hook 构造函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
//hook 构造函数 functionhooktest3() { var utils = Java.use("<package_name>.<class_name>"); //var utils=Java.use("com.nobody.zunjia.DexCall");
//枚举出所有方法 functionhooktest7() { Java.perform(function () { var a = Java.use("<package_name>.<class_name>"); //getDeclaredMethods 枚举所有方法 var methods = a.class.getDeclaredMethods(); for (var i = 0; i < methods.length; i++) { var methodName = methods[i].getName(); console.log(methodName); for (var j = 0; j < a[methodName].overloads.length; j++) { a[methodName].overloads[j].implementation = function () { for (var k = 0; k < arguments.length; k++) { //arguments.length 表示当前方法调用时传入的参数个数 console.log(arguments[k]); //打印每个参数的值
//函数的地址计算 //安卓里面一般 32 位的 so 中用的是 thumb 指令,64 位的 so 中用的是 arm 指令 //ida 中 opcode bytes 判断,arm 指令为四个字节(options->general->Number of opcode bytes(non-graph)输入4) //thumb 指令的函数指令计算方式:so 基地址+函数在 so 中的偏移 +1 //arm 指令的函数指令计算方式:so 基地址+函数在 so 中的偏移
//inline_hook functioninline_hook(){ var soAddr=Module.findBaseAddress("libxxx.so"); if(soAddr){ var funcAddr=soAddr.add(0x1234);//函数基地址+偏移地址 Java.perform(function(){ Interceptor.attach(funcAddr,{ onEnter:function(args){ console.log(this.context); console.log(this.context.x1);//打印寄存器的内容 this.context.x1=ptr(1); console.log(this.context.x1);
} }) }) } }
//将地址的指令解析成汇编 var soAddr=Module.findBaseAddress("libxxx.so"); var codeAddr=Instruction.parse(soAddr.add(0x1234)); console.log(codeAddr.toString());
普通函数与 JNI 函数的主动调用
1 2 3 4 5 6 7
//普通函数与 jni 函数的主动调用 var funcAddr=Module.findBaseAddress("libxxx.so").add(0x1234); //NativeFunction 的第一个参数是地址 第二个参数是返回值类型 第三个[]里面是传入的参数的类型(有几个就填几个) var aesAddr= newNativeFunction(funcAddr,'pointer',['pointer','pointer']); var encry_test=Memory.allocUtf8String("cyphertext"); var key=Memory.allocUtf8String('key'); console.log(aesAddr(encry_test,key).readCString());