Berburu Hidden Secret Key di APK: Keseruan Menyelesaikan Tantangan Android CrackMe App
Memahami cara melindungi dan menguji keamanan sistem merupakan dua hal penting dalam cybersecurity. Program CrackMe secara langsung memberikan kesempatan untuk mempelajari kedua aspek tersebut. Teknik reverse engineering berguna untuk mengidentifikasi potensi kerentanan yang dapat terjadi pada suatu aplikasi. Tidak hanya memberikan wawasan teknis untuk eksploitasi sistem, namun juga mengasah pemahaman tentang bagaimana melindungi sistem tersebut.
Pendahuluan
Pertumbuhan yang pesat dan terintegrasi pada berbagai ekosistem menjadikan Android sebagai sistem operasi mobile yang dominan. Popularitasnya sebagai sistem operasi, menjadikan Android sebagai target utama bagi berbagai macam ancaman siber, diantaranya akses tidak sah dan malware dari aplikasi yang diinstal ataupun file lainnya 1.
Android Application Package atau yang lebih dikenal sebagai Android Package Kit (APK) merupakan sebuah file arsip dengan format .apk, di dalamnya terdapat konten aplikasi Android yang dibutuhkan pada runtime, dan file tersebut dikenali perangkat berbasis Android untuk menginstall aplikasi 2. Reverse Engineering merupakan teknik yang dapat digunakan untuk menganalisis file APK. Teknik ini dapat membantu dalam Analisis Keamanan dan Deteksi Malware, Mendeteksi Penyalahgunaan Izin dan Privasi, Pengujian dan Perbaikan Aplikasi, Pembelajaran dan Pengembangan Proteksi, Interoperabilitas dan Pemeliharaan 3.
Crackme merupakan sebuah program sederhana yang dirancang khusus untuk menguji kompetensi sekaligus media pembelajaran melakukan reverse engineering bagi seorang programmer, praktisi maupun peneliti keamanan siber. Skema yang digunakan biasanya mengacu pada ekosistem nyata baik dari segi algoritma maupun sistem keamanan 4. Tantangan utama dalam Crackme adalah menemukan suatu data atau mem bypass sistem keamanan menggunakan teknik reverse engineering.
Android CrackMe App: Can You Find the Key? merupakan salah satu program Crackme aplikasi android yang dibuat oleh ITSEC. Tantangan terdiri dari tiga level kesulitan yang berbeda dengan goal yang dituju adalah menemukan kunci rahasia yang tersembunyi. Tulisan ini tidak hanya menyajikan jawaban yang komprehensif atas tantangan tersebut, tetapi juga menguraikan proses berpikir, pendekatan ilmiah, serta refleksi terhadap strategi pertahanan dan serangan dalam konteks pengujian keamanan aplikasi Android. Detail tantangan dapat dilihat pada halaman berikut 5.
Environment dan Tools Pengujian
Pesatnya pertumbuhan Android sebagai sistem operasi mobile sejalan dengan hadirnya berbagai alat bantu reverse engineering baik yang enterprise maupun open source. Berikut kombinasi tools dan environment yang digunakan dalam tulisan ini:
- JADX GUI – untuk melakukan analisis statis dengan cara dekompilasi APK ke dalam kode Java yang dapat dibaca manusia.
- Frida – untuk melakukan analisis dinamis dan instrumentasi runtime, termasuk bypass proteksi dan pengambilan data di waktu eksekusi.
- DogBolt (Online Decompiler Explorer) – sebagai alternatif untuk menganalisis bytecode, khususnya pada bagian transformasi logika sederhana.
- Memu Emulator (Android 9) – emulator Android yang digunakan untuk menjalankan aplikasi dengan kontrol penuh terhadap lingkungan dan integrasi ADB.
- Windows 10 – sistem operasi utama yang digunakan selama proses analisis.
Pembahasan
Identifikasi target merupakan langkah awal yang dapat dilakukan dalam menentukan scope dan batasan teknis dalam reverse engineering, hal ini bukan tahapan yang baku sehingga memungkinkan setiap orang memiliki teknik yang berbeda dalam identifikasi target. Aplikasi LibChecker pada perangkat android dapat digunakan untuk mengidentifikasi sebuah aplikasi, informasi yang didapat dari penggunaan LibChecker diantaranya: informasi paket, daftar native library, arsitektur dan ABI support, serta tech stack yang digunakan.

