			PeeGees Cracking Tutorial #3
			=============================



Wie einige von euch wissen bin ich ja Learn2Crack member, nun wird es Zeit dieser
ehrenvollen ;) Aufgabe endlich gerecht zu werden ! Nun hab ich mich entschlossen 
ein weiteres Tutorial zu schreiben.

Also jetzt mal eine kurze Einleitung an wen sich dieses Tutorial richtet : Dieses
Tutorial richtet sich an etwas fortgeschrittenere Cracker, man sollte ein bisschen
wissen wie Windows arbeitet (?), besser gesagt nach welchem prinzip, nebenbei wren
noch SoftIce kenntnisse gut, ich verlange von euch das ihr softice installiert habt
und es luft (mit allen exports usw.), dann solltet ihr noch nen HexEditor haben und
ein disassembler wre auch von Ntzen =).

Das Programm das ich mir vorgenommen habe heisst Wave Surround 2.5, es ist meiner
Meinung nach das beste Plugin fr Winamp, da es sozusagen Surround Sound aus normalen
Stereo Boxen raushold (Klingt bei meine 240 Watt Boxen echt geil :P). Naja anfangs hab
ich mir auch berlegt wie man eigentlich plugins crackt, aber das is das gleiche wie 
normale Programme mit dem Unterschied das da DLLs sind.

Das Programm heist voll : WaveArts WaveSurround Plugin 2.5 for WinAMP 2.x und das
gibt es bei http://www.humanmachiene.com (dieses Tutor wurde von mir mit dem Programm
gezippt, also liegts am Webmaster wenn das File nicht dabei ist)

Jetzt mal zum Schutz des Programms. WS (WaveSurround) gibt beim Start von Winamp einen
ekligen und nervigen NAG Screen aus, wenn man Winamp beendet gibt es den gleichen NAG
Screen. Naja wenn das alles wre.... Dazu gibt es noch ein Limit von 4 Stunden. D.h. 
wenn ihr dieses Plugin 4 Stunden lang benutzt habt schaltet sich der effekt aus ! Und
das is ganz klar ein Programmierfehler der gefixed werden muss ;). 

So jetzt installiert das Teil mal und berzeugt euch selbst von dem Schutz und dem 
geilen Sound.


Problem Nr. 1 : Der NAG-Screen

Hmm ich mchte euch mal zeigen wie ich NAG-Screens entferne.
Ich benutze dafr eigentlich nicht ShowWindow oder CreateWindowExA sonder benutze
"bmsg hwnd WM_DESTROY". Hmm naja vielen von euch wird das schon bekannt sein, einigen
nicht deswegen mchte ich das ein bisschen erklren.

	bmsg =	Breakpoint on Windows Message
		Softice hlt wenn eine "Nachricht" von Windows an das/die (?) hwnd
		geschickt wird.

	hwnd =	Die "Adresse" des Knopfes/Fensters/... hwnd wird dauernd in Windows
		verwendet, jedes Objekt hat eine hwnd, ber die das Fenster oder 
		Objekt angesprochen wird. CreateWindowExA gibt z.b. die hwnd in eax 
		zurck. In GetDlgItemTextA muss auch die hwnd als parameter bergeben 
		werden um den Text von der TextBox abzuholen.

	WM_DESTROY =	WM = WindowsMessage, eine Nachricht die Windows an das Programm
			schickt. In der Windows Programmierung muss sich der Programmierer
			an ein paar regeln halten wenn er Objekte oder Fenster erstellen 
			will, da wren :
	
			1. Eine Klasse registrieren
			2. Das Fenster erstellen
			3. Das Fenster anzeigen 
			4. Eine Endlosschleife starten
			5. Die Endlosschleife empfngt die Nachrichten von windows
			   und diese werden dann weiterverarbeitet.

			WM_DESTROY zerstrt das Fenster/Objekt in dem Sinne also nicht,
			sondern diese Nachricht wird von Windows and das Programm geschickt
			als Information das da Fenster geschlossen wurde und es jetzt den
			Code ausfhren soll der nach dem Schlieen kommt, in unserem Fall
			das Plugin starten.

