World Conqueror 2 - IAP Purchase Hack

Gab schon lange nichts mehr zu Android RE, das muss sich ändern ;) Ein guter Freund fragte mich nach einem Hack für das Androidspiel World Conqueror 2. Über das Spiel selbst kann ich euch nichts erzählen, dann ich hab es bisher nicht gespielt. Wichtig ist nur, dass es Medallien gibt die man per “In App Purchase” (IAP) kaufen kann. Mit diesen Medallien kann man sich Abzeichen kaufen, welche wiederrum Boni auf Rohstoffe und Kampfeinheiten geben. Ohne diese Boni ist das Spiel irgendwann nicht mehr zu schaffen, das typische Free-To-Play and Pay-To-Win Prinzip. Aber wir schaffen uns heute Abhilfe.

Screenshot_2015-01-01-18-59-12

Wir decompilen die App gewohnt mit Apktool und Dex2Jar und stellen fest, dass das eigentliche Spiel in nativem Code vorliegt. Für uns heißt das mehr Arbeit, natives Debugging und stundenlange Suche in ARM-Opcodes. Aber zum Glück gibt es eine Schnittstelle des nativen Programmes zu dem einfach zu analysierenden Java-Code. Denn die Google-Käufe werden natürlich über normales Java abgewickelt und müssen dann ihren Weg in die native Bibliothek finden. Dazu finden sich folgende Funktionen im Java-Code:

private static native void AddMedal(int paramInt);
private static native void CallNativeError();
private static native void CallNativeExit();
public static void DeviceNotMatch();
// *Snip*
public static native void PurchaseSuccess(int paramInt);

Das “native”-Schlüsselwort sagt dabei, dass sich die Funktion nicht im Java-Code befindet, sondern in einer nativen Bibliothek zu finden ist. Wenn wir diese mit IDA Pro öffnen, finden wir u.a. folgenden Code:

void __usercall Java_com_easytech_wc2_Wc2Activity_PurchaseSuccess(int ebx0)
{
        sub_45791();
        ecPurchasedProduct(ebx0 + 1198398);
}

Der Name ist dabei nicht willkürlich, sondern muss exakt dem Java-Klassennamen und Namespace entsprechen. Wenn wir die PurchaseSuccess-Funktion aufrufen könnten wäre das doch schon ein Erfolg! Nur, wo macht man sowas gescheit? Hierzu bieten sich immer kleine Buttons an, die zum Beispiel Webseiten öffnen. Exakt ein solcher Button befindet sich im Hauptmenü unten links, über welchen man auf die Homepage des Entwicklerstudios kommt. Der Button selbst ist in Java definiert und hat folgenden Code beim Click-Event:

public static void showWebsite(String paramString)
  {
    Intent localIntent = new Intent();
    localIntent.setAction("android.intent.action.VIEW");
    localIntent.setData(Uri.parse(paramString));
    Main_context.startActivity(localIntent);
  }

Patchen wir doch das öffnen der Website raus und fügen einen Funktionsaufruf zu der Funktion “PurchaseSuccess” ein! Also schnell in den SMALI-Code gewechselt und dort die Funktion “showWebsite” gefunden. Hier die letzten Zeilen:

move-result-object v0
.line 370
.local v0, "content_url":Landroid/net/Uri;
invoke-virtual {v1, v0}, Landroid/content/Intent;->setData(Landroid/net/Uri;)Landroid/content/Intent;
.line 371
sget-object v2, Lcom/easytech/wc2/Wc2Activity;->Main_context:Landroid/content/Context;
invoke-virtual {v2, v1}, Landroid/content/Context;->startActivity(Landroid/content/Intent;)V

Über ein # fügen wir einen Kommentar vor dem Aufruf von “startActivity”. Damit hätten wir den ersten Teil, das öffnen der Website, erledigt. Nun müssen wir noch den Funktionsaufruf einfügen. Die Funktion “PurchaseSuccess” nimmt einen Integer entgegeben, also wird das wohl der Einkaufstyp sein. Ich spekuliere einfach mal auf den Typ 3. Es gibt 4 verschiedene Pakete zu kaufen, daher werde ich mit 3 wohl sicher eins erwischen. Laden wir also eine 3 in die Variable und rufen auf:

const v0, 0x3
invoke-static {v0}, Lcom/easytech/wc2/Wc2Activity;->PurchaseSuccess(I)V

Nun erstellen wir mittels apktool wieder eine Android-Installationsdatei und signieren sie mit einem Zip-Signer. Eigentlich ist es üblich, dass die eine gepatchte Applikation sofort wieder abstürzt weil man irgend einen Fehler eingebaut hat. Aber in diesem Fall haben wir alles richtig gemacht und das mehrfache Klicken auf den Website-Öffnen Button lässt unser Medallienkonto explodieren. Yay! ;)

4 people like this post.
    • MrTorgue
    • 4. Jan. 2015 11:06pm

    Oder einfach Freedom / Lucky Patcher nutzen :)
    Aber sehr interessanter Blog, den du da hastm vor Allem fuer nen Anfaenger wie mich ^^
    Freu mich schon auf mehr :D

      • Easysurfer
      • 5. Jan. 2015 10:13am

      Da hast Du sehr wohl recht, die beiden genannten Programme laufen aber nur mit einem gerooteten Android. Da das Smartphone von meinem Kumpel nicht gerootet war, wurde also gepatched :)
      Freut mich wenns Dir gefällt, wenn Du irgendwelche Themenwünsche/Appwünsche hast, lass es mich wissen!

        • MrTorgue
        • 5. Jan. 2015 7:06pm

        Zur Zeit nichts, aber ich werd drauf zurueckkommen, sollte es da was geben :)
        Hab diesen Blog erst vor Kurzem gefunden und lese mich noch ein, da mir oft langweilig ist und ich grad dabei bin, mich in derartige Themen einzulernen, hoffe ich, das da noch einiges kommen wird! :D

        Gruss

  1. Noch keine TrackBacks.