Smali - Decompiling/[Modifying]/Compiling

Support HackTricks

рдХрднреА-рдХрднреА рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЖрдк рдЫрд┐рдкреА рд╣реБрдИ рдЬрд╛рдирдХрд╛рд░реА рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХреЗрдВ (рд╢рд╛рдпрдж рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЫрд┐рдкреЗ рд╣реБрдП рдкрд╛рд╕рд╡рд░реНрдб рдпрд╛ рдЭрдВрдбреЗ)ред рдлрд┐рд░, рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк apk рдХреЛ рдбрд┐рдХрдВрдкрд╛рдЗрд▓ рдХрд░реЗрдВ, рдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВред

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

Fast Way

Visual Studio Code рдФрд░ APKLab рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдбрд┐рдХрдВрдкрд╛рдЗрд▓, рд╕рдВрд╢реЛрдзрд┐рдд, рд╕рдВрдХрд▓рд┐рдд, рд╕рд╛рдЗрди рдФрд░ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдХ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдмрд╣реБрдд рдЖрд╕рд╛рди рдмрдирд╛рддреА рд╣реИ рд╡рд╣ рд╣реИ https://github.com/ax/apk.sh

Decompile the 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

рдпрд╣ dist рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рднреАрддрд░ рдирдП APK рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдЧрд╛ред

рдпрджрд┐ 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

The Smali instruction set is available here.

Light Changes

рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдПрдХ рдЪрд░ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рдиреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ

рдХреБрдЫ рдЪрд░ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ const рдСрдкрдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЖрдк рдЗрд╕рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЖрдк рдирдП рдорд╛рди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

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

рдмреБрдирд┐рдпрд╛рджреА рд╕рдВрдЪрд╛рд▓рди

#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

рдмрдбрд╝реЗ рдкрд░рд┐рд╡рд░реНрддрди

рд▓реЙрдЧрд┐рдВрдЧ

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

  • рдпрджрд┐ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдШреЛрд╖рд┐рдд рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ (declared v0,v1,v2...) рддреЛ рдЗрди рд▓рд╛рдЗрдиреЛрдВ рдХреЛ .local <number> рдФрд░ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЗ рдШреЛрд╖рдгрд╛рдУрдВ (const v0, 0x1) рдХреЗ рдмреАрдЪ рд░рдЦреЗрдВред

  • рдпрджрд┐ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЛрдб рдХреЗ рдмреАрдЪ рдореЗрдВ рд▓реЙрдЧрд┐рдВрдЧ рдХреЛрдб рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

  • рдШреЛрд╖рд┐рдд рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ 2 рдЬреЛрдбрд╝реЗрдВ: рдЙрджрд╛рд╣рд░рдг: .locals 10 рд╕реЗ .locals 12ред

  • рдирдП рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдкрд╣рд▓реЗ рд╕реЗ рдШреЛрд╖рд┐рдд рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреЗ рдЕрдЧрд▓реЗ рдирдВрдмрд░ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП (рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ v10 рдФрд░ v11 рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдпрд╣ v0 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ)ред

  • рд▓реЙрдЧрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЛрдб рдХреЛ рдмрджрд▓реЗрдВ рдФрд░ v10 рдФрд░ v11 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ v5 рдФрд░ v1 рдХреЗ рдмрдЬрд╛рдпред

Toasting

рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ .locals рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ 3 рдЬреЛрдбрд╝реЗрдВред

рдпрд╣ рдХреЛрдб рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмреАрдЪ рдореЗрдВ рдбрд╛рд▓реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ (рдЬрд╝рд░реВрд░рдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрджрд▓реЗрдВ)ред рдпрд╣ 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
HackTricks рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ

Last updated