Gambar 1 menampilkan tangkapan layar aplikasi LibChecker yang menunjukan informasi aplikasi Crack Me dalam tiga level berbeda yang telah terinstall sebelumnya pada perangkat testing.
Level 1: A relatively simple introduction to reverse engineering Android applications.
Aplikasi pertama pada level 1 bernama Crack Me dengan summary informasi yang didapat sebagai berikut:
App Name | Crack Me |
Package Name | itsec.rndforge.crackme |
MD5 | 6e482795292c3f596aeb6ea1472c2e31 |
SHA1 | e95120c69dc4c37598ba5f89b9ebe15b694456ae |
SHA256 | 8f663b44282bac36699473858ce3e276e2783d4042d624084aca680d86683fda |
Native Lib | Null |

Berdasarkan informasi tersebut diketahui package name aplikasi Crack Me Level 1 adalah itsec.rndforge.crackme. Sederhananya, package name adalah identitas unik dari sebuah aplikasi mobile, yang mencakup berbagai class dan library, serta berperan penting dalam identifikasi, pengelolaan, dan keamanan aplikasi.

Halaman utama aplikasi Crack Me hanya menampilkan sebuah input dan button. Aplikasi akan memberikan respon berupa output “Too bad, try harder next time! 🙁” saat dilakukan verify string text secara random pada form input seperti pada Gif 1. JADX-GUI dipilih sebagai salah satu tools yang dapat mendekompilasi APK ke dalam bentuk yang dapat dipahami dan terstruktur. Halaman utama yang sederhana dengan tiga komponen utama input text, display text dan button sebagai trigger menjadi clue utama dalam tantangan ini. MainActivity.java menjadi file awal yang perlu ditelusuri, karena file tersebut merupakan entry point saat aplikasi dijalankan.

Baris ke-234 menampilkan penggunaan event setOnClickListener() yang digunakan untuk mendeteksi dan menangani interaksi klik pada komponen UI. Event tersebut akan membuat instance dari class ViewOnClickListenerC0000a dan nilai 3 akan menentukan proses berikutnya sebagai handler untuk button “Verify”. Terlihat bahwa class ViewOnClickListenerC0000a disimpan pada package G0. Selain mencarinya secara manual dengan mengakses package tersebut, melakukan dua kali klik pada class yang dituju akan mengarahkan langsung pada lokasi class tersebut di JADX-GUI.

Mengacu pada potongan kode berikut ((Button) c0021l.f451b).setOnClickListener(new ViewOnClickListenerC0000a(3, this));
terdapat switch case yang digunakan pada class ViewOnClickListenerC0000a dan nilai 3 pada kode tersebut sebagai inisiasi case 3. Baris ke-67 pada case 3 menunjukkan adanya sebuah string “am_i_too_easy_for_you_to_crack” yang diduga sebagai the hidden secret key seperti pada Gambar 4. Crack Me level 1 akan menampilkan output yang berbeda jika string tersebut diinput pada form input aplikasi seperti pada Gif 2

Level 2: Introduces more complex techniques.
Aplikasi kedua pada level 2 bernama Crack Me Lvl 2 dengan summary informasi yang didapat sebagai berikut:
App Name | Crack Me Lvl 2 |
Package Name | itsec.rndforge.crackme.level2 |
MD5 | b30a09da568434e06eb81d375194da5b |
SHA1 | 589b32be3b2b31b133eec566811c81f4ce140458 |
SHA256 | dc66862b1809389f77e699b1ef28d67552d9d10084159ffe3667ecb0c8ad595b |
Native Lib | 1 |