Also wie kommen wir and die hwnd des Fensters ? Dazu gibt es einen SoftIce Befehl : hwnd
den wir aber NICHT benutzen werden, denn es gibt ein nettes kleines tool von Iczelion
(win32asm.cjb.net) namens MHOOK (liegt dem tutorial hoffentlich bei). Das Programm holt
mit Hilfe der Mausposition die hwnd des Objekts/Fensters..den SourceCode dafr gibts 
auf seiner Page (sehr zu empfehlen !) fr alle die das interessiert.

Also startet MHOOK.EXE, startet WinAMP und holt euch die hwnd des NAG Screens (diese
ist nicht immer gleich !). Jetzt setzt nen bmsg auf diese hwnd und schliet den NAG
Screen. *BOOM* sind wir in SoftICE irgendwo Tief im System (USER). Jetzt kommt eigentlich
die Hauptaufgabe und Hauptschwierigkeit, wir mssen herausfinden von wo aus der NAG Screen
aufgerufen wird. Ein kleiner Tip von mir : Mir is noch nie ein Programm untergekommen, da
die Prozedur des erstellens und zerstren des NAGScreens *nicht* in dem selben call hatte.
Also jetzt so oft PRET (F12) bis wir in unserem Programm (Plugin) landen, und das is genau
ein PRET nach Kernel.Alloc. Also nun sollten wir uns hier befinden : DSP_WA3D!.text+OF2F
und da sieht es so aus :

	push 00000000 ;Parameter zur initialisierung des Dialogs (nicht wichtig)
	push 10001035 ;Dialogfunction (keine ahnung, sorry :/)
	push 00000000 ;hwnd Parent, falls es ein MDI-Prog wre, wre das wichtig (MDI = Multiple Document Interface, wie MSWord halt ;)
	push 100132C8 ;*Siehe unten
	mov ecx, dword ptr [100166F8] ;Holt sich die hInstance aus dem Speicher
	push ecx      ;bergibt die hInstance an den call
	Call DialogBoxParamA
	xor eax, eax  ;setzt eax==0

	*Das ist der eigentliche Dialog der mit einem Ressource Editor erstellt wurde wie
	 z.b. dem Borland Ressource Workshop, jede ressource hat ihre ID (Namen) und dieser
	 wird hier angegeben. Wenn ihr die dll disassembliert (was spter kommt) werdet ihr
	 feststellen das es hier eine StringReferrence gibt zu "DLGNAG" (wie treffend ;).
	 Falls ihr grad nen Ressource Editor zur Hand habt knnt ihr die dll in ihn laden
	 und euch das mal anschauen, dort werdet ihr den NAG Screen wiederfinden knnen.

Naja falls ihr vorhin genau aufgepasst habt werded ihr verstehen warum hier kein 
DestroyWindow da ist (WM_DESTROY). Also was mssen wir jetzt tun ? Als Newbie wrdet 
ihr das alles jetzt NOPen, aber da wir ja fortgeschritten sind setzten wir nen bpx auf
den ersten push (push 00000000). Jetzt Winamp beenden, den 2ten NAGScreen *grr* wegklicken
und erneut starten und hoffen das softice an der stelle hlt ;)

Wenn alles glatt lief sollten wir uns jetzt bei push 00000000 befinden. jetzt tippen wir
mal "a eip" ein. A EIP heist Assemble EIP. EIP is ein register, in dem drin steht an welcher
stelle des Programms ihr euch gerade befindet (bei mir war das 017F:01F31F4F), schon wieder
ein register mehr in dem keine serial drin stehen kann ;). Jetzt msste es so aussehen :

a eip
017F:01F31F4F :

