mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
165 lines
7.1 KiB
Markdown
165 lines
7.1 KiB
Markdown
# Smali - Decompiling/\[Modifying]/Compiling
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|
|
|
|
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 dekompileer, die kode te wysig en dit weer te compileer.
|
|
|
|
**Opcodes verwysing:** [http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html](http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html)
|
|
|
|
## Vinninge Weg
|
|
|
|
Met **Visual Studio Code** en die [APKLab](https://github.com/APKLab/APKLab) uitbreiding, kan jy **outomaties dekompileer**, 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**](https://github.com/ax/apk.sh)
|
|
|
|
## Dekompileer die APK
|
|
|
|
Met APKTool kan jy toegang verkry tot die **smali kode en hulpbronne**:
|
|
```bash
|
|
apktool d APP.apk
|
|
```
|
|
As **apktool** jou enige fout gee, probeer[ die **nuutste weergawe**](https://ibotpeaches.github.io/Apktool/install/)
|
|
|
|
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](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 bronkode 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 **nuwe** instruksies byvoeg. Ek verander die Smali kode met behulp van [**VS Code**](https://code.visualstudio.com), jy installeer dan die **smalise uitbreiding** en die redigeerder sal jou vertel of enige **instruksie verkeerd is**.\
|
|
Sommige **voorbeelde** kan hier gevind word:
|
|
|
|
- [Smali changes examples](smali-changes.md)
|
|
- [Google CTF 2018 - Shall We Play a Game?](google-ctf-2018-shall-we-play-a-game.md)
|
|
|
|
Of jy kan [**onder kyk na sommige Smali veranderinge verduidelik**](smali-changes.md#modifying-smali).
|
|
|
|
## Hernoem die APK
|
|
|
|
Na die aanpassing van die kode kan jy die kode **hernoem** met:
|
|
```bash
|
|
apktool b . #In the folder generated when you decompiled the application
|
|
```
|
|
Dit sal die nuwe APK **compile** **binne** die _**dist**_ gids.
|
|
|
|
As **apktool** 'n **fout** gooi, probeer[ om die **nuutste weergawe**](https://ibotpeaches.github.io/Apktool/install/) 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):
|
|
```bash
|
|
keytool -genkey -v -keystore key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias <your-alias>
|
|
```
|
|
Laastens, **teken** die nuwe APK:
|
|
```bash
|
|
jarsigner -keystore key.jks path/to/dist/* <your-alias>
|
|
```
|
|
### Optimaliseer nuwe aansoek
|
|
|
|
**zipalign** is 'n argief-uitlyn hulpmiddel wat belangrike optimalisering aan Android aansoek (APK) lêers bied. [More information here](https://developer.android.com/studio/command-line/zipalign).
|
|
```bash
|
|
zipalign [-f] [-v] <alignment> infile.apk outfile.apk
|
|
zipalign -v 4 infile.apk
|
|
```
|
|
### **Teken die nuwe APK (weer?)**
|
|
|
|
As jy **verkies** om [**apksigner**](https://developer.android.com/studio/command-line/) te gebruik 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).
|
|
```bash
|
|
apksigner sign --ks key.jks ./dist/mycompiled.apk
|
|
```
|
|
## Modifying Smali
|
|
|
|
Vir die volgende Hello World Java kode:
|
|
```java
|
|
public static void printHelloWorld() {
|
|
System.out.println("Hello World")
|
|
}
|
|
```
|
|
Die Smali-kode sou wees:
|
|
```java
|
|
.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 [here](https://source.android.com/devices/tech/dalvik/dalvik-bytecode#instructions).
|
|
|
|
### 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:
|
|
```bash
|
|
#Number
|
|
const v9, 0xf4240
|
|
const/4 v8, 0x1
|
|
#Strings
|
|
const-string v5, "wins"
|
|
```
|
|
### Basiese Operasies
|
|
```bash
|
|
#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
|
|
```bash
|
|
#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>"
|
|
```
|
|
Aanbevelings:
|
|
|
|
- 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** met sy waarde **maak**.
|
|
```bash
|
|
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
|
|
```
|
|
{{#include ../../banners/hacktricks-training.md}}
|