
///////////////////////////////////////////////////
// Willkommen zu GiGa's Cracking Tutorial        //
// * GERMAN *                                    //
///////////////////////////////////////////////////

Hallo du ( du der gerade Cracken lernen will ),

Bevor es Losgeht mchte ein paar kleinigkeiten
festlegen :

---------------------------------------------------

1.) Dieses Cracking Tutorial richtet sich an einen
    Totalen Anfnger .
    Es werden also keine Vorkenntnisse in ASM und
    Co. gebraucht :-)

und

2.) Ich mag es nicht , wenn man whrend meines 
    tut's raucht ...

---------------------------------------------------

Sachen die bentigt werden:

- SoftICE 3.x
- W32Dasm 8.9
- Hacker's View
- Eine Dose Pepsi cola
- Gengend Zeit
- Eine Auflsung von 1024 x 768 pixeln (bitte kein WordWrap ,
  weil das dann alles scheisse aussieht :P)

Es geht los ..... <freu>,<smile>,<griiiiiinnns>

Als erstes leite ich dich in die Assembler
( Kurz ASM ) Programmierung ein .
Dies ist dringen Notwendig , da man ohne ASM
Kentnisse nicht Cracken kann . :-(


=(*)= Register =(*)=

Register sind sowas hnliches wie Variablen
oder Container .
Man kann in Sie Daten oder Speicher Adressen
hinein packen .
Von diesen Regies gibt es 16 & 32bit
Version , die ich im volgenden Listing auf-
gelistet habe ...

16bit Register:

AX , BX , CX , DX , DI , BP , SP , IP , SI

32bit Register:

EAX , EBX , ECX , EDX , EDI , EBP , ESP , EIP , ESI

=(*)= Kommandos =(*)=

Wie in jeder Programmiersprache , gibt es
auch in ASM Funktionen .. diese kann man aber
eigentlich nicht als solche bezeichnen ,
weshalb ich Sie hier als Kommandos
bezeichnen ( Liebe ASM Proofs , bitte
nicht flamen :-)
Da es nicht sehr klug wre hier alle
Aufzulisten habe ich nur die genommen ,die
fr dich beim Cracken von bedeutung sind .

Also , volgende solltest du dir merken:

MOV
SUB
ADD
CMP
JNZ
JZ
JE
JNE
JMP
PUSH
CALL
POP
RET

Erklrung:

=(*)= MOV =(*)= 

steht fr move , und bedeutet , verschiebe einen Wert von A nach B;

Parameter:
MOV Ziel,Info

z.B. MOV EAX,Variable1
oder MOV EAX,EBX

folgendes geht nicht: MOV Variable1,Variable2
Es mu also immer ein Register mit im Spiel sein .

=(*)= SUB =(*)=

steht fr Subtraktion , und bedeutet , Ziehe von A , B ab;

Parameter:
SUB Zahl,Zahl       Die zweite Zahl , wird von der ersten abgezogen;

z.B. MOV EAX,1
     MOV EBX,2
     SUB EBX,EAX

Das Ergebniss ist EBX = 1

Auch hier gilt , ein Register mu dabei sein .

=(*)= ADD =(*)=

steht fr Addieren , und bedeutet , Rechne A zu B;

Parameter:
ADD Zahl,Zahl      Die zweite Zahl wird zu der ersten gezhlt;

z.B. MOV EAX,1
     MOV EDX,1
     ADD EAX,EDX

Das Ergebnis ist EAX = 2

=(*)= CMP =(*)=

steht fr Compare ( zu deutsch: Vergleiche ) , CMP vergleicht
zwei Register miteinander ; sehr wichtig beim Cracken !

Parameter:
CMP Register1,Register2

Hier gibt es eine besonderheit ; sollten die beiden Register
den gleichen inhalt haben , gibt das Kommando 0 zurck .
Ansonsten 1 .

0 = Gleich        ( auf Englisch Equal )
1 = Nicht gleich  ( b.z.w. Not Equal )

z.B. MOV EAX,131561
     MOV EBX,1564
     CMP EAX,AB    Die Rckgabe ist 1

oder MOV EAX,131561
     MOV EBX,EAX   EBX = Hat jetzt den inhalt von EAX , also 131561
     CMP EAX,EBX   Die Rckgabe ist 0

=(*)= JNZ =(*)=

steht fr Jump If not Zero , das bedeutet , springe zu A wenn der CMP
vorher nicht gleich war .

Parameter:
JNZ Label1

z.B. MOV EAX,112233   ; Die von dir eingebene Reg Nummer :-)
     MOV EDX,65438    ; Die richtige Reg Nummer :-)
     CMP EAX,EDX      ; Vergleiche die Beiden ... nicht gleicht .. also 1
     JNZ WrongSerial  ; Springe wenn nicht 0 zu WrongSerial