Wir mssen jetzt die adresse von "xor eax, eax" wissen das wre bei mir 017F:01F31F6A.
So jetzt tippt mal "jmp [die adresse von xor eax, eax hier rein aber ohne die [] ]" ein und
drckt danach ESC jetzt msste anstatt "push 00000000", "JMP xxxxxxxx" stehen und die bytes
*mssen* EB19 sein ! Ihr fragt euch jetzt vielleicht : "Wieso EB19 ?". Mal ne kleine
Erklrung : "EB" wie die meisten wissen sollten is der opcode fr nen unconditional jump
und danach mssen die bytes kommen die zu eip (pointer) addiert werden sollen also springt
er von der postiton 19bytes nach unten, und wenn ihr nachzhlt sind das genau 19 bytes !
Faszinieren ;)

Jetzt lsst es mal laufen. Tatsache, es kommt tatschlich kein NAGScreen. Jetzt stellt sich
die Frage wie bekommen wir das physikal (auf deutsch : auf die platte) in die datei ? Also
push 00000000 befinded sich in .text+0F4F, .text is die section im Programm und diese 
beginnt bei dsp_wa3d.dll im offset 0400h. Woher ich das weis ? Aus Procdump 
(http://procdump32.cjb.net), dort gibt es einen PE (Portable Executable) Editor und dort
habe ich die dsp_wa3d.dll geffnet und in die sections geschaut, da stand .text = raw 
offset 400h. Und 400h + F4Fh = 134Fh. Und bei 134Fh steht 6A00 (push 00000000) so jetzt 
tragen wir da EB19 ein (der hexeditor is natrlich geladen) und speichern die datei ab.
Jetzt mal ein Probelauf, und tatschlich ! es luft ohne NAG Screen, phew das wre
geschafft !

Eure Aufgabe is es jetzt mal zur bung den 2ten NAGScreen zu entfernen und ihn aus der
Dll zu patchen !


Fertig ? GUT ! Falls nicht dann fangt einfach von neu an zu lesen :P ihr sollt ja 
schlielich was lernen und euch nicht nur von meinem Wissen (?) berieseln lassen
(das sagte immer irgend ein Lehrer zu mir ;).

Naja jetzt sind wir aber erst bei der Hlfte (leider). Wie zuvor erwhnt hat das Programm
eine Begrenzung von 4 Stunden Laufzeit. Jetzt gibt es 2 Mglichkeiten, entweder ihr glaubt
mir und der readme (wer es nicht glaub soll mal wavesurround dupechecken und meinen fix
ziehen ;) oder ihr hrt einfach 4 Stunden mp3s um unter echten Verhltnissen zu Cracken ;)

Hmm, wo knnte das Programm die Zeit abspeichern die es schon gespielt hat ? Natrlich !
In der registry ! also schnell mal regedit gestartet und nach WaveArts gesucht. Gefunden ?
Gut ! falls nicht : HKEY_CURRENT_USER\Software\Wave Arts\WaveSurround ;). So was sind da 
fr Schlssel drin ? Diese :

BassCut
Filter
OnOff
Pad
Param
Quality
SpeakerAngle
Visible
WindowState
XCancleAngle

Naja irgendwie tauchen alle bis auf Param und XCancleAngle und WindowState im Programm
in den Optionen auf, oder ? Verdchtig, verdchtig ;). Jetzt startet mal Winamp und hrt
ein bisschen mp3s mit dem Plugin, lsst aber regedit offen ! So genug gehrt, beendet jetzt
Winamp und wechselt wieder in regedit zurck, drckt jetzt F5 (Aktualisieren). Und, seht
ihr es auch ? Genau Param hat sich gendert ! Also wenn das kein Punkt zum Anfangen ist,
dann weis ich nicht weiter. Als alternativ weg knnte man auch Regmon (www.sysinternals.com)
aber bis ich euch das erklrt htte *g*, naja lassen wir das :P

Wir knnten jetzt nen bpx auf RegQueryValueExA setzten aber das wird einfach zu oft 
benutzt (naja nicht wirklich aber ich will auf was anderes hinaus :). 

