Murat ERDEM - Personal Research Blog




Introduction To Smali

August 23, 2020

Önceki yazımızda android işletim sisteminin çalışma prensibinden bahsetmiştik. Bu yazımızda ise bahsettiğimiz Dalvik sanal makinesinin içerisinde çalışan kodlara yakından bakacağız.

Smali Nedir?

Smali, apk’ların kaynak koduna yakın bir şekilde decompile edilmiş halidir. Tam olarak java kodları değildir apk’lar için her ne kadar decompile eden tool’lar geliştirilmiş olsa da bu araçlar tam anlamıyla java kaynak kodlarına dönüştüremeyebilirler bu nedenle bazı önemli noktaları apk dosyalarını analiz sırasında gözden kaçırabiliriz. Ancak smali kodları yürütülebilir makine kodları ile java kaynak kodları arasında bir yerde bulunmaktadır bu nedenle okunması java diline göre biraz zor olsa da makine dilini daha düzgün bir şekilde yorumlayarak çıktı verebilmektedir. Ayrıca obfuscate edilmiş apkları da yorumlayabilmektedir.

Smali kodlarını elde etmek

Bir uygulamanın smali kaynak kodlarını elde etmek için apktool aracını kullanabiliriz. Aşağıdaki komut ile hızlı bir şekilde smali kodlarını bizim için çıkartacaktır.

       
    
        apktool d test.apk
    

Smalide Veri Tipleri

Smali kodlarında veri tipleri alışılmışın dışında tek harf ile gösterirler bunlar aşağıda listelenmiştir.

  • V => Void
  • Z => Boolean
  • B => Byte
  • S => Short
  • C => Char
  • I => Int
  • J => Long
  • F => Fload
  • D => Double (64 bit)

Local Değişkenler Ve Parametreler

Bir smali koduna bakıldığında fonksiyonlar içerisinde kullanılan parametre ve local değişkenler görülebilir. Öncelikle parametrelerin kullanımını açıklayacak olursak parametreler “pX” ile temsil edilirler ve gönderilen her parametre arasında “;” işareti ile ayrılır p0 parametresi sınıfın referansı olan “this” ile eşleştirilmiştir bu nedenle fonksiyona verilen her parametre p1 ile başlayarak parametre sayısına göre eşleştirilirler.

Local değişkeni fonksion başında “.local x” şeklinde tanımlanır bu nedenle bir fonksiyonda kaç adat local değişken kullanıldığı burada belirtilir. Ayrıca local değişkenler “vX” ile gösterilirler her oluşturulan local değişken v1,v2 gibi değerler ile eşleştirilir. Bazen “.local X” tanımlaması yerine “.registers X” tanımlaması yapılabilir bu tanımlamada x değeri this referansı dâhil olmak üzre verilen parametre sayısı ile fonksiyon içerisinde kullanılan local değişken sayılarının toplamını temsil etmektedir.

Smali Opcodları

Smali kütüphanelerinde kullanılmakta olan bazı opcodlar ve anlamlarını aşağıda gösterelim.

Invoke-super Üst sınıfın methodunu çağırır.
New-instance vx Yeni bir örnek nesne oluşturur ve başvurusunu vx değişkenine atar.
İnvoke-direct vx, vy vx nesnesinden vy parametresi ile bir nesne çağırır.
Const-Sitring vx ,”test” vx değişkenine “test” stringini atar.
İnvoke-virtual vx, vy vx nesnesinden sanal method çağırır ve vy parametresini gönderir.
Return-void Void değer, döner

Smali Method Tanımları

Şimdi örnek bir smali methoduna göz atacak olursak aşağıdaki kodlara benzer bir yapı göreceğiz.

Yukarıda “.method” tanımlaması ile bir method oluşturulmuş ve erişim yetkisi public olarak ayarlanmış bir constructor fonksiyonu olduğunu görebiliriz. Ayrıca hiç parametre almadığı ve dönüş tipinin Void (V) olduğunu anlamaktayız. Burada hiç parametre almasa bile p0 olarak tanımlanan “this” referansı olduğunu unutmayalım. Fonksiyonun iç kısmında ise “.local 1” tanımlaması ile bir adet local değişken kullanılmakta olduğunu görebiliriz.

Smali if – else Yapıları

Parogramlama dillerinin en önemli yapılarından olan ve karar verme işlemlerini yapan if-else yapıları smalideki küçük bir örneği aşağıdaki gibidir.

       
    
        if-nez v0, :cond_0

        const-string v2, "hello 1"

        :goto_0
        return-void

        :cond_0
        const-string v2, "hello 2"
        goto :goto_0
    

Bu kod bloğunda eğer v0 sıfır değilse cond_0 tagına ,zıplayacak değilse aşağıya doğru okumaya devam edecektir. Bu kodun karşılığı aşağıdaki gibidir.

       
    
        if (i == 0) {
            s = "hello 1";
        }
        else {
            s = "hello 2";
        }
        return;
    

Genel olarak smali kodlarının ne olduğundan ve nasıl okunduğundan bahsettik ancak bu kadar ile sınırlı değildir. Smali kodlarından bir uygulamayı analiz ederken karşımıza çıkan komutları İnternet üzerinde arama yaparak kolayca öğrenebiliriz. Benim smali için kullandığım web sitesini linkine buradan ulaşabilirsiniz.