JAVA

$init 构造方法
$new 创建对象
$dispose() 手动销毁对象

Frida框架JAVA层应用

基本方法HOOK

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;
	}
}

HOOK方法的所有重载

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对象搜索完毕!")
		}
	})
}

Frida HOOK类

类静态字段的获取需要调用value属性

Java:
private static String flag
JavaScript:
console.log(object.flag.value)
object.flag.value = "newFlag"