Reversing ist kein Ponyhof - InterCafe RE II

Und weiter geht es ;-)

Mir ist in der Nacht die Idee gekommen, einfach per Reflexil die IL-Codes so umzubiegen, dass mir die geprüfte Serial in einer MessageBox ausgegeben wird. Auf diesen Patch möchte ich als erstes etwas genauer eingehen, damit nicht so erfahrene User auch etwas davon haben :)

Im Grunde geht es um diesen Teil des Sources:

for (int i = 1; i < 20; i++) // Das ganze 20 Mal
    {
        buffer[0] = (byte) i;
        string str5 = this.a("2q3D2e52qD25" + str + Convert.ToBase64String(buffer), true);
        MessageBox.Show("In Loop");
        if (A_1.Replace("-", null).ToUpper().Trim() == this.b(str2 + str3 + a.b(e) + str5, true).ToUpper())
        {
            return true; // Check ist erfolgreich
        }
    }
    return false; // Serial stimmt NICHT überein

Ich erwarte im folgenden übrigens, dass ihr grob wisst wie MSIL-Code funktioniert. ASM Kenntnisse sollten auch schon genug tun, die Kommentare werden alles weitere erklären. Die Prüfung der beiden Strings sieht also so aus:

       ; als erstes folgt der Code für A_1.Replace...
	85	ldarg.2 ; Wir laden A_1 auf den Stack (Index = this, 1 = A_0, 2 = A_1)
	86	ldstr	- ; Wir laden den String "-" auf den Stack
	91	ldnull	 ; Wir laden einen Nullstring auf den Stack
	92	callvirt	System.String System.String::Replace(System.String,System.String) ; Und schließlich wird die Funktion gecalled, das Ergebnis landet wieder auf dem Stack
	97	callvirt	System.String System.String::ToUpper() ; Vom Stack zu Upper zu Stack
	102	callvirt	System.String System.String::Trim() ; Von Stack durch Trim() zu Stack
 
; Nun haben wir also diesen modifizierten A_1-String auf dem Stack!
; Weiter geht es mit der this.b Funktion:
	107	ldarg.0	; this-Pointer auf den Stack
	108	ldloc.3	; Lokal Variable L_3 auf den Stack (String)
	109	ldloc.s	->; (4) V_4 (System.String) ; Lokale Variable L_4 auf den Stack
	111	ldsfld	System.Byte[] ht::e ; Dieses "Salt"-Byte-Array auf den Stack
	116	call	System.String ht/a::b(System.Byte[]) ; Und die HexToString()
	121	ldloc.s	->; (8) V_8 (System.String) ; L_8 auf den Stack
	123	call	System.String System.String::Concat(System.String,System.String,System.String,System.String)
; Hier werden die String auf den Stack zusammengefügt, das Resultat ist nur noch EIN String auf den Stack
	128	ldc.i4.1	; True wird auf den Stack geladen
	129	call	System.String ht::b(System.String,System.Boolean) ; Die Funktion mit String und True auf den Stack gecalled
	134	callvirt	System.String System.String::ToUpper() ; Die ToUpper()-Funktion drauf angewendet.
 
; Jetzt haben wir im Grunde nur noch 2 Strings auf dem Stack, und diese werden miteinander Vergleichen, das Resultat landet auf dem Stack :P
	139	call	System.Boolean System.String::op_Equality(System.String,System.String) ; Vergleiche
	144	stloc.s	->; (5) V_5 (System.Boolean) ; Store das Result in L_5
	146	ldloc.s	->; (5) V_5 (System.Boolean) ; lade das Result wieder auf den Stack
	148	brfalse.s	->; (70) ldloc.s -> (6) V_6 (System.Int32) ; Springe wenn FALSE
	150	br	->; (90) ldc.i4.1  ; Springe auf "Alles OK!"

Und hier ist der kleine Patch den ich Vorgenommen hab:

; Der Anfang ist bekannt ;-)
	148	call	System.String ht::b(System.String,System.Boolean)
	153	callvirt	System.String System.String::ToUpper()
; Wir haben das Resultat von ht::b auf dem Stack. Hier ist die Serial drin, auf die geprüft wird!
; Nun rufen wir eine MessageBox auf, die den obersten Wert vom Stack (die Serial) ausgibt.
	158	call	System.Windows.Forms.DialogResult System.Windows.Forms.MessageBox::Show(System.String)
; Da diese ein DialogResult zurückliefert, müssen wir den Stack noch durch ein "pop" bereinigen
	163	pop
; Nun laden wir einfach "test" auf den Stack, damit wird dann unser Code vergleichen
	164	ldstr	test
	169	call	System.Boolean System.String::op_Equality(System.String,System.String)

Als C#-Code sieht das ganze jetzt so gepatched aus:

        MessageBox.Show(this.b(str2 + str3 + a.b(e) + str5, true).ToUpper());
        if (A_1.Replace("-", null).ToUpper().Trim() == "test")
        {
            return true;
        }

Simple und trotzdem effektiv :D

Damit konnte ich Serials auslesen und vergleichen, und durch diese Resultate habe ich mir jetzt auch einen Keygen geschrieben. So kann ich jetzt also, ohne etwas zu patchen, diesen Test passen.

Doch die Überprüfung mit den Server steht noch aus. Ich dachte schon an einen Hook auf die Socket.Recieve-Funktion, aber das ganze ist ja auch noch verschlüsselt -.- Also weiter ab ins Klassengemenge!

Greez Easy

6 people like this post.

Andere Artikel zu dieser Serie

  1. Reversing ist kein Ponyhof – InterCafe RE IV
  2. Reversing ist kein Ponyhof – InterCafe RE III
  3. Reversing ist kein Ponyhof - InterCafe RE II (This post)
  4. Reversing ist kein Ponyhof - InterCafe RE
  1. Noch keine Kommentare vorhanden.

  1. Noch keine TrackBacks.


9 × = siebzig zwei