Frida 0x7


根据如上代码,这一题有两个思路
第一个是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