=(*)= JZ =(*)=

steht fr Jump if Zero , das bedeutet , springe zu A wenn der CMP vorher
0 zurck gab , also beide Ergebnisse gleich waren .

Parameter:
JZ Label1

z.B. MOV EAX,110    ; Nummer Nummer 1 <hehe>
     MOV EDX,110    ; Nummer Nummer 2
     CMP EAX,EDX    ; Vergleiche die Beiden ... gleich .. also 0
     JZ RightSerial ; Springe wenn 0 zu RightSerial

=(*)= JE =(*)=

Tja , warum es dieses Kommando gibt es mir schleierhaft
es bedeutet , Jump If Equal , also springe zu A wenn der
Vorherige CMP Positiv ausging .

Kurz und bndig :

JE kann man gleichsetzen mit JZ

=(*)= JNE =(*)=

Hier gilt das gleiche wie oben:

JNE ist das gleiche wie JNZ

=(*)= JMP =(*)=

steht fr Jump ( das war doch wirklich ma einfach )

Parameter:
JMP Label1

z.B. MOV EAX,EBX
     SUB EBX,EDX
     ADD EAX,5
     JMP NchsteFunktion

Im Klaartext :
Bei JMP wird immer gesprungen , egal was vorher war

=(*)= PUSH =(*)=

steht fr PUSH ( muhahaha ) mit push kann man/frau daten in den
stack (spezieler Daten Bereich im RAM) legen .
Wird fters dazu verwendet , um Parameter fr ein CALL Kommando
Festzulegen ( siehe Kommando Call ; kommt als nchstes )

Parameter:
PUSH Register oder Speicheradresse

z.B. MOV EAX,15
     PUSH EAX ; nun kann man EAX mit neuen daten fllen , da die 
              ; ursprnglichen daten im RAM/Stack liegen .

=(*)= CALL =(*)=
steht fr CALL , das heist soviel wie rufe eine , meistens externe ,
Funktione , NICHT KOMMANDO , auf .

Parameter:
CALL DLL!Funktion 

Besonderheit :
Sollte die aufgerufene funktion ihrerseits auch Parameter bentigen
werden sie vorher eingegeben !

Kleines Beispiel , fr eine externe Funktion , mit Parametern :

MOV EAX,[004031F2F4]  ; EAX hat jetzt den Inhalt des RAM Speichers
                      ; bei Adresse 004031F2F4 .
		      ; Bei dieser Adresse steht z.B. "chance"
MOV ECX,[004031H9H1]  ; ECX hat jetzt en inhalt von der RAM
		      ; Adresse 004031H9H1 .
		      ; Dort steht z.B. "test"
PUSH EAX	      ; EAX wird in den Speicher ( Stack ) gepackt
PUSH ECX	      ; Auch ECX kommt in den Speicher ( Stack )
CALL USER32!lstrcmpA  ; Die Externe Funktion lstrcmpA wird aus der
		      ; USER32.DLL ausgefhrt .
                      ; Diese Funktion bentigt zwei Parameter .
		      ; Diese zwei Parameter sind EAX & ECX

Was diese Funktion macht und welche Parameter Sie braucht
wird in einem spteren Kapitel behandelt .

=(*)= POP =(*)=

steht fr POP , mit POP kann man/frau poppen <hehe>
kleiner scherz .. nein mit POP kann man , frher mit PUSH in den Stack
gelpackte Daten , wieder in das vorherige Register packen .

