Membaca Source Code

Bagian tersulit dalam reverse engineering adalah membaca source code. Diberikan source code sebuah aplikasi lengkap, tidak banyak orang yang bisa memahami aplikasi tersebut. Contoh mudahnya: berapa banyak yang memahami source code Linux atau Apache, atau implementasi interpreter PHP/Python? Padahal ada banyak dokumentasi dan buku yang tersedia untuk berbagai software tersebut.

Bug umum

Untungnya, dalam sebagian besar kasus, kita bisa menemukan berbagai bug yang umum dengan mencari pola tertentu, tanpa perlu memahami keseluruhan aplikasi. Selain itu, kebanyakan aplikasi tidak terlalu rumit dan kebanyakan memiliki fungsi dasar yang sama.

Pertama kita perlu mengenal bug-bug umum sebuah aplikasi, supaya tahu apa yang kita cari di berbagai file yang kita temukan.

  • Melakukan logging yang terlalu banyak. Contoh: kadang nomor kartu kredit atau password muncul di log adb.
  • Menyimpan password atau informasi penting lain di penyimpanan dan tanpa dienkrip
  • Menggunakan SSLSocketFactory, seharusnya SSLCertificateSocketFactory.
  • Memanggil API tanpa session
  • Ada API tersembunyi, yang tercantum di source code walau tidak pernah dipanggil
  • Ada API lama yang ternyata masih berfungsi dan ada bugnya
  • Memakai enkripsi dengan key yang di-hardcode

Perlu dicatat, bahwa bug tertentu bisa fatal di jenis aplikasi tertentu, tapi tidak terlalu bahaya di jenis aplikasi lain. Contoh: untuk aplikasi banking, perlu ada timeout dan auto logout. Untuk aplikasi game, timeout tidak diperlukan, bahkan akan mengganggu.

Memahami lifecycle Aplikasi Android

Ketika melakukan RE apapun, pertama kita perlu memahami entry point sebuah program. Sebuah program dalam bahasa C selalu di mulai dari main, sebuah program PHP akan dimulai dari titik di luar fungsi. Dalam Android, yang menjadi titik awal adalah Activity. Sebuah Activity bisa memanggil activity lain dengan Intent. Hal dasar ini akan membantu Anda memahami bagaimana data berpindah dari satu activty ke activity lain. Anda bisa membaca lebih lanjut mengenai Activity di situs developer Android.

Ketika membaca source code, pastikan Anda melihat bagian utama aplikasi, misalnya jangan menghabiskan waktu melihat package android.support (ini library standar) atau melihat org.apache (berbagai library dari apache). Jika Anda pernah membuat aplikasi Android, Anda akan bisa cepat memfilter mana bagian penting dan tidak. Titik awal aplikasi bisa dilihat di file AndroidManifest.xml (ini bisa diekstrak menggunakan Apktool). Baris pertama XML berisi nama package:

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.xxx">

Biasanya kita hanya perlu melihat direktori com.xxx. Lihat juga berbagai activity dalam file XML tersebut, action seperti ini adalah entypoint utama (Activity pertama yang akan dijalankan):

     <activity android:configChanges="locale|fontScale|keyboardHidden|mcc|mnc|orientation" android:name=".splash.Splash" android:screenOrie    ntation="portrait" android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" android:windowSoftInputMode="adjustPan|stateHidden">
         <intent-filter>
             <action android:name="android.intent.action.MAIN"/>
             <category android:name="android.intent.category.LAUNCHER"/>
         </intent-filter>
     </activity>

Setelah itu lihat berbagai activity lain. Biasanya nama activity tidak diobfuscate, jadi cukup mudah mencari activity untuk Login, Forgot Password, dsb.

Navigasi source code

Anda bisa mencoba meload source code dalam IDE dan IDE bisa membantu Anda bernavigasi dari satu kelas ke kelas lain. Cara lain (yang biasa saya lakukan) adalah menggunakan teks editor biasa, dan menggunakan skrip command line seperti find dan grep.

Untuk hal-hal yang berhubungan dengan jaringan, biasanya kita cari saja source yang mengandung string "Socket" atau "HTTP". Dari titik fungsi tersebut, kita bisa mundur untuk mencari method mana yang memanggil Socket/HTTP.

Jika ternyata aplikasi mengirimkan data yang dienkripsi secara custom, kita bisa mencoba mengedit file smali agar melog informasinya (yang akan bisa dibaca dengan adb log).

Copyright © 2009-2018 Yohanes Nugroho