Reverse Engineering APK Android

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 seperti JADX 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 menjadi true 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.

Copyright © 2009-2010 Yohanes Nugroho