Berbeda dengan Crack Me Level 1 pada Crack Me Level 2 menggunakan 1 native library, respon text yang ditampilkan Crack Me Level 2 adalah “☹Try again”, posisi form input serta button berada di pojok atas bagian kiri layout seperti pada Gif 3. Namun, secara fungsi dasar keduanya memiliki konsep yang sama hanya teknik menemukan the hidden secret key yang akan berbeda.

MainActivity masih menjadi fokus awal untuk menentukan teknik berikutnya dalam menganalisis Crack Me Lvl 2. Baris ke-64 sampai ke-71 pada Gambar 6 mengindikasikan keterkaitan dengan the hidden secret key yang dicari. Hal tersebut dimulai dari inisialisasi C0765a sebagai wrapper SharedPreferences (proses penyimpanan data sederhana di Android dalam bentuk key-value) dengan “abcde”
sebagai key 6. Penggunaan NativeLib nativeLib = new NativeLib(); nativeLib.stringFromJNI();
merujuk pada sebuah Java class yang berfungsi sebagai jembatan untuk menjalankan fungsi-fungsi pada kode native yang dibuat dalam Bahasa C/C++. Sedangkan stringFromJNI() digunakan pada NativeLib untuk mengembalikan data dari kode native ke Java.

Penelusuran method nativeLib.stringFromJNI()
mengarah pada file NativeLib.java yang terletak pada package itsec.rndforge.crackme.nativelib. File tersebut mendefinisikan sebuah class Bernama NativeLib, System.loadLibrary("nativelib");
melakukan pencarian dan memuat file dengan format .so, berikutnya kata “native” menjelaskan bahwa fungsi akan dijalankan pada kode native menggunakan bahasa C/C++.

Library native terletak pada package yang berbeda dengan sumber kode utama, pada JADX-GUI file tersebut dapat ditemukan pada Resources > lib > (arsitektur cpu). Gambar 8 menunjukkan konten yang ditampilkan pada file libnativelib.so berupa nilai-nilai hex dump, sehingga dekompilasi pada file tersebut perlu dilakukan supaya bisa dibaca. Fokus hasil dekompilasi tertuju pada method stringFromJNI() dan didapatkan sebuah hardcoded “was_it_still_too_easy_for_you?”.

Penggunaan Frida menjadi teknik alternatif yang lebih sederhana untuk menjalankan method stringFromJNI() pada libnativelib.so untuk mengetahui data apa yang dikembalikan dari kode native ke Java. JADX-GUI menyediakan Frida snippet untuk mempermudah pengkodean pada objek yang dituju menggunakan Frida. Block method yang akan digunakan “stringFromJNI()” lalu klik kanan dan pilih “Copy as Frida snippet” seperti pada Gambar 9.

Simpan snippet tersebut pada text editor dengan format file .js dan tambahkan potongan kode berikut di awal snippet Java.perform(function () { dan di akhir snippet });. Sehingga kode lengkap dari file tersebut seperti berikut:
Java.perform(function () {
let NativeLib = Java.use("itsec.rndforge.crackme.nativelib.NativeLib");
NativeLib["stringFromJNI"].implementation = function () {
console.log(`NativeLib.stringFromJNI is called`);
let result = this["stringFromJNI"]();
console.log(`NativeLib.stringFromJNI result=${result}`);
return result;
};
});
Jalankan script tersebut menggunakan Frida dengan command frida -l lvl2.js -U -f itsec.rndforge.crackme.level2
, kemudian script tersebut akan menampilkan data apa yang dikembalikan oleh method stringFromJNI() dan didapatkan data “was_it_still_too_easy_for_you?”, terlihat pada Gambar 10.