Parameter:
POP Register

z.B. MOV EAX,15
     MOV ECX,200
     PUSH EAX			; 15 liegt jetzt im Stack
     PUSH ECX			; 200 liegt auch im Stack
     CALL USER32!lstrcmpA	; Die Funktion lstrcmpA wird aufgerufen
     MOV EAX,20			; EAX ist jetzt 20
     MOV ECX,30			; Und ECX 30
     POP EAX			; Die Daten werden wieder aus
     POP ECX			; dem Stack geholt !
				; EAX ist jetzt wieder 15
				; Und ECX 200

POP kann man mit einer Speicher Funktion bei Spielen vergleichen .
Erst werden die daten mit PUSH gespeichert ( in den Stack ge-
packt) und spter dann mit POP wieder herausgeholt .

=(*)= RET =(*)=

steht fr RETURN , mit diesem Kommando kann man aus einer
Funktion wieder zurck ins Hauptprogramm springen .

Parameter:
RET

z.B. MOV EAX,111111	; EAX hat jetzt 111111 als Inhalt
     CALL print		; Die INTERNE Funktion print wird aufgerufen
     
START print:		; Start der print Funktion
     PUSH EAX		; EAX wird "gespeichert"
     POP  EDI		; EDI wird "geladen"
     .....		; Irgendwelcher code
     ...		; Fr uns uninteressant
     RET		; Wir springen zurck zum Hauptcode
END Print		; Die Funktion print wird beendet

Solltest du in einem Programm irgemdwo mal das Kommando
RET sehen , weist du automatisch das es sich um eine unter Funktion
handelt .




----------------------------------------------------------------------------------------------------------

Puh .. jetzt hast du das ASM Tutorial entlich hinter dir .... :-)
Und ? Bist du bereit fr den zweiten Teil meines cooolen cracking
tutorial's ? Ja ? Gut ! Dann geht's jetzt weiter ....

GiGa's SoftICE Installations Manual for Dummies ... <smile>
	
So , ich nehme mal an , da du SoftICE jetzt auf deiner platte hast .
Als erstes muss du es Installieren ! Dazu rufst du die Datei Setup.EXE
auf , und folgst den Anweisungen .
Nun , ich hoffe das du jetzt mit der GRUND Installation fertig bist .
Um SoftICE nun zu Konfigurieren starte bitte das Programm : Symbol Loader
Im normalfall solltest du es in der Programm Gruppe Numega SoftICE im
Start Menu finden .

In diesem Programm whlst du dann im Menu "Edit" den Befahl:
"SoftICE Init Settings .." aus .
Wenn du alles richtig gemacht hast , solltest du jetzt das SoftICE
Konfig Fenster vor dir sehen . :-)

Klicke in diesem Fenster bitte auf den TAB String "Exports" , und dann
auf "Add.." .
In dem nun erschienen Dialog gibst du in die obere linke Textbox bitte
"C:\WINDOWS\SYSTEM\Kernel32.dll" ein und drckst dann Enter bzw klickst
auf OK . ACHTUNG: Sollte dein Windows Verzeichnis NICHT C:\WINDOWS
sein must den oben genannten Pfad abgleichen z.B. C:\WIN95\SYSTEM\Kernel32.dll !!!
So denne .. das gleiche nochmal nur diesmal gibst du nicht ...\...\Kernel32.dll ein
sonder User32.dll . Das machst du genauso wie oben ... . Als erstest klickste auf "Add..."
dann gibst du C:\DeinWindowsDir\System\User32.dll ein und klickst auf OK bzw drckst
Enter .

Tada .. der erste abschnitt zur Konfiguration von SoftICE ist beendet .. !!!

HA HA .. Du dachtest wohl ich bin schon fertig mit dir .. he he ... ne ne weit 
gefehlt .. jetzt kommt das fein tuning :

Klicke jetzt im SoftICE Init Settings Dialog auf den TAB String "General" .
Siehst du die TextBox ber der "Initialization String" steht ?
Loesche den ganzen Inhalt dieser Text Box und schreibe volgendes hinein:
"WD;WR;X;" ( natrlich ohne die Gnsefschen ) !

