ZAYOTEM
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.
IDA PRO veya JEB Decompiler Pro
GENYMOTION veya alternatif emülator
ADB
Xposed Framework => Xdebug modülü // APK’yı debugable yapmak için
Smali kodlarının çalışma mantığı, Assembly’e benzerdir.
Smali kod örneği
const v0, 1
Assembly kod örneği
mov eax, 1
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.
Parametre register’ı
p0,p1,p2,p3,p4,p5,p6,p7…
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ı
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ı
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 ile smali registerların farkları
void zayotem(int i) {
if (i == 0) {
s = "zayotem 1";
}
else {
s = "zayotem 2";
return;
}
if-nez v0, :cond_0
const-string v2, "zayotem 1"
:goto_0
return-void
:cond_0
const-string v2, "zayotem 2"
goto :goto_0
Ö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