Level 3: A challenging level requiring advanced reverse engineering skills.
Aplikasi ketiga pada level 3 bernama Crack Me Lvl 3 dengan summary informasi yang didapat sebagai berikut:
App Name | Crack Me Lvl 3 |
Package Name | itsec.rndforge.crackme.level3 |
MD5 | a787a04a3da848cd62cd6163fb00a156 |
SHA1 | 00f2526ac5686a0c43c221a898e0f774a6ebe7ff |
SHA256 | c0a34871552ec4631bb4fabfa2a6383168b076d3c95dbbb700b0c59115c9e07a |
Native Lib | 1 |

Crack Me Lvl 3 memiliki tampilan dan alur aplikasi yang sama dengan Crack Me Lvl 2, memiliki satu native library dan respon output yang sama “☹Try again” saat text yang di input bukan secret key.

Fokus pada MainActivity Crack Me Lvl 3 untuk mengidentifikasi bagaimana button menjadi trigger untuk memproses input melalui JADX-GUI. Baris ke-73 menjelaskan adanya pembuatan instance baru dari class NativeLib dan disimpan dalam variabel f5913z dan baris ke-81 terdapat method secretKey() yang dijalankan dari native library seperti pada Gambar 12. Berdasarkan informasi ini Crack Me Lvl 3 memiliki kemiripan dengan Crack Me Lvl 2 dalam alur kasusnya, sehingga libnativelib.so menjadi kunci di mana letak the hidden secret key berada.

Dogbolt kembali menjadi pilihan untuk dekompilasi file libnativelib.so dan fokus untuk menemukan alur method secretKey() dan apa yang diproses dari method tersebut. Gambar 13 pada baris ke-2297 terdapat method secretKey dan baris berikutnya 2310 terdapat sebuah string “aGVoZWhlX3llc190aGlzX2lzX2l0” yang diidentifikasi sebagai base64 encode. Base64 hanya menggunakan karakter “A–Z, a–z, 0–9, +, / (atau - dan _ dalam URL-safe base64)” dan panjang string 28 karakter sesuai dengan base64 ukuran blok 4 (28 mod 4 = 0) 7.

Banyak tools yang dapat digunakan untuk mendecode base64 salah satunya menggunakan command windows dengan perintah powershell -Command "[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String('stringBase64'))"
, setelah perintah tersebut dijalankan maka didapatkan string “hehehe_yes_this_is_it” seperti pada Gambar 14.

Hooking secretKey() menggunakan Frida dapat digunakan sebagai alternatif untuk mengetahui proses yang dilakukan method secretKey() sama seperti Crack Me Lvl 2, script frida yang digunakan sedikit berbeda karena method yang dijalankan tidak sama, namun perintah yang digunakan untuk menjalankan script Frida tersebut masih sama.

Gambar 15 merupakan hasil tangkapan layar dari output script Frida yang telah dijalankan dengan mengembalikan data string “YUdWb1pXaGxYM2xsYzE5MGFHbHpYMmx6WDJsMA==” yang terlihat sebagai bentuk base64 encode. Gambar 13 pada baris 2312 terlihat ada fungsi base64_encode(v5, v7);
yang artinya v7 merupakan input string dari v1 dan isi dari v1 adalah “aGVoZWhlX3llc190aGlzX2lzX2l0”, sehingga ada dua kali proses encoding base64 untuk menyembunyikan the hidden secret key ini seperti Gambar 16.


Penutup
Tantangan Crack Me ini menjadi salah satu media pembelajaran yang efektif untuk mengukur sejauh mana pemahaman dan praktiknya suatu sistem bekerja. Tingkat kesulitan yang berbeda memberikan wawasan bahwa tidak semua alur yang terlihat memiliki proses yang sama. Penggunaan tools open-source seperti JADX-GUI, Frida dan dogbolt terbukti bisa diandalkan untuk membongkar sistem proteksi meskipun aplikasinya sudah di obfuscate atau dilindungi.
Berikut flag yang didapatkan sepanjang tantangan Crack Me ini:
- Crack Me Level 1: am_i_too_easy_for_you_to_crack
- Crack Me Level 2: was_it_still_too_easy_for_you?
- Crack Me Level 3: hehehe_yes_this_is_it