0%

前言

学习一下Frida,跟着frida-labs学

frida-labs:https://github.com/DERE-ad2001/Frida-Labs

frida0x1 (Java层)

打开app看到这样一个页面,看上去是 输入数字,正确的话给flag

image-20250420183249013

打开jadx看看反编译

image-20250420190532668

监听了button的点击,如果点击了会获取输入(obj)判断是不是只包含数字字符,如果是就将obj从string类型转为整数类型,进入check方法与i比较

check方法检验输入的i2是否符合检验标准:i2=2i+4 ,符合的话就会执行解密将flag输出在页面上(textView)

image-20250420191540747

但i是get_random随机获取的,若要获得flag就要使得i2=2i+4,才能继续往下执行解密

image-20250420191757557

image-20250420191958059

方法1:hook get_random方法

可以hook get_random方法,返回它获取的数字,再将符合检查标准的i2值计算并输出,届时在界面手动输入即可获得flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Java.perform(function() {

var hook = Java.use("com.ad2001.frida0x1.MainActivity");
hook.get_random.implementation = function(){

console.log("成功hook");
var i = this.get_random();
console.log("返回值是 " + i)
console.log("输入 " + (i * 2 + 4 ))
return i;

}

})

image-20250420195013304

image-20250420195031063

或者稍微改动一下,将返回值设置成便于计算的数字,再将输入值计算并输出,一样是手动在界面输入获得flag(其实没两样)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Java.perform(function() {

var a= Java.use("com.ad2001.frida0x1.MainActivity");
a.get_random.implementation = function(){

console.log("返回值永为 6")
var i2 =2*6+4;
console.log("输入值为"+i2);

return 6;

}

})

image-20250420195000475

image-20250420194824568

方法2:hook check方法

check接受两个参数,hook check方法,更改传入的参数,使传入的两个数字恒符合判断标准

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Java.perform(function() {

console.log("hook成功!任意输入数字即可解锁")
var aaa=Java.use("com.ad2001.frida0x1.MainActivity");
aaa.check.overload('int','int').implementation=function(a,b){
console.log("i值为"+a); //看一下随机数i是多少
var new_b=2*a+4
console.log("传入的i2值为"+new_b); //看一下实际传入的是多少(这时候我们在应用程序界面输入的数字不起作用)



return this.check(a,new_b);//这里的a和new_b可以换成符合标准的两个数字,如:(1,6)
}
})

image-20250420201105713