1、Hook普通方法、打印参数和修改返回值
Hook函数
Hook代码
function hookTest1(){
var utils = Java.use("com.zj.wuaipojie.Demo");
utils.a.implementation = function(str){
// a = "test";
var retval = this.a(str);
console.log(str , retval);
return retval;
}
}
function main(){
Java.perform(function(){
hookTest1();
});
}
setImmediate(main);
2、Hook重载参数
Hook的函数:
Hook代码
// .overload()
// .overload('自定义参数')
// .overload('int')
function hookTest2(){
var utils = Java.use("com.zj.wuaipojie.Demo");
//overload定义重载函数Inner,根据函数的参数类型填
utils.Inner.overload('com.zj.wuaipojie.Demo$Animal','java.lang.String').implementation = function(a,b){
b = "aaaaaaaaaa";
//将修改后的参数传给原方法
this.Inner(a,b);
console.log(a);
console.log(b);
}
}
function main(){
Java.perform(function(){
hookTest2();
});
}
setImmediate(main);
3、Hook构造函数
方法
代码
function hookTest3(){
var utils = Java.use("com.zj.wuaipojie.Demo");
//修改类的构造函数的实现,$init表示构造函数
utils.$init.overload('java.lang.String').implementation = function(str){
console.log(str);
str = "52";
this.$init(str);
}
}
function main(){
Java.perform(function(){
hookTest3();
});
}
setImmediate(main);
4、hook静态变量的值
方法
代码
function hookTest4(){
Java.perform(function(){
//静态字段的修改
var utils = Java.use("com.zj.wuaipojie.Demo");
//修改类的静态字段"flag"的值
utils.staticField.value = "我是被修改的静态变量";
console.log(utils.staticField.value);
//非静态字段的修改
//使用`Java.choose()`枚举类的所有实例
});
}
function main(){
Java.perform(function(){
hookTest4();
});
}
setImmediate(main);
5、hook动态变量的值
方法
代码
function hookTest5(){
//perform
Java.perform(function(){
//使用`Java.choose()`枚举类的所有实例
Java.choose("com.zj.wuaipojie.Demo", {
//onMatch循环匹配内存中com.zj.wuaipojie.Demo类中的实例传给obj
onMatch: function(obj){
//修改实例的非静态字段"_privateInt"的值为"123456",并修改非静态字段"privateInt"的值为9999。
// obj._privateInt.value = "123456"; //字段名与函数名相同 前面加个下划线
obj.privateInt.value = 9999;
console.log(obj.privateInt.value);
},
onComplete: function(){
}
});
});
}
function main(){
Java.perform(function(){
hookTest5();
});
}
setImmediate(main);
6、Hook内部类
方法
代码
function hookTest6(){
Java.perform(function(){
//内部类
var innerClass = Java.use("com.zj.wuaipojie.Demo$InnerClass");
console.log(innerClass);
innerClass.$init.implementation = function(){
console.log("eeeeeeee");
}
});
}
function main(){
Java.perform(function(){
hookTest6();
});
}
setImmediate(main);
7、枚举所有的类与类的所有方法
function hookTest7(){
Java.perform(function(){
//枚举所有的类与类的所有方法,异步枚举
Java.enumerateLoadedClasses({
onMatch: function(name,handle){
//过滤类名
if(name.indexOf("com.zj.wuaipojie.Demo") !=-1){
console.log(name);
var clazz =Java.use(name);
console.log(clazz);
var methods = clazz.class.getDeclaredMethods();
console.log(methods);
}
},
onComplete: function(){}
})
})
}
function main(){
Java.perform(function(){
hookTest7();
});
}
setImmediate(main);
8、枚举所有方法
function hookTest8(){
Java.perform(function(){
var Demo = Java.use("com.zj.wuaipojie.Demo");
//getDeclaredMethods枚举所有方法
var methods =Demo.class.getDeclaredMethods();
for(var j=0; j < methods.length; j++){
var methodName = methods[j].getName();
console.log(methodName);
for(var k=0; k<Demo[methodName].overloads.length;k++){
Demo[methodName].overloads[k].implementation = function(){
for(var i=0;i<arguments.length;i++){
console.log(arguments[i]);
}
return this[methodName].apply(this,arguments);
}
}
}
})
}
function main(){
Java.perform(function(){
hookTest8();
});
}
setImmediate(main);
方法输出
9、静态方法的主动调用
function hookTest9(){
Java.perform(function(){
var en=Java.use("com.zj.wuaipojie.Encode");
var ret = en.encode("addafd")
console.log(ret);
})
}
function main(){
Java.perform(function(){
hookTest9();
});
}
setImmediate(main);
10、动态方法的主动调用
//return ret;
function hookTest10(){
Java.perform(function () {
var ret = null;
Java.choose("com.zj.wuaipojie.Demo",{ //要hook的类
onMatch:function(instance){
ret=instance.privateFunc("aaaaaaa"); //要hook的方法
console.log("result: " + ret);
},
onComplete:function(){
console.log("result: " + ret);
}
});
})
}
function main(){
Java.perform(function(){
hookTest10();
});
}
setImmediate(main);