Jump to content
Melde dich an, um diesem Inhalt zu folgen  
Stefan Gündhör

Grober Leitfaden .smali Bytecode / .APK app "hacking"

Recommended Posts

Stefan Gündhör

Mit "Hacking" ist Modifizierung der .APK Apps und auch .jar Files gemeint. Vor allem Modifizierung der Funktionalität und des Programmablaufs, ohne dabei den Quellcode der App zu kennen.

Mein Leitfaden geht nicht zu sehr ins Detail, wer es wirklich lernen will, muss sich intensiv im Selbststudium damit beschäftigen.

Edit: Sehe auch grade es gibt schon ein sehr nettes, themenähnliches Tutorial, das sehr ins Detail geht: https://www.handy-faq.de/forum/android_entwickler_developer_forum/251373-anleitung_dekompilieren_decompile_apk.html

---

Was du brauchst:

  1. Apktool (wandelt eine .apk in bearbeitbare .smali bytecode Klassen und veränderbare Resourcen-Dateien um und kann daraus wieder eine .apk erstellen): https://code.google.com/p/android-apktool/
  2. dex2jar (wandelt .dex in Java .jar um): https://code.google.com/p/dex2jar/
  3. JD-GUI (Java Decompiler): https://java.decompiler.free.fr/?q=jdgui
  4. 7Zip Packprogramm (auch wenn du schon einen anderen Packer hast): https://www.7-zip.org/

Mach dich unbedingt erstmal mit den 4 Tools vertraut. Die sind gar nicht schwer zu bedienen, z.B.

apktool d LGHome2.apk lghome2
um den modifizierbaren Bytecode der apk und die Resourcen in den Ordner "lghome2" zu entpacken (wird automatisch angelegt). In ./lghome2/smali/ befinden sich dann die ganzen Bytecode-Dateien, die du verändern und damit die APK hacken kannst.

apktool b lghome2 LGHome2_Modded_Unsigned.apk
würde dann aus dem modifizierten Bytecode und Resourcen (du kannst ja auch die Bilder/Logos/Buttons einer App verändern -> Theming) wieder eine .apk generiert.

ACHTUNG: diese .apk ist unsigniert

Deshalb nochmal von vorne: wofür brauchst du was?:

  • das apktool nimmst du, um die .apks, also die apps (bzw. deren Bytecode) zu modifizieren. auch die framework.jar wird damit modifiziert, es muss also nicht unbedingt eine .apk sein. Wichtig ist nur, dass die Datei die du modifizieren willst, wenn du sie mit 7Zip öffnest, eine Datei "classes.dex" enthält. .APKs und .JARs sind alles nur ZIP Archive in Wirklichkeit, du kannst mit 7Zip gucken was drinnen ist.
    Wenn eine "classes.dex" sich darin befindet, weißt du dass du Bytecode modifizieren/hacken kannst, da sich der gesamte .smali Bytecode einer App in der classes.dex befindet. Allerdings unleserlich, weshalb es das apktool gibt, das automatisch die .APK oder .jar aufmacht und aus der classes.dex die gesamten .smali Bytecode-Dateien extrahiert.
    Was hast du dann, wenn du ein Ordnerstruktur voller .smali Dateien hast? Du kannst dir die .smali Dateien als Java Klassen vorstellen, also als deinen Quellcode der App, den du dann beliebig verändern kannst. Das Problem ist nur, dass Bytecode nicht so gut leserlich ist wie z.B. Java Quellcode. Aber das ist jetzt erstmal egal.
    Du nimmst also das apktool, um aus einer .apk alle .smali Dateien zur Modifizierung rauszuholen und danach daraus wieder eine .apk zu erstellen.
  • Wofür nun 7Zip im Speziellen? Also, angenommen du hast den LG Home 2 Launcher bearbeitet, also zuerst mit dem apktool die .smali files und die Resourcen (Bilder,...) aus der LGHome2.apk in einen beliebigen Ordner extrahiert und danach auch diesem Ordner mit dem apktool eine LGHome2_bearbeitet.apk generiert (nachdem du deine Änderungen am Bytecode vorgenommen hast), dann hast du ein kleines Problem: Android Apps sind immer signiert, die neue App "LGHome2_bearbeitet.apk" hat keine Signatur, deshalb wird Android sie nicht annehmen.

    • Lösung 1: wenn du nur .smali Dateien verändert hast, öffne die originale LGHome2.apk mit 7zip, parallel die LGHome2_bearbeitet.apk und ziehe NUR die classes.dex der neueren .apk in die originale .apk -- Verwende im weiteren Verlauf dann die originale .apk, die nun deine Modifikationen und immer noch ihre Signatur hat. Diese Prozedur klappt nicht mit allen Packprogrammen, ohne die Signatur zu verlieren, nimm deshalb 7zip.
    • Lösung 2: wenn du auch Resourcen verändert hast oder direkt die neue Datei verändern willst oder die Install aus sonstigen Gründen nicht klappt, lade die neue App auf deine Phone-SD, lade aus dem Market die App "Zipsigner2" und signiere deine App mit dem Key "Plattform" - falls es nicht installiert dann signiere sie mit dem "shared" key.

    [*]Wofür dex2jar und JD-GUI? Beide ermöglichen es dir, etwas zu schummeln. .smali Bytecode zu lesen (Programmablauf verstehen) ist sau schwer, deshalb hier ein Hilfsmittel: hol die classes.dex aus der .apk die du grade bearbeitest selbst raus (mit 7zip), wandle sie mittels dex2jar in "classes-dex2jar.jar" um

