Halil Filik
  • 29 Aug 2021
Smali-Dex

Dex Nedir?




ZAYOTEM

DEX DEBUGGING


Smali kodlarına DEBUGGER üzerinden değişiklik yapılamamakta. Sadece REGISTERLAR üzerinden değişiklik yapabiliriz.


Eğer Smali kodlarında değişiklik yapmak gerekiyorsa, APK’yı parse edip, smali kodlarını düzenleyip, build edip, imzalamamız gerekiyor.


DEBUG İÇİN GEREKENLER


IDA PRO veya JEB Decompiler Pro

GENYMOTION veya alternatif emülator

ADB

Xposed Framework => Xdebug modülü // APK’yı debugable yapmak için

SMALI KODLARI NEDIR?


Smali kodlarının çalışma mantığı, Assembly’e benzerdir.

Smali kod örneği

const v0, 1

Assembly kod örneği

mov eax, 1

SMALI REGISTERS - v türü


local register

v0,v1,v2,v3,v4,v5,v6,v7…

Eğer belirtilmemiş ise default olarak 2 tane local register vardır. (v0,v1)

Bir method bir değer döndürüyorsa genelde v0 kullanır.

SMALI REGISTERS - p türü


Parametre register’ı

p0,p1,p2,p3,p4,p5,p6,p7…

Böyle bir method'dan gelen parametreler smali'de şu şekilde gözükür:

public void EkranaYazdır(int yükseklik, int genişlik, string yazı)

const/4 v0, #yükseklik

const/4 v1, #genişlik

const-string v2, #yazı

invoke-static {v0,v1,v2}, Lcom/example/android/basicjni/MainActivity;->EkranaYazdır(IILjava/lang/String;)V

p0 this

p1 yükseklik

p2 genişlik

p3 yazı

Eğer method static olursa işler biraz daha değişmekte

public static void EkranaYazdır(int yükseklik, int genişlik, string yazi)

const/4 v0, #yükseklik

const/4 v1, #genişlik

const-string v2, #yazı

invoke-static {v0,v1,v2}, Lcom/example/android/basicjni/MainActivity;->EkranaYazdır(IILjava/lang/String;)V

v0 birinci local register

v1 ikinci local register

v2 p0 yükseklik

v3 p1 genişlik

v4 p2 yazı

SMALI REGISTER LONG-DOUBLE


Long ve Double türünde değerleri tutmak için kullanılır.

Smali registerları 32-bit olduğundan LONG ve DOUBLE için 2 tane v veya p register’ı atanır.

public static void zayotem(int a, double b, string c)

const/4 v0, #a

const-wide/32 v1, #b

const-string v2, #c

invoke-static {v0,v1,v2}, Lcom/example/android/basicjni/MainActivity;->zayotem(IDLjava/lang/String;)V

v0 birinci local register

v1 ikinci local register

v2 p0 a

v3 p1,p2 b

v4 p3 c

JAVA VS SMALI


Java ile smali registerların farkları

JAVA

void zayotem(int i) {

if (i == 0) {

s = "zayotem 1";

}

else {

s = "zayotem 2";

return;

}

SMALI

if-nez v0, :cond_0

const-string v2, "zayotem 1"

:goto_0

return-void

:cond_0

const-string v2, "zayotem 2"

goto :goto_0

SMALI REGISTERLARINI IDA PRO'DA WATCH LIST’DE IZLEME


Örneğin bir const-string olarak v0 a atanmış değeri izlemek istiyorsak watch list de (String)v0 olarak eklememiz gerekiyor. Yani tipini belirtiyoruz.

const-string v0, "zayotem"

v0 = invalid value

(String)v0 = "zayotem"

(int)v0 = 0x147F242