$init 构造方法
$new 创建对象
$dispose() 手动销毁对象
console.log("基本HOOK");
console.log("脚本加载成功");
Java.perform(function() {
// 定位类
let money = Java.use("com.secbug.hook.Money");
// hook setFlag 函数
// x 是传入参数
money.setFlag.implementation = function(x) {
// 打印传入参数
console.log("money.setFlag param: ", x);
// 调用原有的setFlag函数
return this.setFlag(a);
}
// hook getInfo 函数
money.getInfo.implementation = function() {
// 调用原有的getInfo函数
let result = this.getInfo();
console.log("money.getInfo: ", result);
// 直接返回计算结果
return result;
}
}
overloads.js
console.log("HOOK方法的所有重载");
console.log("脚本加载成功");
Java.perform(function () {
// 定位类
let target = Java.use("com.secbug.hook.Utils");
// 获取所有重载方法
let overloadArr = target.func.overloads;
// 遍历重载函数数据
for (let i = 0; i < overloadArr.length; i ++) {
overloadArr[i].implementation = function() {
var params = "";
for (let j = 0; j < arguments.length; j ++) {
params += arguments[j] + " ";
}
console.log("函数重载HOOK成功,参数类型为:", params);
return this.func.apply(this, arguments);
}
}
}
console.log("对象参数的构造");
console.log("脚本加载成功");
Java.perform(function () {
// 定位两个类
let walletils = Java.use("com.secbug.hook.Walletils");
let money = Java.use("com.secbug.hook.Money");
// x 是一个传入的money对象
walletils.deposit.implementation = function(x) {
// 调用原有的money对象实例的函数
console.log("money.$init param: ", x.getInfo);
// 替换为新的构造的对象实例
return this.deposit(Money.$new("美元", 1000));
}
}
console.log("主动调用Java函数");
console.log("脚本加载成功");
Java.perform(function () {
// 定位类
let money = Java.use("com.secbug.hook.Money");
// 生成新的对象实例
let moneyobj = money.$new("美元", 1000);
// 调用新对象实例的方法
console.log(moneyobj.getInfo());
}
Java.choose() 方法获取已有的对象,它用来在内存中搜索想用的对象,拥有两个参数,第一个参数用来找到想使用的类,第二个参数是一个回调参数。包含onMatch和onComplete两个方法。后者在所有对象搜索完毕后调用,前者是每找到一次就调用一次。
console.log("主动调用Java函数");
console.log("脚本加载成功");
Java.perform(function () {
// 定位类
let money = Java.use("com.secbug.hook.Money");
Java.choose("com.secbug.hook.Money", {
// 内存中搜索所有Money对象
onMatch: function(obj) {
console.log(obj.getInfo());
},
// 搜索结束调用此函数
onComplete: function() {
console.log("内存中的Money对象搜索完毕!")
}
})
}
类静态字段的获取需要调用value属性
Java:
private static String flag
JavaScript:
console.log(object.flag.value)
object.flag.value = "newFlag"