JAAAAAAA !!!!!! Jetz haste die Installation beendet !!! YAHOOOO !

--------------------------------------------------------------------------------------------------------


Sodele , hier geht es erst richtig los .
Hier werde ich dir zeigen welche mglichkeiten es gibt , um ein
Programm zu cracken :=)

GiGa's Cracking Manver <The Original :-)>

Also , dann las uns mal ein paar Proggy's knacken ..


Bevor wir uns nun daran machen , eine Seriennummer auswindig zu machen
oder einen Nag Screen zu removen mssen wir das Programm analysieren .
Dazu schauen wir uns als erstes einmal die EXE Datei selbst an .
Benutze hierzu am besten PEBrowse (findest du in der beiligenden ZIP
Datei) . Starte PEB. und whle dann im Men "File" den Eintrag "Load..."
aus . In dem nun erschienen Dialog kannst du die Datei auswhlen die du
Analysieren willst :)
Ich habe diesem Tutorial ein , von mir geschriebenes , CrackMe beigelegt
da ich hier nicht zu illegalen Handlungen anstiften mchte .

Also dann . ... Entpacke das CrackMe und whle es in dem Load Dialog
von PEBrowse aus .
Schaue dir jetzt erstma alle Spaten in aller Ruhe an .
Fr uns in erster Linie interessant ist der "Import Section"
Abschnitt .
Na biste in dem Abschnitt nun endlich angekommen ?
Ich will nmlich nicht immer auf diese Nachzgler warten !! :)

Okay .. Links im Fenster siehst du verschiedene DLL's aufgelistet .
Bei meinem CrackMe sollten die volgenden zu erknen sein ..
(Wenn du sie nicht sehen kannst wrde ich Vorschlagen , das du 
dir ne Anstndige Brille zulegst) :

KERNEL32.dll
MFC42.DLL
MSVCRT.dll
USER32.dll

Die beiden mittleren (MFC42 & MSVCRT) sind fr uns wiederum
uninteressant . (Bei ihnen handelt es sich um die Runtime
Libraries vom MS-Visual C++)
Jetzt zhlen nur KERNEL und USER ...
Vielleicht fllt dir auf , das dies auch die DLL's sind die du
bei der SoftICE Installation angegeben hast :)) .

Diese beiden Dateien werden dir noch oft begegnen , also schn
im Gedchniss halten .. Braves Hndchen ... ;

Klick jetzt einfach mal eine der beiden Dateien an .. zB. KERNEL32.dll
du siehst nun im zweiten Bereich das dort ewisse Windows Funktionen
aufgelistet sind .
Diese Windows Funktionen werden von meinem CrackMe verwendet .

Damit wir nun ohne Pause weitermachen knnen , musst du einmal Windows
neustarten , damit die nderungen in der winice.dat wirksam werden .
Jene haste du eben mit der Grafischen benutzerfhrung von SoftICE
durchgefhrt.

Sodele , ich nehme mal an das Windows nun neugestartet wurde !
Jetzt drckst du einfach mal STRG + D .
Siehst du was? Jup , das SoftICE Debugger Fenster sollte nun
in den Fordergrund gepushed worden sein . Nun ..aber was is das da alles ??
jo .. Der Fensterabschnitt (ich nenn das jetzt einfach mal so) ganz oben
stellt die Register da , erinnerst du dich noch , was Register waren??? Jo genau
das sind sowas nliches wie Variablen .
Das ganze da oben sollte ungefhr wie folgt aussehen:
  ________________________________________________
