Smali - Decompiling/[Modifying]/Compiling

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Ορισμένες φορές είναι ενδιαφέρον να τροποποιήσετε τον κώδικα της εφαρμογής για να έχετε πρόσβαση σε κρυφές πληροφορίες (ίσως καλά κρυπτογραφημένους κωδικούς πρόσβασης ή σημαίες). Στη συνέχεια, θα μπορούσε να είναι ενδιαφέρον να αποσυμπιέσετε το αρχείο apk, να τροποποιήσετε τον κώδικα και να το συμπιέσετε ξανά.

Αναφορά εντολών: http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html

Γρήγορος τρόπος

Χρησιμοποιώντας το Visual Studio Code και την επέκταση APKLab, μπορείτε να αποσυμπιέσετε αυτόματα, να τροποποιήσετε, να συμπιέσετε, να υπογράψετε και να εγκαταστήσετε την εφαρμογή χωρίς να εκτελέσετε καμία εντολή.

Ένα άλλο σενάριο που διευκολύνει πολύ αυτήν την εργασία είναι το https://github.com/ax/apk.sh

Αποσυμπίεση του APK

Χρησιμοποιώντας το APKTool μπορείτε να έχετε πρόσβαση στον κώδικα smali και τους πόρους:

apktool d APP.apk

Εάν το apktool σας δίνει οποιοδήποτε σφάλμα, δοκιμάστε να εγκαταστήσετε την τελευταία έκδοση

