Sunday, January 6, 2013

Android APK dosyası inceleme (reverse engineering)

Android'e bir şekilde bulaştıysanız AppBrain'i duymuşsunuzdur. Google'ın Android Market'ine alternatif olan ve size uygulama tavsiye edebilen bir site. AppBrain'in bir de istatistik hizmeti var. Bu istatistikler içinde benim en çok ilgimi çeken Developer tools istatistikleri. Örneğin ACRA kütüphnesini kullanan top 10 uygulamayı görebiliyorsunuz. AppBrain'in bu istatistikleri nasıl topladığını merak ediyorsanız okumaya devam edin.

Bu yazıda apk dosylarının, reverse engineering ile nasıl inceleneceğini adım adım anlatacağım.

1. Apk dosyasını indirme

Android projelerinin emulatörde ya da cihazda çalışabilmesi için projenin paketlenmesi ve imzalanması gerekiyor. Proje paketlendiğinde '.apk' uzantılı bir dosya oluşur. Apk dosyalarının oluşturulması ile ilgili detaylı bilgi almak isteyenler resmi android geliştirici sayfalarındaki Building and Running bölümüne bakabilir.

Apk dosyasını indirebilmek için apk downloader adında bir araç kullanacağız. Apk-downloader bir Chrome eklentisi. Android Market'te uygulamanın sayfasına girdiğinizde adres barında apk indirmek için bir düğme çıkartıyor. Apk-downloader, Google hesap bilgilerinize (şifreniz dahil) ve Google'a kayıtlı Android cihaz'ınızın Google Service Framework ID'sine ihtiyaç duyuyor. Google hesap bilgileriniz bizi hiç ilgilendirmiyor dese de işim bittikten sonra Google şifremi değiştirdim, size de aynısını tavsiye ediyorum. İncelemek istediğimiz uygulamayı Android Markette bulduktan sonra apk'yı indiriyoruz.

Instagram'ın popüler Android uygulamasının apk dosyasını aşağıdaki şekildeki gibi apk-downloader'ın apk indirme düğmesini kullanarak indirdim.

2. dex2jar

İkinci aracımız dex2jar. Dex2Jar sayesinde dex formatındaki dosyalari java class dosyalarına çevireceğiz ve java decompiler ile class dosyalarını java dosyalarına çevireceğiz. dex dosyasının açılımı "Dalvik executable". Android uygulamarını çalıştıran virtual machine (Dalvik), java class dosyalarını değil dex formatındaki dosyaları okuyabiliyor.

dex2jar ile apk dosyasını aşağıdaki gibi jar (java archive) dosyasına çeviriyoruz.

tututil:TEMP ilkinulas$ ~/Development/tools/dex2jar-0.0.9.12/d2j-dex2jar.sh com.instagram.android.apk
dex2jar com.instagram.android.apk -> com.instagram.android-dex2jar.jar

Oluşan jar dosyasını okumak incelemek için Java Decompiler kullanacağız.

Java decompiler'ın arayüzü ile bakarsak Instagram'ın Android uygulamasınin aşağıdaki kütüphaneleri kullandıgını görebiliriz: (Aşağıdaki resim java decompiler'in arayüzünü gösteriyor.)

3. apktool

apk dosyasının içinde sadece derlenmiş dex dosyaları bulunmuyor. Uygulamayı meydana getiren AndroidManifest.xml dosyasi, res, assets, lib dizinleri de apk dosyası içinde bulunmakta. Bu dosyalara erişmek için apktool aracını kullanacağız.

Aşağıdaki komut ile apk dosyasını INSTAGRAM dizinine açıyoruz.

tututil:TEMP ilkinulas$ apktool decode com.instagram.android.apk INSTAGRAM
I: Baksmaling...
I: Loading resource table...
I: Loaded.
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: /Users/ilkinulas/Library/apktool/framework/1.apk
I: Loaded.
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Done.
I: Copying assets and libs...
tututil:TEMP ilkinulas$ ls -ltr INSTAGRAM/
total 32
drwxr-xr-x   8 ilkinulas  staff   272 Jan  6 16:32 smali
-rw-r--r--   1 ilkinulas  staff  8248 Jan  6 16:32 AndroidManifest.xml
drwxr-xr-x  46 ilkinulas  staff  1564 Jan  6 16:32 res
drwxr-xr-x   4 ilkinulas  staff   136 Jan  6 16:32 lib
drwxr-xr-x   8 ilkinulas  staff   272 Jan  6 16:32 assets
-rw-r--r--   1 ilkinulas  staff   247 Jan  6 16:32 apktool.yml
tututil:TEMP ilkinulas$

apk-downloader, dex2jar, java decompiler ve apktool ile siz de seçtiğiniz bir uygulamayı decompile edip inceleyebilirsiniz. Happy hacking :)