Flappy Bird - Innereien und Kollisionserkennung
Ohai zusammen,
es geht zur Abwechselung mal wieder um Android RE! Die letzen Stunden habe ich damit verbracht mich durch diverse IDEs zu schlagen, ein Ubuntu System aufzusetzen, nur um dann schlussendlich doch alles von Hand zu machen. Aber auf diesem Wege lernt man so einiges, dass ich gerne mit euch Teilen möchte.
Fangen wir mit dem Debugging von Android Applikationen/Spielen an: Wie aus den letzen Posts über Android bekannt ist, kann man per APKTool die App auseinander nehmen und sie im Anschluss wieder zusammensetzen. Ein Schalter, welcher dabei viel zu wenig Aufmerksamkeit bekommt ist der -d Switch. Dieser sorgt dafür, dass Debug Daten in die Smali-Dateien extrahiert und beim Builden (wieder mit dem -d Switch) so verlinkt werden, dass wir durch den Code steppen können (Im App Manifest debuggable=”true” setzen nicht vergessen!). Nun müssen wir “nur” noch ADB aktivieren, verbinden und DDMS (Dalvik Debug Montior) aufruften. Nun können wir mit einer IDE unserer Wahl den Debugger attachen und uns an Stacktraces, lokalen Variablen und Breakpoints erfreuen.
Flappy Bird, der neuste Hype auf Android und iOS Systemen, bringt einen nicht nur beim Reversen zur zur Verzweiflung. Durch Flügelschläge muss man in 8-Bit-Grafik einen Vogel durch einen Kurs fliegen und dabei jegliche Kollision vermeiden. Der Frustationsgrad, allerdings auch der Suchtfaktor, sind bei diesem Spiel enorm. Frustierend ist auch, dass APKTool Fehler beim Decoden mit Debugswitch auswirft, und wir somit auch wirkliches Debugging verzichten müssen. Und noch frustierender ist, dass mal wieder alle Typenbezeichner durch einzelne Buchstaben aus dem Alphabet ersetzt wurden. Aber einen “Vorteil” hat FlappyBird: Es setzt nicht auf nativen Grafik-Code, wie es andere Spiele tun (Code in Shared Libary = ELF Format auslagern). Das bedeutet: alles zeichnen und updaten geschieht von Java Code aus. Ausgelagerter Code wäre noch schwerer zu analysieren gewesen.