Android RE - Pool Master Pro
In diesem Post wird es um ein die Basics von Android Reverse Engineering gehen. Das Ziel ist eine Billiard-App namens “Pool Master Pro”. Dazu zunächst einmal ein Vorher/Nachher Bild:
Das Ziel ist es also, die relativ kurze “Aim Linie” zu verlängern, dass wir präzise über den ganzen Tisch zielen können.
Android basiert einer Java VM, und dies ist mehr oder wenig gut zu decompilieren. Dabei entpacken wir erst ein mal die APK (im Zip umbenennen) und sehen u.a. eine “.dex” Datei. Dort ist der komprimierte Source drin. Mit Hilfe des Tools Dex2Jar erzeugen wir uns eine einigermaßen lesbare .jar-Datei.
Allerdings gibt es auch ein weiteres Tool für Android De-und Recompiling names apktool. Dieses nette Tool entpackt alle Ressourcen, Decodiert das XML-Manifest und wandelt auch die .dex-Datei in eine Art Java-VM-Assembler (smali) um (wie bei .NET MSIL). Dieses werden wir nachher patchen. Aber zunächst zu der “Java-Analyse” dank JD-gui.
Die “Aim Line” ist im Optionsmenu an oder ausstellbar. Daher hat dort meine Analyse begonnen. Wir durchsuchen also den ganzen smali-Code nach dem String “Aim” und werden in der Main.smali fündig:
invoke-interface {v0, v1, v2}, Landroid/content/SharedPreferences$Editor;->putInt(Ljava/lang/String;I)Landroid/content/SharedPreferences$Editor; const-string v1, "ShowAimLine" iget-object v2, p0, Lcom/forthblue/pool/Main;->b:Lcom/forthblue/pool/a/p; iget-boolean v2, v2, Lcom/forthblue/pool/a/p;->i:Z
Anscheinend werden wohl die Setttigs geladen, dort die Varibale mit dem String “ShowAimLine” abgerufen und gespeichert. Die smali Syntax ist dabei ziemlich einfach:
iget-object/boolean [ZIEL], [OBJECT], [FELDREFERENZ/NAME].
p0 ist in diesem Fall ein “this-Pointer”, also ein Zeiger auf das Objekt selbst. Es wird also dieser Wert, ob die Aimline angezeigt werden soll oder nicht, in “Lcom/forthblue/pool/a/p;->i:Z” gespeichert. In Javacode sieht der Spass also so aus:
this.b.i = localSharedPreferences.getBoolean("ShowAimLine", false); |
Nun müssen wir “nur” suchen, wo diese Main-Klasse instanziert wird und wo dann im Anschluss auf diese Variable zugegriffen wird. In der “a/o.java” werden wir fündig, denn dies scheint eine Art GameManager-Klasse zu sein. Und eine da die Main-Klasse in der GameManager-Klasse “j” heißt, liefert eine Suche nach “j.b.i” (Also nach bDrawAimline) folgendes Resultat:
this.i = this.j.b.i; |
Mit dieser Variable können wir schon mehr anfangen. Denn diese wird in einer If-Clause geprüft:
if (this.i) // If AimLine { int i1 = this.e.e(); if (i1 == -1) break; com.forthblue.pool.c.e locale2 = this.e.f[i1]; float f8 = this.e.m + locale2.q * this.e.o; float f9 = this.e.n + locale2.r * this.e.p; float f10 = f8 - this.D.b(); float f11 = f9 - this.D.c(); float f12 = MathUtil.sqrt(f10 * f10 + f11 * f11); // Distanz berechnen (Phytagoras) float f13 = 1.3F * (f4 * (f10 / f12)); float f14 = 1.3F * (f4 * (f11 / f12)); this.C.b(true); this.C.a(f13 + f8, f14 + f9, f8 + f10 * 2.2F, f9 + 2.2F * f11); // Zeiche Aimline (float, float, float, float) } |
In der untersten Zeiele wird die Aimline über zwei Richtungsparameter (float f1 und float f2), sowie über die Länge der Aimline (float f3 und float f4) gezeichnet. Dabei fällt sofort die statische Variable 2.2F ins Auge, die wohl die Länge nochmal durchmultipliziert. Wenn diese verändert wird, verlängert sich auch die AimLine. Also ab geht es wieder in den smali-Code der a/o-Klasse. Diese hat nur einen “sqrt” Aufruf, daher finden wir die oben genannte Stelle sehr schnell:
add-float/2addr v6, v1 add-float/2addr v2, v0 const v7, 0x400ccccd // 2.2F mul-float/2addr v3, v7 add-float/2addr v1, v3 const v3, 0x400ccccd // 2.2F mul-float/2addr v3, v4 add-float/2addr v0, v3 invoke-virtual {v5, v6, v2, v1, v0}, Lcom/forthblue/pool/d/e;->a(FFFF)V
Diese beiden Hex-Werte ändern wir einfach auf 0x41a1999a, was etwa 20.2F entspricht.
Durch apktool können wir nun die ganzen decompilten Sachen wieder zu einer APK zusammenfügen. Nach dem Signieren mit einem TestKey ist diese bereit zur Installationen.
Greez Easy
Noch keine Kommentare vorhanden.