Erstellt ne Kopie von eurer Dll und ladet die Kopie in einen disassembler. Jetzt sucht
in den StrRefs nach "Param", da werdet ihr sicherlich fndig, hmm da sieht es so aus :

:1000465B C745F404000000          mov [ebp-0C], 00000004
:10004662 8D55F4                  lea edx, dword ptr [ebp-0C]
:10004665 52                      push edx
:10004666 68EC660110              push 100166EC
:1000466B 8D45F8                  lea eax, dword ptr [ebp-08]
:1000466E 50                      push eax
:1000466F 6A00                    push 00000000

* Possible StringData Ref from Data Obj ->"Param"
                                  |
:10004671 6818360110              push 10013618
:10004676 8B4DF0                  mov ecx, dword ptr [ebp-10]
:10004679 51                      push ecx

* Reference To: ADVAPI32.RegQueryValueExA, Ord:0136h
                                  |
:1000467A FF156CA20110            Call dword ptr [1001A26C]
:10004680 85C0                    test eax, eax
:10004682 740A                    je 1000468E


und ReqQueryValueExA wird so auf gerufen :

	push	lpcbData
	push	lpData
	push	lpType
	push	lpReserved
	push	lpValueName
	push	hKey
	call	RegQueryValueExA

also heist das, da in 100166EC die werte zum eintragen stehen. Hmm was sollten wir jetzt
am besten tun ? Genau ! Den ganzen code einfach berspringen ! 

Der Magische Interrup 3h =)

Hmm wie setzten wir am einfachsten nen bpx auf "mov [ebp-0C], 00000004" ? 
Ich erklrs euch : Vielleicht kennen einige von euch den TurboDebugger von Borland
um da einen Breakpoint zu setzten muss im programm der interrupt 3 aufgerufen werden.
Der interrupt 3 wird nur zum debuggen benutzt, windows berspringt in einfach. Also der
HexWert fr int3 ist "CC" also startet den Hexeditor und erstetzt  "C745F404000000" mit
"CC45F404000000", speichert die datei ab. Jetzt geht kurz in softice und tippt 
"bpint 3" ein d.h. Breakpoint on Interrupt 3. So da jetzt der breakpoint gesetzt ist
knnt ihr das programm starten. Ihr seit jetzt in Softice, tippt jetzt "e eip" ein um
das wieder zu editieren da sonst das programm abstrzt. Erstetzt das CC wieder durch ein
C7 und setzt nen bpx auf eip (ihr wisst schon :) jetzt einfach wieder aus softice heraus,
in den hexeditor zurck und dort auch wieder CC zu C7 ndern, abspeichern und winamp
starten. Zurck in SoftIce editiert ihr das Programm jetzt so das es den ganzen code
berspringt und zu "mov [ebp-0C], 00000004" springt. Falls ihr nicht wisst wie das geht
msst ihr wohl wieder von vorn anfangen =). Jetzt patcht ihr das physikal in die dll
und schon is das plugin eine "quasi vollversion"

Der Schlu :

Hmm, naja ich hoffe das bringt euch weiter. Und da sagt noch einer das Deutsche Tutors
schlecht sind ! ;) Falls es gengend feedback an peegee@mail.com gibt kommt bald wieder
eins...fr meine anderen 2 tutors hab ich lausige 5 emails bekommen :( ich hoffe das
ndert sich jetzt ! Jetzt kommen natrlich noch alle mglichen greets =))))

Greets to (in no special order) :

Chafe, the Egoiste, Slick, bigeasy, Glacier, Intern, Yaan, _vtec, waxweazel, raider, 
apollo, mtallica, torn@do, oom, adenozin, skalagi, insane, sort8, sensah, berserka,
zor, vangate (es war sein request das mich auf dieses plugin gebracht hat), u_shall
(hehe so sieht man sich wieder :), und alle die ich vergessen habe (sorry !)


cya

PeeGee

	peegee@mail.com