9.4 KiB
Smali - Decompile/[Değiştirme]/Compile
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Bazen, gizli bilgilere erişmek için uygulama kodunu değiştirmek ilginç olabilir (belki iyi obfuscate edilmiş şifreler veya bayraklar). O zaman, apk'yı decompile etmek, kodu değiştirmek ve yeniden compile etmek ilginç olabilir.
Opcode referansı: http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
Hızlı Yol
Visual Studio Code ve APKLab uzantısını kullanarak, herhangi bir komut çalıştırmadan uygulamayı otomatik olarak decompile, değiştirebilir, recompile, imzalayabilir ve yükleyebilirsiniz.
Bu görevi oldukça kolaylaştıran başka bir script https://github.com/ax/apk.sh
APK'yı Decompile Et
APKTool kullanarak smali koduna ve kaynaklarına erişebilirsiniz:
apktool d APP.apk
Eğer apktool herhangi bir hata veriyorsa, en son sürümü yüklemeyi deneyin.
Bakmanız gereken bazı ilginç dosyalar:
- res/values/strings.xml (ve res/values/* içindeki tüm xml'ler)
- AndroidManifest.xml
- .sqlite veya .db uzantısına sahip herhangi bir dosya
Eğer apktool
uygulamayı çözümlerken sorunlar yaşıyorsa, https://ibotpeaches.github.io/Apktool/documentation/#framework-files adresine bakın veya -r
argümanını kullanmayı deneyin (Kaynakları çözümleme). O zaman, eğer sorun bir kaynakta ve kaynak kodunda değilse, bu sorunla karşılaşmayacaksınız (kaynakları da decompile etmeyeceksiniz).
Smali kodunu değiştir
Talimatları değiştirebilir, bazı değişkenlerin değerlerini değiştirebilir veya yeni talimatlar ekleyebilirsiniz. Smali kodunu VS Code kullanarak değiştiriyorum, ardından smalise eklentisini yükleyin ve editör size herhangi bir talimatın yanlış olup olmadığını söyleyecektir.
Bazı örnekler burada bulunabilir:
Ya da aşağıda bazı Smali değişikliklerinin açıklandığını kontrol edebilirsiniz.
APK'yı yeniden derle
Kodu değiştirdikten sonra kodu yeniden derleyebilirsiniz:
apktool b . #In the folder generated when you decompiled the application
Yeni APK'yı dist klasörünün içinde derleyecektir.
Eğer apktool bir hata verirse, en son sürümü yüklemeyi deneyin.
Yeni APK'yı imzala
Sonra, bir anahtar oluşturmanız gerekiyor (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, imzala yeni APK'yı:
jarsigner -keystore key.jks path/to/dist/* <your-alias>
Yeni uygulamayı optimize et
zipalign, Android uygulama (APK) dosyalarına önemli optimizasyonlar sağlayan bir arşiv hizalama aracıdır. Daha fazla bilgi burada.
zipalign [-f] [-v] <alignment> infile.apk outfile.apk
zipalign -v 4 infile.apk
Yeni APK'yı imzalayın (yine mi?)
Eğer apksigner kullanmayı tercih ediyorsanız, zipalign ile optimizasyonu uyguladıktan sonra apk'yı imzalamalısınız. ANCAK DİKKAT EDİN, UYGULAMAYI SADECE BİR KEZ jarsigner ile (zipalign'dan önce) veya aspsigner ile (zipalign'dan sonra) İMZALAMALISINIZ.
apksigner sign --ks key.jks ./dist/mycompiled.apk
Smali'yi Değiştirme
Aşağıdaki Hello World Java kodu için:
public static void printHelloWorld() {
System.out.println("Hello World")
}
Smali kodu şöyle 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 mevcuttur.
Hafif Değişiklikler
Bir fonksiyon içindeki bir değişkenin başlangıç değerlerini değiştirin
Bazı değişkenler, const opcode'u kullanılarak fonksiyonun başında tanımlanır, değerlerini değiştirebilir veya yenilerini tanımlayabilirsiniz:
#Number
const v9, 0xf4240
const/4 v8, 0x1
#Strings
const-string v5, "wins"
Temel İşlemler
#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
Daha Büyük Değişiklikler
Günlükleme
#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>"
Recommendations:
- Eğer fonksiyon içinde tanımlı değişkenleri kullanacaksanız (tanımlı v0,v1,v2...) bu satırları .local <number> ile değişkenlerin tanımları (const v0, 0x1) arasında koyun.
- Eğer bir fonksiyonun kodunun ortasına logging kodunu koymak istiyorsanız:
- Tanımlı değişkenlerin sayısına 2 ekleyin: Örnek: .locals 10'dan .locals 12'ye.
- Yeni değişkenler, zaten tanımlı değişkenlerin sonraki numaraları olmalıdır (bu örnekte v10 ve v11 olmalıdır, v0'dan başladığını unutmayın).
- Logging fonksiyonunun kodunu değiştirin ve v10 ve v11 kullanın, v5 ve v1 yerine.
Toasting
Fonksiyonun başında .locals sayısına 3 eklemeyi unutmayın.
Bu kod, bir fonksiyonun ortasına eklenmek üzere hazırlanmıştır (değiştirin değişkenlerin sayısını gerektiği gibi). this.o'nun değerini alacak, String'e dönüştürecek ve ardından değerini kullanarak bir toast yapacaktır.
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
{% hint style="success" %}
AWS Hacking'i öğrenin ve pratik yapın:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter'da 🐦 @hacktricks_live'i takip edin.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.