Reverse engineering (RE) adalah proses membongkar sesuatu agar kita bisa
mengetahui cara kerjanya. Dalam konteks ini, saya akan membahas
membongkar software, tepatnya lagi aplikasi untuk Android.
Reverse engineering bisa dilakukan di komputer ataupun langsung di
ponsel. Saya menyarankan untuk melakukan di komputer langsung, karena
tool yang tersedia lebih baik, dan prosesnya bisa lebih cepat. Saya
punya beberapa aplikasi reversing di ponsel, tapi tujuannya hanya untuk
melakukan pemeriksaan singkat.
Untuk memahami kumpulan tulisan ini, saya sangat menyarankan Anda untuk mencoba membuat satu aplikasi Android, minimal hello world dan menjalankannya di device Anda. Tujuan membuat dan menjalankan hello world dalam kasus ini adalah:
- Agar Anda mendownload tools-tools dasar yang dibutuhkan (
adb
,aapt
,dx
yang ada di Android SDK) - Agar Anda mengenal dasar aplikasi Android
- Agar Anda menginstall driver yang dibutuhkan untuk ponsel Anda
- Agar Anda mengaktifkan developer mode di ponsel Anda
Catatan: Saya tidak akan menjelaskan langkah demi langkah cara instalasi
setiap program yang ada di sini (misalnya: ZAP, dex2jar, apktool, dsb),
silakan Anda cek tiap link yang saya berikan untuk mengetahui cara
installasinya. Saya juga tidak akan menjelaskan semua opsi, hanya
penggunaan dasarnya saja.
Tujuan Reverse Engineering
Ada banyak tujuan reverse engineering:
- Untuk mengetahui protokol sebuah program (contoh: ingin membuat client instagram command line)
- Untuk mengetahui API yang dipakai sebuah program (contoh: ingin tahu bagaimana menyalakan kamera flash sebagai senter)
- Untuk mencari bug security sebuah program
- Untuk mencari tahu apakah sebuah program melanggar hak cipta (contoh: kita curiga sebuah program memakai library komersial yang kita buat, tanpa membayar lisensi)
- Untuk tujuan forensik (contoh: kita ingin tahu format data yang dipakai oleh sebuah program)
Fokus tulisan di situs ini adalah reverse engineering untuk mencari bug security.
Kadang para pentester hanya melakukan testing dasar untuk mencari bug
security tanpa membongkar APKnya, biasanya testing yang dilakukan hanya:
- Intercept HTTP/HTTPS dengan Fiddler, Burp Suite atau ZAP
- Melihat log adb
Testing ini hanya mengcover sebagian kecil bug aplikasi. Contoh di mana testing seperti ini bisa gagal:
- Aplikasi melakukan certificate pinning, sehingga kita tidak bisa menggunakan root certificate kita sendiri
- Aplikasi memakai protokol binary yang tidak standar (misalnya memakai socket SSL dengan data dalam format binary)
- Aplikasi melakukan signing terhadap URL atau data (dalam kasus ini hanya bisa melihat data, tapi tidak bisa testing mengubah-ubah data/fuzzing)
Jika ingin langsung melakukan pemeriksaan dinamis tanpa membongkar APK,
langkahnya cukup mudah. Untuk membaca log, pertama aktifkan developer mode di ponsel Anda, lalu lihat output yang mungkin dihasilkan app dengan
adb logcat
di
PC Anda (Anda mungkin perlu menginstall driver jika menggunakan
Windows, atau perlu mengedit file tertentu di Linux). Kadang ada
informasi penting, kadang tidak ada. Beberapa ponsel mengijinkan adb backup
,
yang memungkinkan kita mengekstrak data privat aplikasi ke PC. Di sini
Anda bisa melihat apakah ada data penting yang disimpan oleh aplikasi.
Alternatif lain adalah menggunakan ponsel yang sudah di root untuk mengakses data yang ada di aplikasi.
Anda juga bisa menginstall tool security proxy di PC Anda seperti ZAP (opensource, gratis) atau yang lain, misalnya Burp Suite (komersial, ada versi gratisnya), Fiddler (closed source, gratis). Setelah itu Anda bisa mengkonfigurasi Android untuk menggunakan proxy tersebut. Dengan ini Anda bisa melihat traffic aplikasi (tapi terbatas)
Mengenal file APK
Sebelumnya melakukan reverse engineering, sebaiknya Anda perlu
tahu dulu proses pembuatan aplikasi Android dari file java plus resource
menjadi APK. Penyusun aplikasi Android standar adalah: file source code
dalam bahasa java, file resource (bisa gambar, suara, string, dsb),
file asset, dan file manifest yang mendeskripsikan aplikasi apk.
Sebagian besar aplikasi Android juga menggunakan native library dalam bahasa mesin, dan sebagian aplikasi (terutama game) hanya terdiri dari native code saja, tanpa file
.java
. Saya tidak akan membahas mengenai reverse engineering native code, karena rumit dan sebenarnya itu tidak spesifik Android.
File source code
.java
akan dicompile menjadi .class
, dan kemudian dikonversi menjadi file .dex
. File dex
ini memakai bytecode khusus (bukan bytecode standar java). Kita bisa menggunakan tool baksmali
untuk mendisassemble file dex
.
File resource dikompilasi menjadi
resources.rsrc
.
File resource Android dibagi dalam berbagai folder (sesuai bahasa,
ukuran layar) dan secara otomatis Android menggunakan file yang sesuai
dengan bahasa, ukuran layar, dsb. File asset akan disimpan apa adanya.
File manifest berisi informasi mengenai pake APK: apa nama packagenya, permission apa yang dibutuhkan, dsb.
File APK sebenarnya adalah sebuah file ZIP (bisa dibuka dengan
unzip
atau 7-zip). Semua file .dex
, android.arsrc
, AndroidManifest.xml
,
dan asset akan disimpan dalam file APK, dan terakhir file APK
ditandatangai secara digital (dalam file zip ini berada dalam folder META-INF
).Membongkar APK
Langkah pertama reversing adalah mendapatkan file APK.
Untuk tujuan pentesting, biasanya APK sudah diberikan, jadi tidak perlu
repot mencari dan mengekstrak file dari play store. Setelah mendapatkan
APK, kita bisa menginstall dan menjalankan APK tersebut. Tentunya ini
jika kita tahu bahwa APK tersebut aman (contohnya jika ingin reversing
Instagram, kita yakin itu aman). Jika ingin reverse engineering malware,
gunakan emulator atau HP baru yang bersih dari data penting (dan jangan
isi SIM card utama Anda).
Berikutnya kita bisa mengubah APK menjadi jar, atau kita bisa mengekstrak APK menjadi file
smali
. File jar yang kita dapat bisa didecompile menggunakan
berbagai decompiler Java. Hasil decompiler adalah source code yang
cukup mirip aslinya. Nama variabel lokal akan hilang, dan semua komentar
yang ada di source code asli juga tidak ada. Ada juga tool sepertiJADX yang bisa langsung melakukan dekompilasi dari file APK/DEX.
Perlu dicatat bahwa bagian tersulit adalah: membaca source code. Kadang source code sudah di obfuscate sehingga
nama-namanya menjadi tidak jelas. Andaikan namanya jelas pun, tidak
selalu mudah membaca source code. Coba saja Anda cari beberapa source code aplikasi Android di github,
dan coba pahami isinya. Membaca source code yang lengkap dengan
dokumentasi dan komentar saja cukup sulit, membaca source code hasil
dekompilasi lebih sulit lagi.
Kadang pembacaan file secara statik cukup sulit. Jika kita punya source
code sebuah aplikasi, kita bisa menggunakan debugger, atau menambahkan
instruksi logging (misalnya dengan
Log.d
). Mendebug APK tanpa source code agak rumit, menurut saya lebih mudah mengedit dan mengcompile ulang file smali. File smali bisa diedit dan diassemble lagi untuk membuat APK baru. Modifikasi yang biasa dilakukan:- aktivasi logging (beberapa aplikasi bisa diaktifkan loggingnya dengan mengubah variabel tertentu dari
false
menjaditrue
atau sebaliknya) - menambahkan logging
- melakukan bypass pemeriksaan
rooting
(beberapa aplikasi tidak jalan jika HP kita di-root) - melakukan bypass SSL pinning
Alternatif lain, kita juga bisa menggunakan XPosed Framework untuk
melakukan intersepsi API tanpa mengubah APK. Kita juga bisa menggunakan
frida untuk melakukan tracing native code. Awalnya saya suka melakukan
dua pendekatan ini, tapi karena sering pindah HP, dan perlu menginstall
kedua aplikasi tersebut (yang kadang bermasalah di HP tertentu),
akhirnya saya lebih suka mengubah APK langsung.
APK Non standar
Seperti yang telah dibahas sekilas di atas, ada beberapa APK yang tidak
dibuat dengan menggunakan Java. Beberapa contoh APK tidak standar:
- APK yang dihasilkan oleh Apache Cordova. Walaupun kode dasarnya menggunakan Java, tapi kode utama ada di file JS/HTML.
- APK yang dihasilkan oleh Adobe Air.
- APK yang dihasilkan oleh mono android.
- APK yang dihasilkan oleh Rhomobile, kode utamanya menggunakan Ruby yang telah dicompile menjadi bytecode.
APK yang tidak standar butuh penanganan khusus. Untuk saat ini, APK seperti itu di luar scope tulisan ini.
ABOUTME
Hi all. This is deepak from Bthemez. We're providing content for Bold site and we’ve been in internet, social media and affiliate for too long time and its my profession. We are web designer & developer living India! What can I say, we are the best..
Blogger Comment
Facebook Comment