// hook静态方法
function hook_getCalc() { // 定义hook方法
Java.perform(function () { // 进入Java环境
var utils = Java.use('com.luoge.com.Utils'); // 获取MainActivity类
utils.getCalc.implementation = function (arg1, arg2) { // 实现onCreate方法
console.log('utils.getCalc的参数1:', arg1); // 打印日志
console.log('utils.getCalc的参数2:', arg2); // 打印日志
var res = this.getCalc(arg1, arg2); // 调用原onCreate方法
return 800;
};
});
}
// hook实例方法
function hook_getFlag() { // 定义hook方法
Java.perform(function () { // 进入Java环境
var utils = Java.use('com.luoge.com.Utils');
utils.getFlag.implementation = function () {
var res = this.getFlag(); // 调用原onCreate方法
console.log('utils.getFlag的返回值:', res); // 打印日志
return "likeme";
};
});
}
// hook方法重载
/**
* .overload()
* .overload('int')
* .overload('com.luoge.com.Money')
*/
function hook_getOver() { // 定义hook方法
Java.perform(function () { // 进入Java环境
var utils = Java.use('com.luoge.com.Utils'); // 获取MainActivity类
console.log("开始hook方法重载")
/*utils.getOver.overload().implementation = function() {
var res = this.getOver(); // 调用原onCreate方法
console.log('utils.getOver的返回值:', res); // 打印日志
return "likeme666" ;
};
utils.getOver.overload('int').implementation = function(arg1) {
console.log('utils.getOver的参数1:', arg1); // 打印日志
var res = this.getOver(arg1); // 调用原onCreate方法
console.log('utils.getOver的返回值:', res); // 打印日志
return "likeme888" ;
};
utils.getOver.overload('com.luoge.com.Money').implementation = function(arg1) {
console.log('utils.getOver的参数3:', arg1); // 打印日志
var res = this.getOver(arg1); // 调用原onCreate方法
console.log('utils.getOver的返回值:', res); // 打印日志
return "likeme66668888" ;
};
// hook全部重载方法(utils.getOver)
for(var i=0;i<utils.getOver.overloads.length;i++){
console.log("进入第"+i+"个重载方法")
utils.getOver.overloads[i].implementation = function() {
for (var j=0;j<arguments.length;j++){
console.log("重载方法"+i+":参数"+j+": "+arguments[j])
}
return this.getOver.apply(this,arguments)
}
}*/
// utils.getOver.overload().implementation = function() {
// var money = Java.use("com.luoge.com.Money")
// var moneyInstance = money.$new();
// var res3 = utils.getOver.overload('com.luoge.com.Money').call(this,moneyInstance)
// console.log("utils.getOver的返回值res3:",res3)
// }
});
}
// hook构造方法
function hook_money() {
Java.perform(function () {
var money = Java.use("com.luoge.com.Money");
money.$init.overload('java.lang.String', 'int').implementation = function (str, num) {
console.log('money.constructor的参数1:', str + " : " + num); // 打印日志
str = "欧元"
num = 6868
var moneyInstance = this.$init(str, num); // 调用原构造方法
return moneyInstance;
}
// 调用Money的getInfo方法
money.getInfo.implementation = function () {
console.log("money.getInfo被调用")
var str = this.getInfo(); // 调用原getInfo方法
console.log("money.getInfo的返回值:", str); // 打印日志
return "欧元88888";
}
});
}
//主动调用方法
function hook_zhudong() {
Java.perform(function () {
var res = Java.use("com.luoge.com.Money").$new("zjj", 10000).getInfo();
console.log("res:", res)
});
Java.choose("com.luoge.com.Money", {
onMatch: function (instance) {
console.log("instance:", instance.getInfo())
var res = instance.getInfo();
console.log("res:", res)
instance._name.value = "ouyuan"; //字段名与方方法名相同 前面需要加个下划线
console.log(instance._name.value)
instance.num.value = 150000;
console.log(instance.num.value)
},
onComplete: function () {
console.log("onComplete")
}
})
}
// hook java类
function hook_class() {
Java.perform(function () {
var res = Java.use("com.luoge.com.Money");
//获取已有对象的方法,非静态字段的修改
Java.choose("com.luoge.com.Money", {
onMatch: function (obj) {
obj._name.value = "ouyuannnn"; //字段名与方方法名相同 前面需要加个下划线
console.log(obj._name.value)
obj.num.value = 150000;
console.log(obj.num.value)
},
onComplete: function () {
console.log("complete!!!!")
}
});
})
}
//hook 内部类
function hook_innerClass() {
Java.perform(function () {
var inner_cls = Java.use("com.luoge.com.Money$innerClass");
inner_cls.$init.overload('java.lang.String', 'int').implementation = function (res1, res2) {
console.log("inner_cls.$init被调用,参数1:", res1 + " : " + res2)
this.$init(res1, 888); // 先实例化内部类
var str = this.outPrint(); // 调用内部类的方法
console.log("inner_cls.$init的返回值:", str); // 打印日志
}
});
}
//hook枚举类和方法
function hook_enum() {
Java.perform(function () {
var utils = Java.use("com.luoge.com.Utils"); //获取枚举类
var methods = utils.class.getDeclaredMethods();
console.log("枚举类的方法:", methods);
for (var i = 0; i < methods.length; i++) {
var method = methods[i];
console.log(method.getName());
}
// hook构造函数
var money = Java.use("com.luoge.com.Money");
var constructors = money.class.getDeclaredConstructors(); // 获取构造函数
console.log("Money的构造函数:", constructors);
for (var i = 0; i < constructors.length; i++) {
var constructor = constructors[i];
console.log(constructor.getName());
console.log(constructor.toString())
}
// hook字段
var fields = money.class.getDeclaredFields(); // 获取字段
console.log("Money的字段:", fields);
// hook方法hook内部类(); // hook内部类
// money.class.getDeclaredClasses().forEach(function (cls) {
// console.log("Money的内部类:", cls.getName());
// var constructors = cls.getDeclaredConstructors(); // 获取内部类的构造函数
// console.log("Money的内部类的构造函数:", constructors);
// })
var myclass = money.class.getDeclaredClasses()
for (var i = 0; i < myclass.length; i++) {
var cls = myclass[i];
console.log("Money的内部类:", cls.getName());
}
});// 根据枚举值获取枚举对象
}
// setImmediate(hook_getCalc); // hook静态方法
// setImmediate(hook_getFlag); // hook实例方法
// setImmediate(hook_getOver); // hook方法重载
// setImmediate(hook_money); // hook构造方法
// setImmediate(hook_class); // hook java类
// setImmediate(hook_zhudong); // 主动调用方法
// setImmediate(hook_innerClass); // hook java内部类
setImmediate(hook_enum); // hook枚举类和方法
frida-hook 学习日记——安卓逆向
于 2024-06-05 20:13:50 首次发布
1271

被折叠的 条评论
为什么被折叠?



