Smali - Decompiling/[Modifying]/Compiling
Ponekad je interesantno modifikovati kod aplikacije kako biste pristupili skrivenim informacijama (možda dobro obfuskirane lozinke ili zastavice). Zatim, može biti interesantno dekompilirati apk, modifikovati kod i ponovo ga kompilirati.
Referenca za opcode-ove: http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
Brzi način
Koristeći Visual Studio Code i ekstenziju APKLab, možete automatski dekompilirati, modifikovati, rekompilirati, potpisati i instalirati aplikaciju bez izvršavanja bilo koje komande.
Još jedan skript koji olakšava ovaj zadatak je https://github.com/ax/apk.sh
Dekompilacija APK-a
Korišćenjem APKTool-a možete pristupiti smali kodu i resursima:
Ako apktool prikaže bilo kakvu grešku, pokušajte instalirati najnoviju verziju.
Neki zanimljivi fajlovi koje biste trebali pogledati su:
res/values/strings.xml (i svi xml fajlovi unutar res/values/*)
AndroidManifest.xml
Svaki fajl sa ekstenzijom .sqlite ili .db
Ako apktool
ima problema sa dekodiranjem aplikacije, pogledajte https://ibotpeaches.github.io/Apktool/documentation/#framework-files ili pokušajte koristiti argument -r
(Ne dekodiraj resurse). Tada, ako je problem u resursu, a ne u izvornom kodu, nećete imati problem (takođe nećete dekompajlirati resurse).
Promena smali koda
Možete promeniti instrukcije, promeniti vrednost nekih promenljivih ili dodati nove instrukcije. Ja menjam Smali kod koristeći VS Code, zatim instalirate smalise ekstenziju i editor će vam reći ako je neka instrukcija neispravna. Neki primeri mogu se naći ovde:
Ili možete proveriti ispod objašnjenja nekih promena Smali koda.
Rekompajliranje APK-a
Nakon što izmenite kod, možete rekompajlirati kod koristeći:
Biće kompajliran novi APK unutar fascikle dist.
Ako apktool prikaže grešku, pokušajte instalirati najnoviju verziju
Potpišite novi APK
Zatim, trebate generisati ključ (biće vam zatražena lozinka i neke informacije koje možete popuniti nasumično):
Na kraju, potpišite novi APK:
Optimizujte novu aplikaciju
zipalign je alat za poravnanje arhive koji pruža važnu optimizaciju Android aplikacija (APK) datotekama. Više informacija ovde.
Potpišite novi APK (ponovo?)
Ako preferirate da koristite apksigner umesto jarsigner-a, trebali biste potpisati apk nakon primene optimizacije sa zipalingom. ALI OBRATITE PAŽNJU DA SAMO JEDNOM TREBA DA POTPISUJETE APLIKACIJU SA jarsigner-om (pre zipaligna) ILI SA apksigner-om (nakon zipalinga).
Modifikacija Smali koda
Za sledeći Hello World Java kod:
Smali kod bi bio:
Smali instrukcioni set je dostupan ovde.
Lagane promene
Izmena početnih vrednosti promenljive unutar funkcije
Neke promenljive su definisane na početku funkcije koristeći opcode const, možete izmeniti njihove vrednosti ili definisati nove:
Osnovne operacije
Dodavanje instrukcija
Da biste dodali nove instrukcije u smali kod, pratite ove korake:
Pronađite mesto u kodu gde želite da dodate instrukciju.
Napišite smali kod za željenu instrukciju.
Ubacite novu instrukciju na odgovarajuće mesto u smali kodu.
Na primer, ako želite da dodate instrukciju za ispisivanje teksta na ekranu, možete koristiti sledeći smali kod:
Ovaj kod će ispisati "Hello, World!" u logu.
Izmena instrukcija
Da biste izmenili postojeću instrukciju u smali kodu, pratite ove korake:
Pronađite instrukciju koju želite da izmenite.
Izmenite odgovarajući deo smali koda.
Sačuvajte izmene.
Na primer, ako želite da izmenite instrukciju koja proverava da li je broj veći od nule, možete koristiti sledeći smali kod:
Ovaj kod će proveriti da li je vrednost u registru v0 veća od nule.
Brisanje instrukcija
Da biste obrisali instrukciju iz smali koda, pratite ove korake:
Pronađite instrukciju koju želite da obrišete.
Uklonite odgovarajući deo smali koda.
Sačuvajte izmene.
Na primer, ako želite da obrišete instrukciju koja postavlja vrednost registra na 0, možete koristiti sledeći smali kod:
Ovaj kod će postaviti vrednost registra v0 na 0.
Zamena instrukcija
Da biste zamenili instrukciju u smali kodu, pratite ove korake:
Pronađite instrukciju koju želite da zamenite.
Napišite smali kod za željenu instrukciju.
Zamenite postojeću instrukciju novom instrukcijom.
Sačuvajte izmene.
Na primer, ako želite da zamenite instrukciju koja proverava da li je broj jednak nuli, možete koristiti sledeći smali kod:
Ovaj kod će proveriti da li je vrednost u registru v0 jednaka nuli.
Veće promene
Pisanje logova
Preporuke:
Ako ćete koristiti deklarisane promenljive unutar funkcije (deklarisane v0,v1,v2...), stavite ove linije između .local <broj> i deklaracija promenljivih (const v0, 0x1)
Ako želite da ubacite kod za beleženje u sredinu koda funkcije:
Dodajte 2 broju deklarisanih promenljivih: Na primer, od .locals 10 do .locals 12
Nove promenljive treba da budu sledeći brojevi već deklarisanih promenljivih (u ovom primeru bi trebalo da budu v10 i v11, zapamtite da počinje od v0).
Promenite kod funkcije za beleženje i koristite v10 i v11 umesto v5 i v1.
Toastovanje
Ne zaboravite da dodate 3 broju .locals na početku funkcije.
Ovaj kod je pripremljen da se ubaci u sredinu funkcije (promenite broj promenljivih po potrebi). Uzeće vrednost this.o, pretvoriti je u String i zatim napraviti toast sa njenom vrednošću.
Last updated