Krgging Tutorial 1
~~~~~~~~~~~~~~~~~~~


Author:        Muffty 
Datum:         3.11.1999
Ziel:          Opera 3.60
URL:           http://www.opera.com
Protection:    Serial
Werkzeug:      Softice 4.0
Schwierigkeit: mittel


Meine Meinung ber das Programm:
""""""""""""""""""""""""""""""""

Opera ? Das soll ein guter Webbrowser sein ? Das dachte ich mir, als ich 
das erste mal davon hrte. Ich lud ihn herunter und mu sagen, da dieser
kleine Webbrowser es wirklich in sich hat. Er ist um einiges schneller wie
die bekannten Mie und Nsc Browser. Das einzige was ein wenig strt ist, das
es manchmal zu Darstellungsproblemen bei Javascript kommt. Ansonsten bin ich
hellauf begeistert.


Anmerkung:
""""""""""

Ich werde in diesem Tutorial KEINE vollstndige Seriennummer angeben.
Mehr oder minder werden die logischen Schritte um den Programmablauf 
zu verstehen erklrt, um eine Seriennummer zu bekommen.
Ich werde NICHT erklren wie ihr einen bpx hmemcpy setzt, oder wie
ihr das Flag ndern knnt. Ihr mt also mit Sice schon ein wenig
vertraut sein.... 


Das Tutorial:
"""""""""""""

Im Registrierungsfenster entscheide ich mich fr:

Muffty
n/a
1111111111

Nachdem ihr einen Breakpoint auf hmemcpy gesetzt habt solltet ihr ungefhr an dieser Stelle sein.



* Reference To: USER32.GetDlgItemTextA, Ord:0104h
                                  |
:00491EA1 8B3D10654F00            mov edi, dword ptr [004F6510]
:00491EA7 BB2B010000              mov ebx, 0000012B
:00491EAC 53                      push ebx
:00491EAD 8D8638010000            lea eax, dword ptr [esi+00000138]
:00491EB3 50                      push eax

* Possible Reference to Dialog: SERNO_REGISTER, CONTROL_ID:2BBA, ""
                                  |
:00491EB4 68BA2B0000              push 00002BBA
:00491EB9 55                      push ebp
:00491EBA FFD7                    call edi
:00491EBC 53                      push ebx
:00491EBD 8D8664020000            lea eax, dword ptr [esi+00000264]
:00491EC3 50                      push eax

* Possible Reference to Dialog: SERNO_REGISTER, CONTROL_ID:2BBB, ""
                                  |
:00491EC4 68BB2B0000              push 00002BBB
:00491EC9 55                      push ebp
:00491ECA FFD7                    call edi
:00491ECC 53                      push ebx
:00491ECD 8D8690030000            lea eax, dword ptr [esi+00000390]
:00491ED3 50                      push eax

* Possible Reference to Dialog: SERNO_REGISTER, CONTROL_ID:2BBC, ""
                                  |
:00491ED4 68BC2B0000              push 00002BBC
:00491ED9 55                      push ebp
:00491EDA FFD7                    call edi
:00491EDC 5F                      pop edi
:00491EDD 5D                      pop ebp
:00491EDE 5B                      pop ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00491E98(C)
|
:00491EDF 56                      push esi
:00491EE0 6A00                    push 00000000
:00491EE2 68A2900000              push 000090A2
:00491EE7 E8053BF9FF              call 004259F1              // sieht vielversprechend aus
:00491EEC 83C40C                  add esp, 0000000C
:00491EEF 8BC6                    mov eax, esi
:00491EF1 5E                      pop esi
:00491EF2 C3                      ret


Im oberen Teil passiert nicht recht viel interessantes, nur ein paar Kopier- und Verschiebe Aktionen.
Was fr uns interessant ist, ist der <call 004259F1>. Wenn ihr ber diesen call drber traced, kommt
ihr zu einem <end dialog> Aufruf. Da wollen wir aber nicht hin. Also liegt es nahe in den call 004259F1
hineinzugehen. Dann solltet ihr folgenden Code vor euren Augen haben:


:004259F1 55                      push ebp
:004259F2 8BEC                    mov ebp, esp
:004259F4 83EC1C                  sub esp, 0000001C
:004259F7 8B4508                  mov eax, dword ptr [ebp+08]
:004259FA 8945E8                  mov dword ptr [ebp-18], eax
:004259FD 8B450C                  mov eax, dword ptr [ebp+0C]
:00425A00 8945EC                  mov dword ptr [ebp-14], eax
:00425A03 8B4510                  mov eax, dword ptr [ebp+10]
:00425A06 8945F0                  mov dword ptr [ebp-10], eax
:00425A09 8D45E4                  lea eax, dword ptr [ebp-1C]
:00425A0C 50                      push eax                        // hier einen bpx setzen
:00425A0D 68215A4200              push 00425A21                   // fllt euch was auf ?

:00425A12 FF153C624F00            Call dword ptr [004F623C]       // immer noch nicht ?
:00425A18 50                      push eax


Hier seht ihr nun den ersten Knackpunkt, bei dem wir ein wenig logisch denken mssen.
Leider sieht man nicht die beiden Aufrufe "getcurrentthreadId" und "enumchildwindow".
Dafr sieht man mit Wdasm das diese Stelle fters aufgerufen wird.
Als erstes bin ich in den <getcurrentthreadId> hineingegangen, was allerdings nicht 
recht viel gebracht hatte...in dem <enumchildwindow> geht es dann erst richtig ab:
Man sieht viele Stellen die oftmals genauso aussehen wie der obrige Codeteil und es 
auch teilweise wirklich sind (achtet auf die Addressen). Hier findet die Seriennummerberechnung statt, soviel steht fest. Aber wie bekomme ich sie nun ? Soll ich mich dmlich tracen und jeden call
abchecken ? Nein ! Da wir ja wissen das diese Stelle fters gecallt wird und wir am Anfang der 
Prozedur der Seriennummerberechnung sind, lassen wir das Programm einfach einen "Zyklus" abarbeiten.  

Wir verfahren wie folgt:
Setzt einen bpx auf die Addresse wie oben gezeigt. Dann drckt einfach 1x F5.
Voil, mit einem d eax steht im datawindow unsere eingegebene Serial und die vermeintlich richtige.
Bei mir ist das die 1111Esss9yaM.(achtet darauf das die ersten 4 Zeichen sich nicht verndert haben)
Yep, die Nummer mal eben eingegeben und .... shit: Es kommt die Fehlermeldung das wir evtl. einen
Prventivcode eingegeben haben ...usw.

Tja, wir wissen nun das unsere eingegebene Serial nicht vollstndig ist :)
Um Logikfehler auszuschlieen, z.B. das die restliche Zeichenkombination auf der vorangegangen basiert,
arbeite ich jetzt mit der Seriennummer 1111Esss9yaM1111 weiter.
Ich wiederhole alle Schritte bis hierhin.
Wenn ihr nun weiter traced kommt ihr diesmal nicht zu dem <enddialog> Aufruf.(ihr errinnert euch ?)
Sondern solltet hier landen:


:00488D96 E856CCF9FF              call 004259F1
:00488D9B 83C40C                  add esp, 0000000C
:00488D9E E907020000              jmp 00488FAA 


Dazu gibt es nicht recht viel zu sagen. Ihr werdet nun recht viele ret's abarbeiten mssen und euch
nicht vom Weg abbringen lassen. In eurem Hinterkopf mt ihr bedenken das der <call 004259F1> zum 
Berechnen des ersten Teils der Seriennummer da ist. Nach einigem herumfluchen habt ihr vielleicht 
diesen Code vor euch:


:004886A2 FF7514                  push [ebp+14]
:004886A5 FF7510                  push [ebp+10]
:004886A8 E8A7440300              call 004BCB54               // 2. Teil der Seriennummernberechnung
:004886AD 59                      pop ecx
:004886AE 59                      pop ecx
:004886AF EB59                    jmp 0048870A


Ja, der einzige anders aussehende call bevor ich zu der Fehlermeldung komme ist dieser.
Also sehen wir uns diesen call einmal nher an.....(F8)



:004BCB54 55                      push ebp
:004BCB55 8BEC                    mov ebp, esp
:004BCB57 51                      push ecx
:004BCB58 53                      push ebx
:004BCB59 56                      push esi
:004BCB5A 8B750C                  mov esi, dword ptr [ebp+0C]
:004BCB5D 33DB                    xor ebx, ebx
:004BCB5F 3BF3                    cmp esi, ebx
:004BCB61 895DFC                  mov dword ptr [ebp-04], ebx
:004BCB64 7455                    je 004BCBBB
:004BCB66 391E                    cmp dword ptr [esi], ebx
:004BCB68 57                      push edi
:004BCB69 7548                    jne 004BCBB3                          // fucking bad guy
:004BCB6B 8DBE90030000            lea edi, dword ptr [esi+00000390]
:004BCB71 57                      push edi
:004BCB72 E8C99C0200              call 004E6840
:004BCB77 83F80C                  cmp eax, 0000000C
:004BCB7A 59                      pop ecx
:004BCB7B 7E36                    jle 004BCBB3                          // bad guy
:004BCB7D 83F840                  cmp eax, 00000040
:004BCB80 7D31                    jge 004BCBB3                          // bad guy
:004BCB82 8D45FC                  lea eax, dword ptr [ebp-04]
:004BCB85 50                      push eax
:004BCB86 57                      push edi
:004BCB87 E88B54FDFF              call 00492017                         // kewl :)
:004BCB8C 8BD8                    mov ebx, eax                          // ???
:004BCB8E 85DB                    test ebx, ebx
:004BCB90 59                      pop ecx
:004BCB91 59                      pop ecx
:004BCB92 741F                    je 004BCBB3                           // bad guy
:004BCB94 A11C175100              mov eax, dword ptr [0051171C]
:004BCB99 85C0                    test eax, eax
:004BCB9B 7416                    je 004BCBB3                           // bad guy
:004BCB9D 57                      push edi
:004BCB9E 8D8E64020000            lea ecx, dword ptr [esi+00000264]
:004BCBA4 51                      push ecx
:004BCBA5 8D8E38010000            lea ecx, dword ptr [esi+00000138]
:004BCBAB 51                      push ecx
:004BCBAC 8B08                    mov ecx, dword ptr [eax]
:004BCBAE E8A0060000              call 004BD253



Nun, es ist wieder Zeit zum logischen Denken. Jedem sticht natrlich folgendes sofort ins Auge:



:004BCB87 E88B54FDFF              call 00492017                         // kewl :)
:004BCB8C 8BD8                    mov ebx, eax                          // ???
:004BCB8E 85DB                    test ebx, ebx


Nachdem ich die Flags gendert hatte und mir die Serial bei mov ebx, eax erhofft hatte aber nichts
fand mute ich mir wohl aus dem obrigen Code etwas zusammenreimen...


Kleine Zusammenfassung:
"""""""""""""""""""""""

