Smali - Decompiling/[Modifying]/Compiling
Czasami interesujące jest zmodyfikowanie kodu aplikacji, aby uzyskać dostęp do ukrytych informacji (może to być dobrze zaszyfrowane hasła lub flagi). W takim przypadku warto zdekompilować plik apk, zmodyfikować kod i ponownie go skompilować.
Odwołanie do instrukcji: http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
Szybki sposób
Korzystając z Visual Studio Code i rozszerzenia APKLab, można automatycznie dekompilować, modyfikować, rekompilować, podpisać i zainstalować aplikację bez wykonywania żadnych poleceń.
Innym skryptem, który bardzo ułatwia to zadanie, jest https://github.com/ax/apk.sh
Dekompilacja APK
Korzystając z APKTool, można uzyskać dostęp do kodu smali i zasobów:
Jeśli apktool wyświetla jakikolwiek błąd, spróbuj zainstalować najnowszą wersję.
Niektóre interesujące pliki, na które powinieneś zwrócić uwagę, to:
res/values/strings.xml (oraz wszystkie xml-e wewnątrz res/values/*)
AndroidManifest.xml
Dowolny plik z rozszerzeniem .sqlite lub .db
Jeśli apktool
ma problemy z dekodowaniem aplikacji, zajrzyj na stronę https://ibotpeaches.github.io/Apktool/documentation/#framework-files lub spróbuj użyć argumentu -r
(Nie dekoduj zasobów). Wtedy, jeśli problem występował w zasobie, a nie w kodzie źródłowym, nie będziesz mieć tego problemu (nie zdekodujesz również zasobów).
Zmiana kodu smali
Możesz zmieniać instrukcje, zmieniać wartość niektórych zmiennych lub dodawać nowe instrukcje. Ja zmieniam kod Smali za pomocą VS Code, następnie instalujesz rozszerzenie smalise i edytor powie Ci, czy któraś instrukcja jest niepoprawna. Kilka przykładów można znaleźć tutaj:
Możesz również sprawdzić poniżej wyjaśnienia niektórych zmian w Smali.
Ponowne skompilowanie APK
Po zmodyfikowaniu kodu możesz ponownie skompilować kod za pomocą:
Skompiluje nowy plik APK wewnątrz folderu dist.
Jeśli apktool wygeneruje błąd, spróbuj zainstalować najnowszą wersję.
Podpisz nowy plik APK
Następnie musisz wygenerować klucz (zostaniesz poproszony o hasło i pewne informacje, które możesz wypełnić losowo):
W końcu, podpisz nowy plik APK:
Optymalizacja nowej aplikacji
zipalign to narzędzie do wyrównywania archiwów, które zapewnia ważne optymalizacje plików aplikacji Android (APK). Więcej informacji tutaj.
Podpisz nowy APK (ponownie?)
Jeśli wolisz używać apksigner zamiast jarsigner, powinieneś podpisać apk po zastosowaniu optymalizacji za pomocą zipalign. ALE ZWRÓĆ UWAGĘ, ŻE MUSISZ PODPISAĆ APLIKACJĘ TYLKO RAZ Z jarsigner (przed zipalign) LUB Z aspsigner (po zipalign).
Modyfikowanie Smali
Dla następującego kodu Hello World w języku Java:
Kod Smali będzie wyglądał następująco:
Zestaw instrukcji Smali jest dostępny tutaj.
Lekkie zmiany
Modyfikowanie początkowych wartości zmiennej wewnątrz funkcji
Niektóre zmienne są definiowane na początku funkcji za pomocą opcode'u const, możesz zmieniać ich wartości lub definiować nowe:
Podstawowe operacje
Tworzenie nowej klasy
Aby utworzyć nową klasę w pliku Smali, należy utworzyć nowy plik o rozszerzeniu .smali
i umieścić go w odpowiednim katalogu zgodnie z hierarchią pakietów. Następnie należy zdefiniować nazwę klasy, używając dyrektywy .class
i określić dziedziczenie, jeśli jest to konieczne, za pomocą dyrektywy .super
.
Przykład:
Dodawanie pól
Aby dodać pole do klasy, należy użyć dyrektywy .field
i określić modyfikatory dostępu, typ pola oraz jego nazwę.
Przykład:
Dodawanie metod
Aby dodać metodę do klasy, należy użyć dyrektywy .method
i określić modyfikatory dostępu, typ zwracany, nazwę metody oraz listę argumentów. Następnie należy zdefiniować ciało metody, używając instrukcji Smali.
Przykład:
Dodawanie instrukcji
Aby dodać instrukcję do metody, należy użyć odpowiedniej instrukcji Smali, takiej jak move
, add-int
, invoke-static
, itp. Instrukcje Smali są podobne do instrukcji Javy, ale mają nieco inną składnię.
Przykład:
Modyfikowanie istniejących instrukcji
Aby zmodyfikować istniejącą instrukcję w metodzie, należy znaleźć odpowiednią instrukcję w pliku Smali i zmienić jej argumenty lub operacje. Można to zrobić, edytując plik Smali ręcznie lub za pomocą narzędzi do automatycznego modyfikowania plików Smali.
Przykład:
Usuwanie instrukcji
Aby usunąć instrukcję z metody, należy znaleźć odpowiednią instrukcję w pliku Smali i usunąć ją. Można to zrobić, edytując plik Smali ręcznie lub za pomocą narzędzi do automatycznego modyfikowania plików Smali.
Przykład:
Dodawanie adnotacji
Aby dodać adnotację do klasy, pola lub metody, należy użyć dyrektywy .annotation
i określić typ adnotacji oraz jej parametry.
Przykład:
Większe zmiany
Rejestrowanie działań
Rekomendacje:
Jeśli zamierzasz używać zadeklarowanych zmiennych wewnątrz funkcji (zadeklarowane v0,v1,v2...), umieść te linie między .local <number> a deklaracjami zmiennych (const v0, 0x1)
Jeśli chcesz umieścić kod logowania w środku kodu funkcji:
Dodaj 2 do liczby zadeklarowanych zmiennych: np. z .locals 10 na .locals 12
Nowe zmienne powinny mieć kolejne numery po już zadeklarowanych zmiennych (w tym przykładzie powinny to być v10 i v11, pamiętaj, że zaczynamy od v0).
Zmień kod funkcji logowania i użyj v10 i v11 zamiast v5 i v1.
Toastowanie
Pamiętaj, aby dodać 3 do liczby .locals na początku funkcji.
Ten kod jest przygotowany do wstawienia w środku funkcji (zmień liczbę zmiennych według potrzeb). Będzie on pobierał wartość this.o, przekształcał ją na String i następnie wyświetlał tost z jej wartością.
Last updated