|                                                |
| EAX = 05445D EDX = 00FFFFF ECX = 778922         |
| dl = 0 df = 54 bl = 4                           |
 `------------------------------------------------
(Ich weiss es ist hsslich , aber besser bekomme ich des nich hin :)

Die Zahlen hinter den Registern geben die Speicher Addressen an , an denen die entsprechenden
Daten stehen , die den Registern zugeordnet sind .
Kleines Beispiel: 
EAX = 05445D 
^ bedeutet das im Speicher an der Addresse 05445D das steht was in EAX ist ..zB.
  steht an jener Addresse 'Blaaaa' , und weil diese Addresse EAX zugeordnet ist
  steht auch in EAX 'Blaaaa' .

Wenn du an dem SoftICE Kommando Prompt nun 'D EAX' eingibst , siehst du was in EAX steht .
'D EAX' ist also das gleiche wie 'D 05445D' .

So , ich glaube das erste Fensterlein ist gut genug erklrt , nun kommen wir zum nchsten .
Das nchste ist das dadrunter :P
Das siegt ca. so aus:
  ________________________________________________________
|00045621: 04 05 06 07 08 09 10 11 12 13 14 15 Blaaaaaaa |
| 00045622: 16 17 18 19 20 21 22 23 24 25 26 27 ..5dvc... |
| 00045623: 28 29 30 31 32 33 34 35 36 37 38 39 ARM-45566 |
| 00045623: 40 41 42 43 44 45 46 47 48 49 50 51 ......... |
 `--------------------------------------------------------
(jaaa... ich weiss ..des hier is auch hsssliche)

Hier kannnste sehen was gerade so im Speicher ab geht ..
Wenn du wie oben beschriben beispielsweise 'D EAX' eingeben
hattest , siehst du in diesem Fenster was in EAX drinne ist.
Wenn du schonmal mit einem Hex editor gearbeitet hast , wird dir
dieses Fenster wahrscheinlich bekannt vorkommen , mit dem kleinen
unterschied das du hier nich das zeug ziehst was in einer datei ist ,
sondern das was is im Speicher rum dudelt .
Mehr ist hierzu nicht zusagen .

Soooooo ........ nun kommt das eigentlich wichtigste Fenster im ganzen
Spiel ..pardong im .. im ..immm ???? in ... ich meine in , in SoftICE natrlich .
Das ... DAS .... DAS CODE FENSTER!!!! *STAUN*
yupp , in diesem Fenster steht der ASM code der zur Run Time (laufzeit) von SoftICE 
disassmbled wurde .
Jetzt im moment werdet ihr hier wahrscheinlich nichts sehr interessantes sehen , aber wenn
wir gleich mein CrackMe 'debuggen' schon ..
Also dann mal los .. (eigentlich wollte ich hier noch ne skizze von dem teil hinmachen [von dem Fenster
nicht vom CrackMe] , aber nun hab ich keine lust mehr:)

Du gehst nun also wieder aus SoftICE raus indem du wieder STRG + D oder F5 drckst .

Nun schaust du wieder in PEBrowse und guckst dir ma an welche tollen Funktionen aus der User32.dll
von meinem CrackMe so gebraucht werden .
Eigentlich interessiert es mich garnich was du da findest (:P) , denn es zhlt fr uns zurzeit erstmal
nur 'GetWindowTextA' & 'GetDlgItemTextA' .
Zur erklrung dieser beiden (und noch zwei anderer):

-----------------------------------------------------------------------------------------------------------



=(*)= Windows API Funktionen =(*)= 


Windows API Funktionen sind das A & O von Windows Programmen ,
es gibt kein Programm das ohne sie auskommt .
Es gibt von ihnen Funktionen fr das Zeichnen von Fenstern , fr das Auslesen
von Text Boxen , fr das Vergleichen von Strings , fr das Schliessen und ausfhren
von Programmen und und und ...
By the way , API steht fr Application Programming Interface .

Jetzt hier alle aufzulisten , wre glatter selbstmord , deshalb wie auch schon oben
bei den ASM Kommandos , liste ich hier nur die notwendigen auf :

=(*)= GetDlgItemTextA =(*)=

Diese Funktion liest den Inhalt von bestimmten Bedien Elemente aus.
Die Parameter sehen (laut Windows API Hilfe) wie folgt aus:

UINT GetDlgItemTextA( 

HWND hDlg, // handle of dialog box 
 
int nIDDlgItem, // identifier of control 
 
LPTSTR lpString, // address of buffer for text 
 
int nMaxCount // maximum size of string 
 
); 
 
Auf die Parameter geh ich hier nicht weiter ein , denn sie sind fr
das was wir machen erstmal ziemlich useless , auch wenn andere 
das anderes sehen .

