Frida 0x7

微信截图_20250710153252

微信截图_20250710153302

根据如上代码,这一题有两个思路

第一个是hook Checker类的构造方法,

让num1>512并且num2>512即可输出flag

第二个思路是利用Checker类的构造方法再构造一个新的Checker类,传的num1和num2都要大于512

再把这个类传给flag方法,即可输出flag

代码如下

这里需要注意的是,方法1需要通过frida中的-f来启动,用-F来启动无法实现,因为程序在启动时就已经执行了flag(ch);所以即使hook了构造方法ch也已经通过hook之前的构造方法生成了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function hookTest7_1(){
var utils = Java.use("com.ad2001.frida0x7.Checker");
//修改类的构造函数的实现,$init表示构造函数
utils.$init.overload('int','int').implementation = function(num1,num2){
console.log(num1,num2);
num1 = 1111;
num2 = 1111;
this.$init(num1,num2);
}
}


function main(){
Java.perform(function(){
hookTest7_1();
});
}
setImmediate(main);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function hookTest7_2(){
Java.performNow(function(){
//非静态字段的修改
//使用`Java.choose()`枚举类的所有实例
Java.choose("com.ad2001.frida0x7.MainActivity", {
onMatch: function(obj){
//修改实例的非静态字段"_privateInt"的值为"123456",并修改非静态字段"privateInt"的值为9999。
//obj._privateInt.value = "123456"; //字段名与函数名相同 前面加个下划线
var utils = Java.use("com.ad2001.frida0x7.Checker");
var wey= utils.$new(600,600);
obj.flag(wey);
},
onComplete: function(){

}
});
});

}
function main(){
Java.perform(function(){
hookTest7_2();
});
}
setImmediate(main);

方法2也同样有需要注意之处,方法2需要用-F才能够实现,因使用-f时,Frida会在应用启动初期就注入脚本此时MainActivity类可能尚未完全初始化,所以flag方法可能还未实现,所以无法输出flag,而-F的时候和,程序已经初始化完毕,flag方法也已经实现,故可以输出flag

微信截图_20250710154821