Wir wissen:

1. Die Serial ist lnger als 12 Zeichen.
2. Die Seriennummer berechnet sich aus den ersten 4 eingegebenen Zeichen.
3. Im obrigen Code ist 1 cmp das ich nicht eindeutig identifizieren kann ;)
4. Nachdem wir im obrigen Code alles gedumpt haben was geht, stoen wir im Datenfenster auf    Buchstaben.
5. Die Seriennummer ist unabhngig von Namen/Organisation


Weiter mit logischem Denken und probieren :)
Welche Mglichkeiten bieten sich bei der Seriennummerberechnung ?
Knnte es sein das verglichen wird ob der Anfang der eingegebenen Serial ein Buchstabe ist ?
Ich probiere das aus und gebe als Seriennummer ein a111111111111111, doch leider immer noch nichts.
Hmmm, vielleicht ein Grobuchstabe ? Testen. Ich gebe ein C1111111111111111 und gehe alle Schritte
wie oben beschrieben nocheinmal durch. Verget nicht jedesmal das Flag bei der Addresse 004BCB69 jne
zu ndern. Ja, und es scheint als htten wir diesmal die richtige Seriennummer bei meiner schon vorher 
vermuteten Addresse 004BCB8C  mov ebx, eax. (d edx)       
In meinem Fall war es C111V4CG3MbFa5b72838XX. Die 2 X stellen die restlichen Zeichen der Seriennummer dar.
Ihr errinert euch ? Am Anfang des Tutorials habe ich geschrieben das ich keine vollstndige Nummer angebe.



