Smali - Decompiling/[Modifying]/Compiling

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

๋•Œ๋กœ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ์ˆจ๊ฒจ์ง„ ์ •๋ณด๋ฅผ ์–ป๋Š” ๊ฒƒ์ด ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์ž˜ ๋‚œ๋…ํ™”๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋‚˜ ํ”Œ๋ž˜๊ทธ). ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ apk๋ฅผ decompileํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ modifyํ•œ ๋’ค recompileํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋น ๋ฅธ ๋ฐฉ๋ฒ•

Visual Studio Code์™€ APKLab ํ™•์žฅ(extension)์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ ๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ automatically decompile, modify, recompile, sign & installํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ด ์ž‘์—…์„ ํฌ๊ฒŒ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” script๋Š” https://github.com/ax/apk.sh์ž…๋‹ˆ๋‹ค.

Decompile the APK

APKTool์„ ์‚ฌ์šฉํ•˜๋ฉด smali code and resources์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

apktool d APP.apk

If apktool gives you any error, installing the latest version์„ ์‹œ๋„ํ•ด๋ณด์„ธ์š”

Some interesting files you should look are:

  • res/values/strings.xml (๋ฐ res/values/* ๋‚ด๋ถ€์˜ ๋ชจ๋“  xml ํŒŒ์ผ)
  • AndroidManifest.xml
  • Any file with extension .sqlite or .db

If apktool has problems decoding the application take a look to https://ibotpeaches.github.io/Apktool/documentation/#framework-files or try using the argument -r (Do not decode resources). Then, if the problem was in a resource and not in the source code, you wonโ€™t have the problem (you wonโ€™t also decompile the resources).

Change smali code

๋ช…๋ น์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ผ๋ถ€ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์ƒˆ ๋ช…๋ น์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” Smali ์ฝ”๋“œ๋ฅผ VS Code์—์„œ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„ smalise extension์„ ์„ค์น˜ํ•˜๋ฉด ์—๋””ํ„ฐ๊ฐ€ ์ž˜๋ชป๋œ instruction์ด ์žˆ๋Š”์ง€ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.
Some examples can be found here:

Or you can check below some Smali changes explained.

Recompile the APK

์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ ํ›„ ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ APK๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

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

์ƒˆ APK๋Š” dist ํด๋” ๋‚ด๋ถ€์—์„œ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ apktool๊ฐ€ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉด, installing the latest version์„ ์‹œ๋„ํ•ด๋ณด์„ธ์š”

์ƒˆ 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) ํŒŒ์ผ์— ์ค‘์š”ํ•œ ์ตœ์ ํ™”๋ฅผ ์ œ๊ณตํ•˜๋Š” ์•„์นด์ด๋ธŒ ์ •๋ ฌ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. More information here.

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

์ƒˆ APK์— ์„œ๋ช… (๋‹ค์‹œ?)

jarsigner ๋Œ€์‹  apksigner๋ฅผ ์„ ํ˜ธํ•œ๋‹ค๋ฉด, zipalign์œผ๋กœ ์ตœ์ ํ™”๋ฅผ ์ ์šฉํ•œ ํ›„ APK์— ์„œ๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฃผ์˜: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ jarsigner(์ด์ „์— zipalign)์œผ๋กœ ๋˜๋Š” apksigner(์ดํ›„์— 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 ๋ช…๋ น์–ด ์ง‘ํ•ฉ์€ here์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€๋ฒผ์šด ๋ณ€๊ฒฝ

ํ•จ์ˆ˜ ๋‚ด๋ถ€ ๋ณ€์ˆ˜์˜ ์ดˆ๊ธฐ๊ฐ’ ์ˆ˜์ •

๋ช‡๋ช‡ ๋ณ€์ˆ˜๋“ค์€ ํ•จ์ˆ˜ ์‹œ์ž‘ ๋ถ€๋ถ„์—์„œ opcode _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

๋” ํฐ ๋ณ€๊ฒฝ์‚ฌํ•ญ

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) ์‚ฌ์ด์— ๋„ฃ์œผ์„ธ์š”
  • ํ•จ์ˆ˜ ์ฝ”๋“œ์˜ ์ค‘๊ฐ„์— logging ์ฝ”๋“œ๋ฅผ ๋„ฃ๊ณ  ์‹ถ๋‹ค๋ฉด:
    • ์„ ์–ธ๋œ ๋ณ€์ˆ˜ ์ˆ˜์— 2๋ฅผ ๋”ํ•˜์„ธ์š”: ์˜ˆ: _.locals 10_์—์„œ .locals 12
    • ์ƒˆ ๋ณ€์ˆ˜๋“ค์€ ์ด๋ฏธ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์˜ ๋‹ค์Œ ๋ฒˆํ˜ธ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ด ์˜ˆ์ œ์—์„œ๋Š” _v10_๊ณผ _v11_์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค, v0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์„ธ์š”).
    • logging ํ•จ์ˆ˜์˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ _v10_๊ณผ _v11_์„ _v5_์™€ v1 ๋Œ€์‹  ์‚ฌ์šฉํ•˜์„ธ์š”.

ํ† ์ŠคํŠธ ํ‘œ์‹œ

ํ•จ์ˆ˜ ์‹œ์ž‘ ๋ถ€๋ถ„์˜ .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

์‹œ์ž‘ ์‹œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋กœ๋“œ (System.loadLibrary)

๋•Œ๋•Œ๋กœ ๋‹ค๋ฅธ JNI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ณด๋‹ค ๋จผ์ € ์ดˆ๊ธฐํ™”๋˜๋„๋ก ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์ „ ๋กœ๋“œํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ: ํ”„๋กœ์„ธ์Šค ๋กœ์ปฌ ํ…”๋ ˆ๋ฉ”ํŠธ๋ฆฌ/๋กœ๊น…์„ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด). ์ •์  ์ดˆ๊ธฐํ™”์ž๋‚˜ Application.onCreate() ์ดˆ๊ธฐ์— System.loadLibrary() ํ˜ธ์ถœ์„ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •์  ํด๋ž˜์Šค ์ดˆ๊ธฐํ™”์ž ()์— ๋Œ€ํ•œ smali ์˜ˆ:

.class public Lcom/example/App;
.super Landroid/app/Application;

.method static constructor <clinit>()V
.registers 1
const-string v0, "sotap"         # library name without lib...so prefix
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
return-void
.end method

๋˜๋Š” ๋™์ผํ•œ ๋‘ ์ง€์‹œ๋ฌธ์„ Application.onCreate()์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ๋ฐฐ์น˜ํ•˜์—ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ๋กœ๋“œ๋˜๋„๋ก ํ•˜์„ธ์š”:

.method public onCreate()V
.locals 1

const-string v0, "sotap"
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V

invoke-super {p0}, Landroid/app/Application;->onCreate()V
return-void
.end method

์ฐธ๊ณ :

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์˜ฌ๋ฐ”๋ฅธ ABI ๋ณ€์ข…์ด lib// (์˜ˆ: arm64-v8a/armeabi-v7a) ์•„๋ž˜์— ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜์—ฌ UnsatisfiedLinkError๋ฅผ ๋ฐฉ์ง€ํ•˜์„ธ์š”.
  • ๋งค์šฐ ์ดˆ๊ธฐ์— ๋กœ๋“œํ•˜๋ฉด (class static initializer) native logger๊ฐ€ ์ดํ›„ JNI activity๋ฅผ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