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
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
Andere Artikel zu dieser Serie
- Reversing ist kein Ponyhof – InterCafe RE IV (November 3, 2024)
- Reversing ist kein Ponyhof – InterCafe RE III (Juni 21, 2011)
- Reversing ist kein Ponyhof - InterCafe RE II (This post) (Juni 20, 2011)
- Reversing ist kein Ponyhof - InterCafe RE (Juni 19, 2011)
Noch keine Kommentare vorhanden.