./dex2jar.sh classes.dex (oder so ähnlich, je nach Betriebssystem unterschiedlich, siehe Dokumentation) 

und öffne diese .jar Datei dann mit dem Programm JD-GUI. Das bringt dir einen "geilen" Vorteil: JD-GUI zeigt dir nun anstatt .smali Dateien .java Dateien, welche viel einfacher zu lesen sind und funktional in etwa dem Bytecode und dem realen Programmablauf entsprechen. Du erhältst damit also Einblick in den fast echten Quellcode der App. "Fast" deshalb weil nicht alles rekonstruiert werden kann und auch nicht alles korrekt oder genau so wie es in echt programmiert wurde, ABER es hilft dir, die Stellen im .smali Code ausfindig zu machen, die du für den Tweak, den du machen willst, brauchst.

Du kannst den Java-Code nicht wieder zu smali oder dex umwandeln, er dient nur zur Orientierung und Hilfestellung, wie eine Landkarte und ein Spickzettel.

Tipp: Wenn du eine modifizierte App im laufenden Betrieb aufspielen willst, lösche zuerst die alte mit dem File Explorer aus Android und kopiere dann erst die neue - NICHT Datei ersetzen wählen, das klappt nicht ohne Neustart.

Tipp 2: Wenn du .smali modifizierst: Vieles kannst du schon durch Löschen einzelner Zeilen erreichen. Z.B. das Löschen von Zeilen, die die Log-Funktion des Systems aufrufen, um z.B. Log-Spamming zu mindern. Gib nur Acht, ob du nicht mehr zeilen löschen oder verändern musst, sieh vorher nach, ob andere Zeilen von der, die du veränderst abhängig sind, ODER ob die Zeile, die du veränderst, Teil eines Befehls ist, der sich über mehrere Zeilen erstreckt -> Gibt es auch!!

z.B. String s = System.properties.get(blub);

wären in smali 3 oder mehr Zeilen.

Also merke: 1 Zeile Java = >= 1 Zeile .smali Bytecode

Tipp 3: Achte im smali code auf die Methodenköpfe (dort wo die Methoden anfangen) -> da steht oft die Anzahl der lokalen Variablen, die verwendet wird in der Methode, wenn du also eine entfernst oder hinzufügst, musst du die Anzahl mit ändern, sonst gibts nen Fehler.

