Post

[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.

Aplikasi Challenge 0x7 Aplikasi Challenge 0x7

Hanya terdapat teks “Hello World!” . Mari kita dekompilasi menggunakan JADX.

Class MainActivity Class MainActivity

Setelah diamati, polanya mirip dengan tantangan kita sebelumnya, tetapi kali ini nama metodenya adalah flag.

Mari kita lihat class Checker.

Class Checker 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() {}
    });
});

Mendapatkan Flag Mendapatkan Flag

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 Mendapatkan Flag Melalui Hook Constructor

Dan kita berhasil mendapakan flag-nya. Jadi, ini lah cara kita meng-hook dan memanipulasi constructor menggunakan Frida.

This post is licensed under CC BY 4.0 by the author.