Diese Funktion ist eine der zwei meistbenutzten API Funktionen beim cracken ,
also schn merken ! :P

=(*)= GetWindowTextA =(*)=

Diese Funktion ist zu 90% nlich mit der vorherigen , sie tut genau das gleiche.
Die Paramter lauten:

int GetWindowTextA( 

HWND hWnd, // handle of window or control with text 
 
LPTSTR lpString, // address of buffer for text 
 
int nMaxCount // maximum number of characters to copy 
 
); 

Genau wie oben , gehe ich hier nicht nher auf die Parameter ein .
Und , wie ihr wahrscheinlich euch schon gedacht habt , 'jaaa' diese Funktion ist
die zweite der meistbenutzten Windows API Funktionen beim Cracken .

=(*)= lstrCmpA =(*)=

Diese Funktion ist sehr 'billig' , sie vergleicht zwei Strings miteinander .
die Paramter wie immer aus der Windows API Hilfe lauten wiefolgt:

int lstrCmpA( 

LPCTSTR lpString1, // address of first string 
 
LPCTSTR lpString2 // address of second string 
 
); 
 
Hierbei ist zu beachten das diese Funktion genauso wie das ASM Kommando '1' oder '0'
zurck gibt , jenachdem ob die beiden Strings gleich sind , oder nicht ...

0 = Gleich   (equal)
1 = Ungleich (not equal)

P.S.: Die Funktion ist hufig ..pardong EXTREME hufig bei InstallShield Serial Protections 
anzutreffen , solltet ihr also mal einen InstallShield knacken wollen , nimmt einfach lstrcmpA als
breakpoint (was ein breakpoint ist kommt gleich) .

=(*)= hmemcpy =(*)=

Und hier ist nun die letzte WICHTIGE Funktion , sie wird immer dann aufgerufen , wenn irgendwelche
Daten verschoben werden mssen , also praktisch immer .
Das ist auch einer der Grnde wesshalb man diese Funktion meiden sollte .

Parameter gibts hier 'keine' ..
zumindest keine die uns irgendwie ntzen knnten .

Diese 'tolllllllllleeeeeee' Funktion msst ihr bei Programmen verwenden die in Delphi
geschrieben worden sind *grummel* , denn Delphi verwendet LEIDER nicht die anderen oben genannten
Funktionen.
Erklrung zur benutzung dieser Funktion folgt .


------------------------------------------------------------------------------------------------------------


So , jetzt gehts ans eingemachte , wir cracken mein CrackMe .
Jenes ist extreme einfach gehalten , also nichts fr Profi Cracker :P

- Startet Mein CrackMe und gebt als Name irgendwas ein , und als Serial beispielsweise '112233' .
  Ich wrde vorschlagen , das ihr diese Serial immmer benutzt .. denn sie einen tollen vorteil .
  Und ihr wollt sicher wissen welchen , nich?? Okay ich verrate es euch .. man kann sie ganz simple in
  eine HEX Zahl umwandeln , was fr sptere Programme sehr sinnfoll ist , denn wer hat schon immer einen
  Taschenrechner dabei der dezimal zahlen in Hex werte umrechnen kann :P (112233 = 31 31 32 32 33 33)

- Nun habt ihr sicher die daten eingegeben oder etwa nich??? Also ich nehme mal an das ihr es habt nun 
  switched mit STRG + D zu SoftICE und gibts 'bpx GetWindowTextA' ein .
  Erklrung: bpx = Breakpoint (zu deutsch Haltepunkt) , ihr knnt SoftICE sagen , das es das System & damit auch
  euer Programm anhalten soll , wenn eine bestimmte Windows API Funktion aufgerufen wird . diese Funktion knnt
  ihr mit bpx FunktionsName festlegen .

- So , nachdem ihr den bpx gesetzt habt geht ihr mit F5 wieder zurck zu Windows & meinem CrackMe und klickt auf 'OK'
  um die Serial Check Prozedur zu starten . Nun sollte SoftICE euer System anhalten und in den Fordergrund kommen.
  Hier seht nun in dem Fenster mit dem disassembleten code die stelle wo er das System angehalten hat .

