dw1
dw1 Aku adalah lelaki, yang tak pernah lelah mencari wanita~

Cara Reverse Engineering APK

Flow

(Flow Dalvik Virtual Machine. Sumber: www.javatpoint.com)

Semua aplikasi Android yang terinstall adalah APK (Android Package). Format file paket ini digunakan oleh sistem operasi Android untuk distribusi dan pemasangan aplikasi smartphones, dan ini berisi semua sumber daya aplikasi, aset, sertifikat, dan sebagainya, termasuk source code aplikasi.

Catatan: jika pratinjau gambar kurang jelas, klik gambar untuk melihat dengan resolusi utuh.

Dalam postingan ini, saya gunakan aplikasi BCA mobile sebagai percobaan reverse engineering yang sudah terinstall di smartphone saya. Saya menggunakan tool Android Debug Bridge (adb), dengan perintah adb shell pm list packages kita dapat melihat semua aplikasi yang terinstall pada smartphone kita, lalu saya memindahkan file APK BCA mobile dari Android ke laptop dengan perintah adb pull [file].

ADB Pull

Setelah itu, mari kita ekstrak file APK tersebut dengan unzip [file].

unzip

File Dex?

Dex adalah Dalvik Executable, dan file tersebut adalah bentuk kompilasi dari Java Virtual Machine-compatible yang berisi seluruh kelas-kelas Java yang terdiri dari Dalvik bytecode. Dalvik bytecode dijalankan oleh Dalvik Virtual Machine, seperti Java Virtual Machine (JVM), tetapi dioptimalkan untuk perangkat keras dan kebutuhan smartphones. Dalvik Virtual Machine-lah yang bertanggung jawab untuk menjalankan program pada sistem operasi Android.

Kita dapat dengan mudah mengekstrak file Dex dari APK (bahkan dengan WinRAR, karena APK adalah format file paket yang terextend dari ZIP), tetapi instruksi bytecode tidak human readable. Dengan Baksmali (disassembler) kita dapat mengubah file Dex kita menjadi file Smali yang ditulis dalam sintaks seperti awal (masih tingkat rendah, tetapi dapat dibaca dengan pasti). Disini saya menggunakan dex2jar.

Karena secara default file Dex dari APK bernama classes.dex. Disassembler file Dex ke Smali dengan perintah d2j-dex2smali [file].

baksmali

Saya mulai mencari “sesuatu yang penting” secara rekursif dengan grep. Mengawali dengan grep adalah kebiasaan saya, ini berguna untuk mencari host dan/ titik endpoint, baris konfigurasi dan/ environment, secret key yang ditulis secara statis, dan lain-lain.

grep

Setelah memiliki file Smali, kita dapat mengkonversikannya kembali ke file Java, tetapi dengan hanya sebagian keberhasilan. Beberapa alasannya mungkin termasuk penggunaan obfuscator oleh developer (alat yang dimaksudkan untuk membuat proses reverse engineering menjadi lebih sulit). Namun, saya akan mencoba membongkar apa yang saya bisa karena itu sangat memudahkan proses memahami apa yang dilakukan aplikasi.

Disassembler file Dex ke Jar (Java) dengan perintah d2j-dex2jar [file].

dex2jar

Untuk melihat kelas-kelas dari file Jar tersebut saya menggunakan aplikasi standalone Java Decompiler GUI.

jd-gui

Berikut pratinjau dari Java Decompiler GUI.

jd-gui Preview

Kita juga dapat menyimpan source code kelas-kelas Java dari file Jar dengan jd-gui, File > Save All Sources (CTRL+Alt+S).

jd-gui save all sources

Saya coba mencari “sesuatu yang penting” lagi, tetapi di dalam sekumpulan kelas-kelas Java yang baru saja saya simpan dari jd-gui dan mengekstraknya.

grep java

Berikut hasil pemyimpanan kelas-kelas Java dari jd-gui yang baru saja saya ekstrak dan juga diimport ke Sublime Text.

jd-gui preview java classes

etc

Oke, sebelum terlalu jauh, saya hentikan sampai sini dulu pembahasan kali ini (karena takut “berlebihan”). Mungkin nanti saya akan menuliskan bagian ke-2 atau seterusnya, tentang bagaimana memodifikasi APK, atau bagaimana cara melacak aktivitas APK dari awal berjalannya aplikasi, dan lain sebagainya.

Perlu diingat, segala tindakan yang Anda implementasi dari tutorial ini bukan tanggung jawab dari penulis.

Tinggalkan komentar di bawah jika masih bimbang tentang apa yang sudah saya jabarkan.

Referensi

  • https://developer.android.com/studio/command-line/adb?hl=en
  • https://github.com/pxb1988/dex2jar
  • https://github.com/java-decompiler/jd-gui
  • https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html
  • https://en.wikipedia.org/wiki/Dalvik_(software)
  • https://source.android.com/devices/tech/dalvik/dalvik-bytecode
  • http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
  • https://github.com/JesusFreke/smali/wiki/Registers
  • https://github.com/JesusFreke/smali/wiki/TypesMethodsAndFields

comments powered by Disqus