0%

FridaLab--记frida初学

今天在twitter上发现一个学习frida用的example,下载下来做了做,当作学习frida的第一次了。

前言

整个example主要分为8个challenge,程序初始界面如图

eDYDN8.png

大概的guideline在程序的界面已经给出,不再赘述,程序未加壳未混淆,直接拿出来逆就可以了,jeb打开后,发现程序大概逻辑就是满足条件后对应行变色,已完成的变绿色,未完成的变红色。具体逆向不再写,本篇文章主要用于入门frida。

Challenge 1

第一个challenge比较简单,主要更改Challenge01类中的静态变量值为1即可。

1
2
3
var challenge_01 = Java.use("uk.rossmarks.fridalab.challenge_01");
challenge_01.chall01.value = 1; <----
console.log("Solve Challenge 1");

Challenge 2

第二个challenge,要求运行MainActivity中的函数chall02();我的想法是在MainActivity类中任意overload一个执行的函数,然后在其中调用chall02()函数,这里选择了Challenge 3中的函数,具体代码如下:

1
2
3
4
5
6
var MainActivity = Java.use("uk.rossmarks.fridalab.MainActivity");
MainActivity.chall03.overload().implementation = function(){
console.log("Solve Challenge 2");
this.chall02();
....
}

Challenge 3

challenge 3要求让函数返回true,方法如challenge2,overload函数chall03,更改其返回值为true,代码如下:

1
2
3
4
5
6
var MainActivity = Java.use("uk.rossmarks.fridalab.MainActivity");
MainActivity.chall03.overload().implementation = function(){
....
console.log("Solve Challenge 3");
return true;
}

Challenge 4

challenge4则要求改变函数参数为“frida”,同样很简单,在overload一个执行的函数中调用chall04函数,并传递参数“frida”,具体代码如下:

1
2
3
4
5
6
var MainActivity = Java.use("uk.rossmarks.fridalab.MainActivity");
MainActivity.chall03.overload().implementation = function(){
console.log("Solve Challenge 4");
this.chall04("frida");
...
}

Challenge 5

cahllenge 5 进一步要求chall05函数的参数总是为“frida”,则需重写chall05函数,并在其中调用函数chall05,代码如下:

1
2
3
4
MainActivity.chall05.overload("java.lang.String").implementation = function(){
console.log("Solve Challenge 5");
this.chall05("frida");
}

Challenge 6

Challenge 6 要求延时hook,通过setTimeOut函数来实现,而后在challenge_06类的成员函数startTime()执行后overload函数addChall06,并在其中调用MainActivity类中的chall06函数进行confirm。具体代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
setTimeout(function(){
Java.perform(function(){
var challenge_06 = Java.use("uk.rossmarks.fridalab.challenge_06");
challenge_06.addChall06.overload("int").implementation = function(){
console.log("Solve Challenge6");
Java.choose("uk.rossmarks.fridalab.MainActivity", {
onMatch: function(instance) {
instance.chall06(challenge_06.chall06.value);
},
onComplete: function() {} });

}
});
},10000);

Challenge 7

challenge 7 说也奇怪,由于成员变量chall07是一个静态的变量,因此在调用MainAcitivity类中函数chall07时其实可以指定参数,并且保证正确,并没有如作者所说的爆破,不知道是不是我想错了。我的代码如下

1
2
3
4
5
6
7
8
9
MainActivity.chall05.overload("java.lang.String").implementation = function(){

//Solve Challenge7
var challenge_07 = Java.use("uk.rossmarks.fridalab.challenge_07");
//console.log("Target pin " + challenge_07.chall07.value);
this.chall07(challenge_07.chall07.value);
console.log("Solve Challenge 7");
...
}

Challenge 8

最后一个challenge涉及UI控件的属性值的更改,具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
MainActivity.chall05.overload("java.lang.String").implementation = function(){
...
// 找到Button按钮的类
var button = Java.use("android.widget.Button");
// 调用方法findViewById,查找到button对应资源id
var checkId = this.findViewById(0x7F07002F);
// 将找到的checkId指向button,相当于Android中的
// Button button = (Button)findViewById(0x7F07002F);
var check = Java.cast(checkId.$handle,button);
var string = Java.use("java.lang.String");
// 由于button类中的setText函数参数必须为String,此处调用String类new 一个str出来。
check.setText(string.$new("Confirm"));
console.log("Solve Challenge 8");
}

后续

感谢@rossmarks提供的frida学习的example,最终界面如下:

eDYwHP.png