Ορισμένα ενδιαφέροντα αρχεία που πρέπει να ελέγξετε είναι:

  • res/values/strings.xml (και όλα τα xmls μέσα στον φάκελο res/values/*)

  • AndroidManifest.xml

  • Οποιοδήποτε αρχείο με κατάληξη .sqlite ή .db

Εάν το apktool έχει προβλήματα αποκωδικοποίησης της εφαρμογής, ρίξτε μια ματιά στο https://ibotpeaches.github.io/Apktool/documentation/#framework-files ή δοκιμάστε να χρησιμοποιήσετε το όρισμα -r (Να μην αποκωδικοποιηθούν οι πόροι). Έπειτα, εάν το πρόβλημα ήταν σε έναν πόρο και όχι στον πηγαίο κώδικα, δεν θα έχετε το πρόβλημα (δεν θα αποκωδικοποιήσετε επίσης τους πόρους).

Αλλαγή κώδικα smali

Μπορείτε να αλλάξετε εντολές, να αλλάξετε τη τιμή ορισμένων μεταβλητών ή να προσθέσετε νέες εντολές. Αλλάζω τον κώδικα Smali χρησιμοποιώντας το VS Code, στη συνέχεια εγκαθιστάτε την επέκταση smalise και ο επεξεργαστής θα σας ειδοποιήσει εάν κάποια εντολή είναι εσφαλμένη. Ορισμένα παραδείγματα μπορούν να βρεθούν εδώ:

Ή μπορείτε να ελέγξετε παρακάτω μερικές εξηγήσεις αλλαγών Smali.

Επανασυναρμολόγηση του APK

Αφού τροποποιήσετε τον κώδικα, μπορείτε να επανασυναρμολογήσετε τον κώδικα χρησιμοποιώντας:

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

Θα μεταγλωττίσει το νέο APK μέσα στον φάκελο dist.

Αν το apktool εμφανίσει ένα σφάλμα, δοκιμάστε να εγκαταστήσετε την τελευταία έκδοση

Υπογράψτε το νέο APK

Στη συνέχεια, θα χρειαστεί να δημιουργήσετε ένα κλειδί (θα σας ζητηθεί ένας κωδικός πρόσβασης και μερικές πληροφορίες που μπορείτε να συμπληρώσετε τυχαία):

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

Τέλος, υπογράψτε το νέο APK:

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

Βελτιστοποίηση νέας εφαρμογής

zipalign είναι ένα εργαλείο ευθυγράμμισης αρχείων που παρέχει σημαντική βελτιστοποίηση στα αρχεία εφαρμογών Android (APK). Περισσότερες πληροφορίες εδώ.

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

Υπογράψτε ξανά το νέο APK (ήδη?)

Εάν προτιμάτε να χρησιμοποιήσετε το apksigner αντί του jarsigner, θα πρέπει να υπογράψετε το apk μετά την εφαρμογή της βελτιστοποίησης με το zipalign. ΩΣΤΟΣΟ, ΠΡΟΣΕΞΤΕ ΌΤΙ ΠΡΈΠΕΙ ΝΑ ΥΠΟΓΡΆΨΕΤΕ ΤΗΝ ΕΦΑΡΜΟΓΉ ΜΌΝΟ ΜΙΑ ΦΟΡΆ ΜΕ ΤΟ jarsigner (πριν το zipalign) Ή ΜΕ ΤΟ aspsigner (μετά το zipalign).

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

Τροποποίηση του Smali

Για τον παρακάτω κώδικα Hello World σε Java:

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

Ο κώδικας Smali θα ήταν:

.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 είναι διαθέσιμο εδώ.

Μικρές Αλλαγές

Τροποποίηση αρχικών τιμών μιας μεταβλητής μέσα σε μια συνάρτηση

Ορισμένες μεταβλητές καθορίζονται στην αρχή της συνάρτησης χρησιμοποιώντας την εντολή const, μπορείτε να τροποποιήσετε τις τιμές τους ή να ορίσετε νέες:

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

Βασικές Λειτουργίες

Adding Instructions

Προσθήκη Οδηγιών

To add instructions to a smali file, you need to open the file in a text editor and locate the method where you want to add the instructions. Then, you can simply add the desired instructions in smali syntax.

Για να προσθέσετε οδηγίες σε ένα αρχείο smali, πρέπει να ανοίξετε το αρχείο σε έναν επεξεργαστή κειμένου και να εντοπίσετε τη μέθοδο όπου θέλετε να προσθέσετε τις οδηγίες. Στη συνέχεια, μπορείτε απλά να προσθέσετε τις επιθυμητές οδηγίες σε μορφή smali.

Modifying Instructions

Τροποποίηση Οδηγιών

To modify instructions in a smali file, you need to locate the specific instruction you want to modify and edit it accordingly. Make sure to follow the correct smali syntax and save the changes.

Για να τροποποιήσετε οδηγίες σε ένα αρχείο smali, πρέπει να εντοπίσετε τη συγκεκριμένη οδηγία που θέλετε να τροποποιήσετε και να την επεξεργαστείτε αναλόγως. Βεβαιωθείτε ότι ακολουθείτε τη σωστή σύνταξη smali και αποθηκεύστε τις αλλαγές.

Deleting Instructions

Διαγραφή Οδηγιών

To delete instructions from a smali file, you need to locate the specific instruction you want to delete and remove it from the file. Make sure to save the changes after deleting the instruction.

Για να διαγράψετε οδηγίες από ένα αρχείο smali, πρέπει να εντοπίσετε τη συγκεκριμένη οδηγία που θέλετε να διαγράψετε και να την αφαιρέσετε από το αρχείο. Βεβαιωθείτε ότι αποθηκεύετε τις αλλαγές μετά τη διαγραφή της οδηγίας.

#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

Μεγαλύτερες Αλλαγές

Καταγραφή (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>"

Συστάσεις:

  • Εάν πρόκειται να χρησιμοποιήσετε δηλωμένες μεταβλητές μέσα στη συνάρτηση (δηλωμένες v0, v1, v2...), τοποθετήστε αυτές τις γραμμές μεταξύ του .local <αριθμός> και των δηλώσεων των μεταβλητών (const v0, 0x1)

  • Εάν θέλετε να τοποθετήσετε τον κώδικα καταγραφής στη μέση του κώδικα μιας συνάρτησης:

  • Προσθέστε 2 στον αριθμό των δηλωμένων μεταβλητών: Παράδειγμα: από .locals 10 σε .locals 12

  • Οι νέες μεταβλητές πρέπει να είναι οι επόμενοι αριθμοί των ήδη δηλωμένων μεταβλητών (σε αυτό το παράδειγμα θα πρέπει να είναι v10 και v11, θυμηθείτε ότι ξεκινά από το v0).

  • Αλλάξτε τον κώδικα της συνάρτησης καταγραφής και χρησιμοποιήστε το v10 και v11 αντί για το v5 και v1.

Toasting

Θυμηθείτε να προσθέσετε 3 στον αριθμό των .locals στην αρχή της συνάρτησης.

Αυτός ο κώδικας είναι προετοιμασμένος για να εισαχθεί στη μέση μιας συνάρτησης (αλλάξτε τον αριθμό των μεταβλητών όπως απαιτείται). Θα πάρει τη τιμή του this.o, τη μετατρέψει σε String και θα κάνει ένα toast με την τιμή της.

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 από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Last updated