Schluwort:
~~~~~~~~~~~


Das Ende ist nah. 
Ich wei das es sehr wahrscheinlich nicht jeder Newbie nachvollziehen kann, da ich nicht jeden
Schritt explizit aufgefhrt habe. Aber ich wollte ein Tutorial schreiben das ein wenig schwieriger
ist als die grobe Masse. Ich hoffe das all diejenigen die es nicht geschafft haben mir vergeben mgen,
oder es solange probieren bis sie es checken. Als kleiner Tip: Haltet euch nicht sinnlos in Codeabschnitten
auf von denen ihr nicht sicher wit was hier passiert. Geht einfach mal fters ber das Programm "grob"
durch, damit ihr versteht wie das Programm luft und was gerade geschieht.
Tja, nun kann ich nur noch hoffen das euch das Tutorial ein wenig gefallen hat und ihr ein wenig gelernt
habt, so wie ich.

Falls ihr Fragen bezglich des Tutorials habt -->  muffty@gmx.de

Bitte keine Fragen ber die Handhabung von Sice, oder irgendwelche Crackrequests.




Gre an :   alle NeuRoM@nCerZ, Torn@do, Sandman 
~~~~~~~~~~
             um Zeit zu sparen alle guten Crackergruppen und jene die gute Tutorials schreiben
             alle Cracker sowie Newbies und DICH !



ciao

Muffty
































