[Frida Labs] 07 - Hooking the Constructor
Dalam kesempatan ini, kita akan mempelajari cara meng-hook constructor menggunakan Frida.
Sebagai studi kasus, kita akan menerapkannya pada aplikasi Challenge 0x7.apk, yang bisa diunduh dari sini.
0x1 - Prerequisites
- Dasar reverse engineering menggunakan JADX.
- Kemampuan untuk memahami kode Java.
- Kemampuan untuk menulis kode Javascript.
- Familiar dengan ADB.
- Perangkat Android yang sudah di-root.
0x2 - Challenge 0x7
Tantangan ini mirip dengan challenge 0x5, tetapi memiliki sedikit perbedaan. Di sini, kita akan mempelajari bagaimana cara meng-hook constructor.
Mari kita instal aplikasinya.
Hanya terdapat teks “Hello World!” . Mari kita dekompilasi menggunakan JADX
.
Setelah diamati, polanya mirip dengan tantangan kita sebelumnya, tetapi kali ini nama metodenya adalah flag
.
Mari kita lihat class Checker
.
Terdapat sebuah constructor yang mengambil dua nilai integer. Nilai ini dimasukkan ke dalam variabel lokal num1
dan num2
. Untuk mendapatkan flag, nilai num1
dan num2
harus lebih tinggi dari 512.
1
2
3
4
5
6
7
8
9
public void flag(Checker A) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
if (A.num1 > 512 && 512 < A.num2) {
.........
.........
.........
}
}
Salah satu cara untuk menyelesaikan tantangan ini adalah dengan membuat instance untuk class Checker
dan mengubah nilai variabelnya. Setelah itu, kita bisa gunakan instance dari MainActivity
untuk memangil fungsi flag
.
Karena yang kita hadapi adalah constructor, pada saat menggunakan operator $new
, kita perlu memasukkan argumen di brackets untuk constructor-nya.
1
var checker_obj = checker.$new(600,600); //Class object
Jadi, kita bisa dengan mudah menyelesaikan tantangan ini dengan script berikut:
1
2
3
4
5
6
7
8
9
10
11
12
Java.performNow(function(){
Java.choose('com.ad2001.frida0x7.MainActivity', {
onMatch: function(instance) {
console.log("Instance found");
var checker = Java.use("com.ad2001.frida0x7.Checker");
var checker_obj = checker.$new(600,600); //Class object
instance.flag(checker_obj)
},
onComplete: function() {}
});
});
Kita berhasil dengan mudah mendapatkan flag, tetapi mari kita coba menggunakan cara hooking constructor.
0x3 - Hooking the constructor
Sangat mudah untuk meng-hook constructor. Ini hampir mirip dengan meng-hook sebuah metode. Berikut adalah template script-nya:
1
2
3
4
5
6
7
8
9
10
11
12
Java.perform(function (){
var <class_reference> = Java.use("<package_name>.<class>");
<class_reference>.$init.implementation = function(<args>){
/*
*/
}
})
Seperti yang kita lihat, untuk meng-hook constructor kita menggunakan kata kunci $init
.
Mari kita coba untuk meng-hook constructor Checker
.
1
2
3
4
5
6
7
8
9
10
11
12
Java.perform(function (){
var a = Java.use("com.ad2001.frida0x7.Checker");
a.$init.implementation = function(<args>){
/*
*/
}
})
Sekarang, kita panggil constructor asli dengan nilai argumen yang lebih tinggi dari 512, sehingga tersimpan di num1
dan num2
.
1
2
3
4
5
6
7
8
9
10
Java.perform(function (){
var a = Java.use("com.ad2001.frida0x7.Checker");
a.$init.implementation = function(param){
this.$init(600,600);
}
})
Mari kita jalankan script ini. Seperti yang kita ketahui, constructor akan dipanggil ketika sebuah instance dibuat. Di aplikasi ini, instance dari class Checker
sudah dibuat di metode onCreate
. Oleh karena itu, kita harus memuat script ini ketika runtime menggunakan opsi -l
.
1
➜ frida -U -f com.ad2001.frida0x7 -l script.js
Mendapatkan Flag Melalui Hook Constructor
Dan kita berhasil mendapakan flag-nya. Jadi, ini lah cara kita meng-hook dan memanipulasi constructor menggunakan Frida.