Smali - Decompiling/[Modifying]/Compiling

AWS hacklemeyi sıfırdan kahraman olmak için öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı)!

HackTricks'i desteklemenin diğer yolları:

Bazen, sizin için gizli bilgilere erişmek için uygulama kodunu değiştirmek ilginç olabilir (belki iyi gizlenmiş şifreler veya bayraklar). Ardından, apk'yı decompile etmek, kodu değiştirmek ve yeniden derlemek ilginç olabilir.

Opcodes referansı: http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html

Hızlı Yol

Visual Studio Code ve APKLab uzantısı kullanarak, herhangi bir komut çalıştırmadan uygulamayı otomatik olarak decompile edebilir, kodu değiştirebilir, yeniden derleyebilir, imzalayabilir ve yükleyebilirsiniz.

Bu görevi çok kolaylaştıran başka bir betik de https://github.com/ax/apk.sh

APK'yı decompile etme

APKTool kullanarak smali koduna ve kaynaklara erişebilirsiniz:

apktool d APP.apk

Eğer apktool herhangi bir hata verirse, en son sürümü kurmayı deneyin.

Bazı ilginç dosyalara bakmanız gerekiyor:

  • res/values/strings.xml (ve res/values/* içindeki tüm xml'ler)

  • AndroidManifest.xml

  • .sqlite veya .db uzantılı herhangi bir dosya

Eğer apktool uygulamayı çözümlemekte sorun yaşıyorsa, https://ibotpeaches.github.io/Apktool/documentation/#framework-files adresine bakabilir veya -r argümanını kullanmayı deneyebilirsiniz (Kaynakları çözümleme). Ardından, sorun kaynağı kaynak kodunda değilse, sorununuz olmayacak (kaynakları da decompile etmeyeceksiniz).

Smali kodunu değiştirme

Komutları değiştirebilir, bazı değişkenlerin değerini değiştirebilir veya yeni komutlar ekleyebilirsiniz. Ben Smali kodunu VS Code kullanarak değiştiriyorum, ardından smalise eklentisini yüklersiniz ve düzenleyici size herhangi bir hatalı komut olduğunu söyler. Bazı örnekler burada bulunabilir:

Veya aşağıda açıklanan bazı Smali değişikliklerini kontrol edebilirsiniz.

APK'yi yeniden derleme

Kodu değiştirdikten sonra, kodu yeniden derleyebilirsiniz. Bunun için şu komutu kullanabilirsiniz:

apktool b . #In the folder generated when you decompiled the application

Yeni APK'yi dist klasörünün içine derleyecektir.

Eğer apktool bir hata verirse, en son sürümü yüklemeyi deneyin.

Yeni APK'yi imzalayın

Ardından, bir anahtar oluşturmanız gerekecek (bir şifre ve rastgele doldurabileceğiniz bazı bilgiler istenecektir):

keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias <your-alias>

Son olarak, yeni APK'yi imzala:

jarsigner -keystore key.jks path/to/dist/* <your-alias>

Yeni uygulamayı optimize edin

zipalign, Android uygulama (APK) dosyalarına önemli bir optimizasyon sağlayan bir arşiv hizalama aracıdır. Daha fazla bilgi için buraya tıklayın.

zipalign [-f] [-v] <alignment> infile.apk outfile.apk
zipalign -v 4 infile.apk

Yeni APK'yi imzalayın (tekrar?)

Eğer apksigner kullanmayı tercih ederseniz, zipalign ile optimizasyon uyguladıktan sonra APK'yi imzalamalısınız. ANCAK YALNIZCA jarsigner ile (zipalign'den önce) veya aspsigner ile (zipalign'den sonra) UYGULAMAYI BİR KEZ İMZALAMANIZ GEREKTİĞİNE DİKKAT EDİN.

apksigner sign --ks key.jks ./dist/mycompiled.apk

Smali Değiştirme

Aşağıdaki Hello World Java kodu için:

public static void printHelloWorld() {
System.out.println("Hello World")
}

Smali kodu şu şekilde olacaktır:

.method public static printHelloWorld()V
.registers 2
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
const-string v1, "Hello World"
invoke-virtual {v0,v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
return-void
.end method

Smali talimat seti burada bulunabilir.

Hafif Değişiklikler

Bir fonksiyon içinde bir değişkenin başlangıç değerlerini değiştirme

Bazı değişkenler, fonksiyonun başında const opcode'unu kullanarak tanımlanır, değerlerini değiştirebilir veya yeni tanımlayabilirsiniz:

#Number
const v9, 0xf4240
const/4 v8, 0x1
#Strings
const-string v5, "wins"

Temel İşlemler

Smali Dosyalarını Değiştirmek

Smali dosyaları, Android uygulamalarının derlenmiş DEX dosyalarının insan tarafından okunabilir hali olan bir dildir. Smali dosyalarını değiştirerek uygulamanın davranışını değiştirebiliriz.

Smali dosyalarını değiştirmek için aşağıdaki adımları izleyebilirsiniz:

  1. İlgili smali dosyasını bulun ve açın.

  2. İstediğiniz değişiklikleri yapın.

  3. Dosyayı kaydedin ve kapatın.

Smali Dosyalarını Birleştirmek

Bazı durumlarda, uygulamanın performansını artırmak veya kodu daha düzenli hale getirmek için smali dosyalarını birleştirmek gerekebilir. Smali dosyalarını birleştirmek için aşağıdaki adımları izleyebilirsiniz:

  1. İlgili smali dosyalarını bulun ve açın.

  2. İçeriklerini birleştirin.

  3. Dosyayı kaydedin ve kapatın.

Smali Dosyalarını Ayırmak

Bazı durumlarda, uygulamanın karmaşıklığını azaltmak veya kodu daha modüler hale getirmek için smali dosyalarını ayırmak gerekebilir. Smali dosyalarını ayırmak için aşağıdaki adımları izleyebilirsiniz:

  1. İlgili smali dosyalarını bulun ve açın.

  2. İçeriklerini ayırın.

  3. Dosyayı kaydedin ve kapatın.

Smali Dosyalarını Yeniden Adlandırmak

Smali dosyalarını yeniden adlandırarak, uygulamanın kodunu daha anlaşılır hale getirebiliriz. Smali dosyalarını yeniden adlandırmak için aşağıdaki adımları izleyebilirsiniz:

  1. İlgili smali dosyalarını bulun ve açın.

  2. Dosya adını değiştirin.

  3. Dosyayı kaydedin ve kapatın.

Smali Dosyalarını Silmek

Bazı durumlarda, uygulamanın gereksiz kodlarını temizlemek için smali dosyalarını silebiliriz. Smali dosyalarını silmek için aşağıdaki adımları izleyebilirsiniz:

  1. İlgili smali dosyasını bulun ve silin.

  2. Dosyayı kalıcı olarak silmek için çöp kutusundan silin.

Smali Dosyalarını Oluşturmak

Smali dosyalarını oluşturarak, yeni bir Android uygulaması geliştirebiliriz. Smali dosyalarını oluşturmak için aşağıdaki adımları izleyebilirsiniz:

  1. Yeni bir smali dosyası oluşturun.

  2. İçeriği düzenleyin.

  3. Dosyayı kaydedin ve kapatın.

#Math
add-int/lit8 v0, v2, 0x1 #v2 + 0x1 and save it in v0
mul-int v0,v2,0x2 #v2*0x2 and save in v0

#Move the value of one object into another
move v1,v2

#Condtions
if-ge #Greater or equals
if-le #Less or equals
if-eq #Equals

#Get/Save attributes of an object
iget v0, p0, Lcom/google/ctf/shallweplayagame/GameActivity;->o:I #Save this.o inside v0
iput v0, p0, Lcom/google/ctf/shallweplayagame/GameActivity;->o:I #Save v0 inside this.o

#goto
:goto_6 #Declare this where you want to start a loop
if-ne v0, v9, :goto_6 #If not equals, go to: :goto_6
goto :goto_6 #Always go to: :goto_6

Büyük Değişiklikler

Günlük Kayıt (Logging)

#Log win: <number>
iget v5, p0, Lcom/google/ctf/shallweplayagame/GameActivity;->o:I #Get this.o inside v5
invoke-static {v5}, Ljava/lang/String;->valueOf(I)Ljava/lang/String; #Transform number to String
move-result-object v1 #Move to v1
const-string v5, "wins" #Save "win" inside v5
invoke-static {v5, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I #Logging "Wins: <num>"

Öneriler:

  • Fonksiyon içinde bildirilen değişkenleri kullanacaksanız (bildirilen v0,v1,v2...), bu satırları .local <number> ve değişkenlerin bildirimleri (const v0, 0x1) arasına yerleştirin.

  • Bir fonksiyonun kodunun ortasına günlükleme kodunu yerleştirmek istiyorsanız:

  • Bildirilen değişken sayısına 2 ekleyin: Örnek: .locals 10 yerine .locals 12.

  • Yeni değişkenler, zaten bildirilen değişkenlerin bir sonraki numaraları olmalıdır (bu örnekte v10 ve v11 olmalıdır, hatırlayın ki v0'dan başlar).

  • Günlükleme işlevinin kodunu değiştirin ve v5 ve v1 yerine v10 ve v11 kullanın.

Toasting

Fonksiyonun başında .locals sayısına 3 eklemeyi unutmayın.

Bu kod, bir fonksiyonun ortasına yerleştirilmek üzere hazırlanmıştır (değişkenlerin sayısını gerektiği gibi değiştirin). Bu kod, this.o değerini String'e dönüştürür ve değeriyle birlikte bir toast yapar.

const/4 v10, 0x1
const/4 v11, 0x1
const/4 v12, 0x1
iget v10, p0, Lcom/google/ctf/shallweplayagame/GameActivity;->o:I
invoke-static {v10}, Ljava/lang/String;->valueOf(I)Ljava/lang/String;
move-result-object v11
invoke-static {p0, v11, v12}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
move-result-object v12
invoke-virtual {v12}, Landroid/widget/Toast;->show()V
AWS hacklemeyi sıfırdan kahraman seviyesine öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı)!

HackTricks'ı desteklemenin diğer yolları:

Last updated