_   __       ______
					| | / / _ __ / _  / |
					| |/ / | '_ \\// /| |
					| / /__| | | |/ //\ |
					| \____/_| |_/____/ |
					|_|               |_|
				
					http://lnz.cjb.net
					
					E-mail: lnz@iname.com

			Come fare una patch per il Mirc 5.51 by |LnZ|


			
--=== STRUMENTI ===--

W32Dasm 8.9
Hiew 6.0
Mirc 5.51 http://www.mirc.com  |Be se non avete questo cosa state leggendo a fare :)
			
--=== PREMESSA ===--

Prima di tutto vorrei dire che essendo molto pigro avevo quasi rinunciato a fare questa
patch perchè non riuscivo a trovare il modo di "bypassare" il controllo che il programma
faceva all'avvio e cosi mi sono rivolto a vari tutorial su come patchare il Mirc 5.51 uno
su TKC 14 ed uno di un certo Nixie.
Però non so se perchè io abbia una versione diversa di Mirc nessuna delle patch indicata
nei tutorial da me letti ha funzionato.
Poi ho deciso di impegnarmi e non fare il fancazzista come al solito ed ho scoperto che
la patch era veramente semplice da individuare, era li davanti ai mie occhi che mi
sorrideva.
Sono questi i momenti in cui mi sento veramente stupido ;)

--=== TUTORIAL ===--

Allora per cominciare fate partire il Mirc che partira con la finestra di About con la
fatidica scritta Licensed to:Unlicensed.
Ora proviamo ad inserire il nostro nome ed un seriale a caso e vedere cosa ci dice,
selezionate About dal menù e successivamente Register, vi apparira la finestra per
registare il programma, inserite il vostro nome ed un seriale a caso.
Il programma vi rispondera con il messaggio "Sorry your registration name and number
don't match", ricordatevi questo messaggio.
Ora fate partire il buon vecchio Wdasm e cliccate sul bottone delle String References e
cercate il messaggio d'errore che il programma vi dava con l'inserimento del seriale
fasullo.
Vi ritorveret a questo punto del codice:

* Reference To: USER32.SendDlgItemMessageA, Ord:0000h
                                  |
:00436E52 E8512C0900              Call 004C9AA8
:00436E57 6A10                    push 00000010
:00436E59 6A00                    push 00000000

* Possible Reference to String Resource ID=01912: "mIRC Registration!"
                                  |
:00436E5B 6878070000              push 00000778
:00436E60 E8973AFDFF              call 0040A8FC
:00436E65 50                      push eax
:00436E66 6A00                    push 00000000

* Possible Reference to String Resource ID=01913: "Sorry, your registration name and
number don't match!

Pleas"
                                  |
:00436E68 6879070000              push 00000779
:00436E6D E88A3AFDFF              call 0040A8FC
:00436E72 50                      push eax
:00436E73 8B4508                  mov eax, dword ptr [ebp+08]
:00436E76 50                      push eax

Come potete vedere questo non è il codice che ci interessa ma solo il codice per creare
la finestra, spostatevi più in alto con la barra verde fino ad arrivare a questa parte di
codice:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00436D81(C)	
:00436E22 6A00                    push 00000000

Scegliete Goto e poi Goto Code Location ed inserite l'indirizzo dal quale viene chiamata
la creazione della finestra che nel mio caso è 00436D81.
Vi ritroveret a questo punto del codice:

* Reference To: USER32.SendDlgItemMessageA, Ord:0000h
                                  |
:00436D6B E8382D0900              Call 004C9AA8
:00436D70 682F834D00              push 004D832F  |Nostro seriale
:00436D75 68487F4D00              push 004D7F48  |Nostro nome
:00436D7A E87DCF0500              call 00493CFC  |procedura che controlla la validità del
SN
:00436D7F 85C0                    test eax, eax 
:00436D81 0F849B000000            je 00436E22    |Se eax=0 vai a Cattivo ragazzo :(

Allora a questo punto qualc'uno potrebbe pensare stupidamente (non io ;) ) che per
validare i numeri seriali basti cambiare quel je in un jne, provate e vedrete che cosi
funziona ma che però la prossima volta che farete ripartire il programma lo ritroverete
non registrato.
Proviamo a vedere cosa fa la Call a 00493CFC.

|
:00493CFC 55                      push ebp
:00493CFD 8BEC                    mov ebp, esp
:00493CFF 53                      push ebx
:00493D00 56                      push esi
:00493D01 57                      push edi
:00493D02 8B750C                  mov esi, dword ptr [ebp+0C]
:00493D05 8B5D08                  mov ebx, dword ptr [ebp+08]
:00493D08 53                      push ebx
:00493D09 E89E910200              call 004BCEAC
:00493D0E 59                      pop ecx
:00493D0F 83F805                  cmp eax, 00000005 |Controlla che il nome sia almeno 5
char.
:00493D12 7304                    jnb 00493D18
:00493D14 33C0                    xor eax, eax
:00493D16 EB5C                    jmp 00493D74

Quindi neanche questo ci interessa però se guardate più in basso troverete il punto
critico dove il programma decide se siamo dei bravi o dei cattivi ragazzi :) .

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00493D12(C)
|
:00493D18 56                      push esi
:00493D19 53                      push ebx
:00493D1A E8FDFEFFFF              call 00493C1C |fa qualc'osa con il nome ed il seriale
:00493D1F 85C0                    test eax, eax |Controlla il registro
:00493D21 7407                    je 00493D2A       | se Eax=0 siamo dei cattivi ragazzi
:00493D23 B801000000              mov eax, 00000001 |Bravo ragazzo
:00493D28 EB4A                    jmp 00493D74

 Quindi per fare in modo che il programma risulti sempre registrato per qualsiasi numero
seriale, basterà modificare questa procedura in modo che l'istruzione che muove 1 in Eax
venga sempre eseguita.

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00493D12(C)
|
:00493D18 56                      push esi
:00493D19 53                      push ebx
:00493D1A E8FDFEFFFF              call 00493C1C |fa qualc'osa con il nome ed il seriale
:00493D1F 85C0                    test eax, eax |Controlla il registro
:00493D21 7407                    nop           |evitiamo il salto
:00493D23 B801000000              mov eax, 00000001 |Bravo ragazzo
:00493D28 EB4A                    jmp 00493D74

Per fare questa modifica dovrete posizionarvi con la barra verde di Wdasm sull'istruzione
je 00493D2A e guardare l'offset indicato.
A questo punto fate partire il vostro caro Hiew e spostatevi in decode mode(F4,
Decode),con il tasto F5 spostatevi all'offset desiderato.
Per sortire l'effetto desiderato dovrete inserire all'interno del file due NOP successivi
dopo l'istruzione test eax, eax, perchè l'istruzione di je occupa più byte di un singolo
NOP.
Per inserire un NOP vi basterà premere il tasto F3 e scrivere 90, a questo punto non vi
rimane che salvare (F9) uscire (F10) ed inserire il vostro nome ed un seriale a caso per
godervi la vostra versione registrata del Mirc.


--== GREETINGS TO ==--

Alor perchè è l'unico che ha avuto il coraggio di portarmi in macchina e che mi ha fatto
conoscere l'ottimo sito dei RingZer0

A tutto il mio gruppo la NeuroZone2

Ai Ringzer0 ottimo gruppo italiano