- Da Diese Stelle aber euch nix bringt , sondern ihr ja wissen wollt , wo GetWindowTextA aufgerufen worden ist ,
  drckt ihr einmal F11 (damit geht ihr zu der Stelle die GetWindowTextA aufgerufen hat) .

- Nun seht ihr im Code Fenster meinen Programm code der den Namen ausliehst ..aber was bringts denkt ihr euch nun ..
  Und ihr habt recht ..nix ..ihr wollt ja die Serial Check Prozedur ..deshlab drckt ihr STRG + D bzw F5 um SoftICE
  zu verlassen , aber was passiert , ihr landet wieder in SoftICE und zwar diesmal da wo GetWindowTextA die zweite
  Text Box ausliest , die mit der Serial , da wo ihr hinwolltet .

- SO .. ich glaube ihr wisst schon was ihr jetzt machen msst ..oder? Also als erstes drckt ihr wieder F11 um zu der
  Stelle zu kommen die mein Programm aufgerufen hat . Nun knnt ihr mir 'D RegisterName' abfragen was in den Registern
  ist . z.B. mit 'D EAX' oder 'D ECX' .

- Wenn ihr nun oben in das Register Fenster guckt , da wo all die register Aufgelistet sind , seht ihr
  das bei EAX = 00000006 steht . Dies ist die lnge der Serial die ihr eingeben habt ..denn 112233 ist insgesammt
  6 zeichen lang , wenn ihr natrlich eine andere serial genommen habt ist die lnge dort auch anders :P

- Nun drckt ihr solange F10 bis der braune Balken ber dem POP nach dem CALL ist , der da als erstes steht . 
  Wenn ihr genauer aufgepasst habt , ist euch sicher aufgefallen , das aufeinmal die Register 
  (nicht alle aber einige) hellblau aufleuchten , das bedeutet das sich der inhalt verndert hat , 
  gibt nun einfach mal 'D ECX' (eine der vernderten Register) ein , und ihr seht in dem Speicher Fenster , 
  die von euch eingebene Serial *toolllllllllll* :P

- Traced nun ein stckchen weiter (tracen nennt man das , wenn man mit F10 durch den Code surft) bis ihr
  bei einem RET angekommen sein , na was hiess das doch gleich??? Richtig daran kann man erkennen das man in
  einer Unter Funktion ist :P Also das Programm ist doch etwas grsser als es am anfang scheint ;)

