Smali - Decompiling/[Modifying]/Compiling

Support HackTricks

Soms is dit interessant om die toepassingskode te wysig om toegang te verkry tot verborge inligting vir jou (miskien goed obfuskeerde wagwoorde of vlae). Dan kan dit interessant wees om die apk te decompileer, die kode te wysig en dit weer te compileer.

Opcodes verwysing: http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html

Vinige Weg

Met Visual Studio Code en die APKLab uitbreiding, kan jy outomaties decompileer, wysig, hercompileer, teken & installeer die toepassing sonder om enige opdrag uit te voer.

Nog 'n script wat hierdie taak baie vergemaklik, is https://github.com/ax/apk.sh

Decompileer die APK

Met APKTool kan jy toegang verkry tot die smali kode en hulpbronne:

apktool d APP.apk

If apktool gee vir jou enige fout, probeer om die nuutste weergawe te installeer.

Sommige interessante lêers wat jy moet kyk is:

  • res/values/strings.xml (en alle xmls binne res/values/*)

  • AndroidManifest.xml

  • Enige lêer met die uitbreiding .sqlite of .db

As apktool probleme het om die toepassing te dekodeer, kyk na https://ibotpeaches.github.io/Apktool/documentation/#framework-files of probeer om die argument -r te gebruik (Moet nie hulpbronne dekodeer nie). Dan, as die probleem in 'n hulpbron was en nie in die bronnekode nie, sal jy nie die probleem hê nie (jy sal ook nie die hulpbronne dekompileer nie).

Verander smali kode

Jy kan verander instruksies, die waarde van sommige veranderlikes verander of voeg nuwe instruksies by. Ek verander die Smali kode met behulp van VS Code, jy installeer dan die smalise uitbreiding en die redigeerder sal jou vertel of enige instruksie verkeerd is. Sommige voorbeelde kan hier gevind word:

Of jy kan onderaan kyk na sommige Smali veranderinge verduidelik.

Hernoem die APK

Na die aanpassing van die kode kan jy die kode hernoem met:

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

Dit sal kompiler die nuwe APK binne die dist gids.

As apktool 'n fout gooi, probeer om die nuutste weergawe te installeer

Teken die nuwe APK

Dan moet jy 'n sleutel genereer (jy sal gevra word vir 'n wagwoord en vir 'n paar inligting wat jy lukraak kan invul):

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

Uiteindelik, teken die nuwe APK:

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

Optimaliseer nuwe aansoek

zipalign is 'n argiefuitlijningsinstrument wat belangrike optimalisering aan Android-toepassing (APK) lêers bied. Meer inligting hier.

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

Teken die nuwe APK (weer?)

As jy voorkeur gee aan apksigner in plaas van jarsigner, moet jy die apk teken nadat jy die optimalisering met zipalign toegepas het. MAAR LET OP DAT JY SLEGS DIE AANSOEK EEN KEER MOET TEKEN MET jarsigner (voor zipalign) OF MET aspsigner (na zipalign).

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

Modifying Smali

Vir die volgende Hello World Java kode:

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

Die Smali-kode sou wees:

.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

Die Smali instruksieset is beskikbaar hier.

Ligte Veranderinge

Verander aanvanklike waardes van 'n veranderlike binne 'n funksie

Sommige veranderlikes word aan die begin van die funksie gedefinieer met die opcode const, jy kan sy waardes verander, of jy kan nuwe eenhede definieer:

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

Basiese Operasies

#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

Groter Veranderinge

Teken

#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:

  • As jy verklaarde veranderlikes binne die funksie gaan gebruik (verklaarde v0,v1,v2...) plaas hierdie lyne tussen die .local <number> en die verklarings van die veranderlikes (const v0, 0x1)

  • As jy die logging kode in die middel van die kode van 'n funksie wil plaas:

  • Voeg 2 by die aantal verklaarde veranderlikes: Byvoorbeeld: van .locals 10 na .locals 12

  • Die nuwe veranderlikes moet die volgende nommers van die reeds verklaarde veranderlikes wees (in hierdie voorbeeld moet dit v10 en v11 wees, onthou dat dit begin by v0).

  • Verander die kode van die logging funksie en gebruik v10 en v11 in plaas van v5 en v1.

Toasting

Onthou om 3 by die aantal .locals aan die begin van die funksie te voeg.

Hierdie kode is voorberei om in die middel van 'n funksie ingevoeg te word (verander die nommer van die veranderlikes soos nodig). Dit sal die waarde van this.o neem, transformeer dit na String en dan 'n toast maak met sy waarde.

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
Ondersteun HackTricks

Last updated