Tipp 4: Wenn im Smali Code eine Variable angelegt wurde, die später an einen Methodenaufruf weitergegeben wird, und du nur verhindern möchtest, dass diese Methode aufgerufen wird, so reicht es, wenn du die eine Zeile mit dem Methodenaufruf (und vl. das wo Rückgabewerte verarbeitet werden, falls vorhanden) löscht, du musst dazu nicht auch die Variable entfernen! Sie wird dann zwar nie verwendet, aber du sparst dir Arbeit (z.B. Methodenkopf), indem du immer nur so viel entfernst wie nötig, um das zu erreichen was du willst (Methodenaufruf verhindern).

Tipp 5: Wenn du nach deinen Modifikationen mit dem apktool keine apk mehr erstellen kannst, hast du im Smali Code etwas verbuggt. Das apktool sagt dir nicht genau, was, aber du kannst mit dem Programm "smali" ( https://code.google.com/p/smali/ ) manuell versuchen, deinen Ordner mit dem smali-Dateien (NUR diesen also /extrahierteAPK/smali ) zu einer .dex zu generieren, was auch wieder nicht klappen wird, ABER diessmal wirst du eine genaue Fehlermeldung erhalten, WO und in WELCHER .smali Datei du einen Fehler eingebaut hat, der die Erstellung der .dex verhindert.

Gutes Gelingen ;):icon_chee

Durchführung des Leitfadens auf eigene Gefahr und Verantwortung. Keine Support-Anfragen.

bearbeitet von Stefan Gündhör
  • Like 3

Diesen Beitrag teilen


Link zum Beitrag
Meishere

Schönes, knappes Tutorial... Es gibt zwar (wie du schon gesagt hast) schon ein sehr ausführliches, aber das hier ist mit Sicherheit besser, wenn man sich schon ein bisschen auskennt und nurmal kurz grob nachgucken muss, was man an einer bestimmten Stelle machen musste :-)

Und außerdem haucht jeder neue Thread dem Entwickler-Bereich hier ein bisschen mehr Leben ein :icon_chee

Wenn ich jetzt den Danke-Button finden würde, dann würde ich auch draufklicken O.o Aber irgendwie seh ich den nicht... Bi ich blind? :icon_chee

Ja, hat sich erledigt... Das große rote blinkende Ding war dann im Nachhinein gar nicht so schwer zu finden :D

  • Like 1

Diesen Beitrag teilen


Link zum Beitrag
Thyrius

uih juih juhi... noch mehr Input... Mann, soviele kalte Winterabende kanns erstmal garnet geben, wie ich Zeugs zu durcharbeiten habe... hehe

Diesen Beitrag teilen


Link zum Beitrag
storage87

Nett gemacht, hätte ich vor 2 Monaten mal gebrauchen können so habe ich es mir selber zusammen getragen.

Ich habe jetzt bei cm10 auch probiert die Framework.jar zu editieren um wieder Stock Mounts der SD zu machen, aber bekomme da dann leider ne Bootschleife da ja auch Kernel Files ändern musste wie z.B. "init.cm-star" dort werden nämlich die Orner für die SD angelegt und der Symlink.

Diesen Beitrag teilen


Link zum Beitrag

Please sign in to comment

You will be able to leave a comment after signing in



Jetzt anmelden
Melde dich an, um diesem Inhalt zu folgen  

×
×
  • Neu erstellen...

Wichtige Information

Bitte beachten Sie folgende Informationen: Nutzungsbedingungen und Impressum & Datenschutzerklärung. Wir haben Cookies auf deinem Gerät platziert, um die Bedienung dieser Website zu verbessern. Du kannst deine Cookie-Einstellungen anpassen, andernfalls gehen wir davon aus, dass Du damit einverstanden bist.