- Okidoki , nun weiter.. jetzt traced ihr solange weiter bis ihr bei folgender Stelle ankommt:

  xxxx:xxxxxxx   MOV EAX,[EDI+64]
  xxxx:xxxxxxx   MOV ESI,00403100
  xxxx:xxxxxxx   MOV DL,[EAX]
  xxxx:xxxxxxx   MOV BL,[ESI]
  xxxx:xxxxxxx   CMP DL,BL

  Na gefunden??? Das will ich doch schwer hoffen (berings 00403100 kann bei euch eine
  andere Zahl sein (speicher Addresse) da das nich auf allen Rechnern gleich ist .
  So nun zur erklrung des ganzen:

  Ihr denkt euch jetzt wahrscheinlich als erstes , woher weiss der GiGA , das diese stelle hier , die ist
  die den Serial code vergleicht , oder?? Ganz einfach ich hab mir mit jeder zeile die ich durch getraced habe
  das angeguckt , was ich gefunden hab und diese Stelle sah als einzigstes interessant aus , schon alleine
  deswegen , weil hier ein CMP (Compare) vorkommt.
  
  Wenn ihr nun an jener Stelle angekommen seit , gibt doch einfach mal 'D EAX' ein .. na was seht ihr?
  Korrekt , eure Serial (z.B. 112233) .
  Nun gibt mal 'D ESI' ein ... UND .. UND ..was seht ihr nun ? Richtig , die richtige serial , ich werde sie
  hier nicht hintippen , sonst ist ja der ganze spass weg!

  Jetzt werde ich den oben abgedruckten code schnipsel noch etwas genauer erlutern:

  MOV EAX,[EDI+64]   ;Hier wird das was im Speicher an der Addresse EDI+64 nach EAX verschoben
  MOV ESI,00403100   ;Das gleiche wie oben nur das hierbei ein anderer Wert nach ESI gemoved wird
  MOV DL,[EAX]       ;EAX (eure Serial) wird nach DL gepackt
  MOV BL,[ESI]       ;ESI (die richtige Serial) wird nach BL gehauen
  CMP DL,BL          ;DL (Bser Junge) wird mit BL (guter Junge) verglichen
  ...                ;Auswertung des Ergebnisses , wenn der CMP 0 , also gleich , zurck gibt
  ...                ;kommt die 'Gute Serial' Msgbox , ansonsten die schlechte

  Na , war das schwer???
  Ich hoffe ihr habt euch die richtige Serial notiert , wenn nicht ..tjo Arschkarte , alles nochmal machen :P
  Sodele ich nehme mal an das ihr jetzt die richtige Serial irgendwo hingeschrieben habt , gebt jene jetzt
  beim CrackMe ein ..ABER drckt noch nicht auf OK ..denn wenn ihr das jetzt macht switched SoftICE wieder hoch
  und das wollen wir ja nich , oder?
  Also um das zuverhindern wechselt ihr zu SoftICE mit STRG + D und gibt folgendes ein -> 'BC*'
  Das ganze steht fr Breakpoint Clear ALL (* = ALL)  , nun knnt ihr mit ruhigem gewissen SoftICE schliessen
  (drckt F5 oder STRG + D) und knnt mit OK die Serial besttigen , wenn ihr euch nicht vertippt habt ,
  sollte nun die 'Yooo , peace Bruder , du hast es geschaft!' MessageBox kommen *grins*
  
-------------------------------------------------------------------------------------------------------------------


=(*)= Abschliessende Worte =(*)=

jo Leute , das wars .. mein Cracking Tutorial is nu zu Ende , aber bevor ihr nun alle nach hause geht
mchte ich euch noch folgende gute Ratschlge auf den Weg geben :

- Versucht euch als anfnger nicht an Programmen mit Dongels oder nliches (ihr werdet wenig erfolg haben :/)

- Cracked NUR mit SoftICE , viele leute cracken ihre Programme mit W32Dasm & Hiew (Hackers View) , des ist aber
  Lame (das ist nich nur meine Meinung!) , einen Jump suchen und den dann abndern kann jeder , deshalb brauch
  man sich nich als Cracker bezeichnen.

- Benutzt nur W32Dasm & hiew , wenn es nicht anders geht , beispielsweise , wenn ihr einen Nag Screen killen
  , oder ein Time Limit auschalten wollt , und es keine mglichkeit zur Freischaltung des Programmes gibt.

- Viele Labbern von www.fravia.org und schwrmen davon ..bis heute ist mir nicht klar , was an dieser Seite so
  toll sein soll , also FiNGER WEG von Fravia :P

- Programme fr Cracker gibts bei http://cracking.tsx.org !

- Denkt nicht , wenn ihr dieses Tutorial durchgearbeitet habt , ihr seit mit allem Wasser gewaschen ,
  besorgt euch lieber viele viele andere Turorials von Beginner bis Experte um immer besser zu werden .
  Und testet euer wissen auch in der Praxis , also nicht nur dumm rum labbern sondern auch cracken :P


=(*)= Greetz & Flames =(*)=

Personal Greetz fly out to: GigaStorm , possible , NiGHT Fall , wilkins , |Marvel| 
                            _eNiGMa_ , RaT , chr0me\\ , sorT8 , ratso , _NB_ ,
                            PsyCHo_CC and :MARQUIS: (na kennste mich noch:)

Flames fly out to         : Flames gibtet heude nich , wollen ma nich so sein! :P


see yaa

GiGA - USSC/THE COUNCiL - mein.onkel.is.ne@tande.com

P.S.: Mal sehen wie die Resonannnz (hups , wie schreibt man das doch gleich) auf dieses Turorial ist ,
      wenn gut , schieb ich vielleich noch ein IDA Tutorial nach.