Reversing of NetInfo & IPMonitor
PATCHING

Data

by Artemis 23am

 

26/11/2000

UIC's Home Page

Published by Quequero

Ragà... è il mio primo tutorial eh... non scherziamo :)))

Ormai non ho nulla da commentare, questo tutorial lo conosco a memoria e Artemis sa perchè :))) ciauz Art :P

Ragà... è il mio primo tutorial eh... non scherziamo :)))

Se combatti il male con il male... è sempre il male a vincere! (Gesù)

Home page: http://members.xoom.it/_XOOM/artemislab/index.phpl
E-mail: [email protected]
Artemis: irc.azzurra.it on channel #crack-it, #hackzxtreme, #uic-hack
ICQ: 27580498

Se combatti il male con il male... è sempre il male a vincere! (Gesù)

Difficoltà

(x) NewBies  ( ) Intermedio  ( ) Avanzato  ( ) Master

 

Per cominciare voglio dirvi che quello che andro' a spiegare non e' altro che una semplice tecnica che funziona solo se nel programma sono presenti stringhe che indicano il punto dove intervenire. A volte pero' i programmatori possono inserire "commenti" che possono sviare letteralmente il reverser. Non sottovalutate cmq anche la presenza di SMC (Self Modifying Code), ovvero il codice automodificante, che non va d'accordo col Wdasm.


Reversing of NetInfo & IPMonitor
Written by Artemis

Introduzione

Dunque eccoci qui al mio primo tutorial! Tratteniamo l'emozione dai... =))
So che scrivero' un sacco di stronzate, pero' se volete imparare qualcosa, sopportatemi fino alla fine e non ve ne pentirete :))

Tools usati

- URSoft W32dasm 8.93
- Hex Workshop (o un hex editor qualsiasi)
- Exescope (opzionale)

URL o FTP del programma

http://www.netinfo.co.il/

Notizie sul programma

NetInfo 3.4 è un programma che contiene molte utility riguardanti la rete, come ping, trace, lookup, service (portscan semplificato) e molto altro. Il programma si può registrare tramite serial number ma nel nostro caso, sarà patchato soltanto.

Essay

Allora per cominciare, apriamo il NetInfo e vediamo che tipo di protezione ha. Appena aperto, vi si presentera' davanti la solita schemata con scritto:

Quit  I Agree

Segnatevi quello che c'e' scritto nella finestra, accettate ed entrate. Per far sparire la schemata bisogna registrare il programma. Andiamo al menu' e cerchiamo una voce che ci possa portare a registrarlo. Nel nostro caso troveremo "Register NetInfo...". Clickiamoci sopra e vediamo apparire anche qui la solita schemata "User name:" e "License key:". Sciviamo qualcosa a caso e premiamo Ok. Ovviamente apparira' (se non e' stato gia' crackato il programma) un messaggio di errore. Segnamoci quello che dice, e cioe':

"Incomplete or incorrect information."

Bene. Chiudiamo questa finestra ed andiamo nella fatidica finestra di "About" (da ora in poi "About Box"). Leggiamo sotto:

"This is a unregistred copy for evaluation use only." etc. etc.

segnamoci pure questa frase. Adesso abbiamo finito di esaminare il programma, perche' come vi sarete resi conto che una volta eliminate queste frasi, non c'e' piu' niente che possa far capire ad una persona che il programma e' demo. Apriamo il W32dasm e disassembliamo il NetInfo. Andate al menu' Refs e scegliete: "Dialog References". Nella finestra che vi apparira' non c'e' altro che una lista delle finestre del programma. A noi ci apparira' quindi questo:


Dialog: DialogID_0064
Dialog: DialogID_0064, CONTROL_ID:03E9, "THANK YOU FOR TRYING NETINFO!"
Dialog: DialogID_0064, CONTROL_ID:03EA, "http://www.netinfo.co.il"
Dialog: DialogID_0064, CONTROL_ID:03EB, "I understand that I may use NetInfo only"
Dialog: DialogID_0064, CONTROL_ID:03EC, "purposes, subject to the terms of the Li"
Dialog: DialogID_0064, CONTROL_ID:03ED, "and that any other use requires a single"
Dialog: DialogID_0065
Dialog: DialogID_0065, CONTROL_ID:00FF, ""
Dialog: DialogID_0065, CONTROL_ID:0421, ""
...


Dunque come avrete notato, c'e' proprio la scritta che ci siamo segnati appena abbiamo aperto il programma "THANK YOU FOR TRYING NETINFO". A questo punto, siete tentati a cliccare su quella scritta per vedere dove vi porta il disassemblatore, ma io vi dico che non dovete cliccare li'. Guardate prima di quella scritta che cosa c'e':

Dialog: DialogID_0064, CONTROL_ID:03E9, "THANK YOU FOR TRYING NETINFO!"

Ecco... DialogID_0064

c'e' l'ID della finestra. Proviamo quindi a vedere che cosa c'e' sopra quella scritta:

Dialog: DialogID_0064

c'e' questa linea che ha lo stesso ID della finestra che ci interessa. Il Wdasm mette nella lista le finestre in ordine di esecuzione. Infatti la nostra parte all'inizio! Ed eccola! Questa linea probabilmente porta al punto di codice che la inizializza!!! Calmi calmi... non vi fate prendere dall'emozione. Siamo ancora agli antipodi (o come disse un mio amico... siamo ancora agli antilopi =))
Ora clicckiamo quindi su questa linea:

Dialog: DialogID_0064

e il Wdasm ci portera' in questo punto:

...

* Possible Reference to Dialog: DialogID_0064
                                 |
:0040154E                         push 00000064
:00401550                         mov dword ptr [esp+0C], esi

...

Perfetto. Ah una cosa... se cliccate piu' volte su quella scritta, in alcuni casi (anche in questo) vi portera' in altre parti del codice che fanno sempre riferimento a quella finestra. Sta a voi trovare la parte giusta. Nel nostro caso la parte di codice sta proprio all'indirizzo 0040154E, poiche' sta quasi all'inizio del programma. Ma cio' non vuol dire niente nella maggior parte dei casi. Un altro modo per capire qual e' la parte giusta e' quella di avviare il programma dal disassemblatore (menu' Debug -> Load process) e quando vi si presenta la finestra davanti cliccate su Step Into e vi segnate l'indirizzo. Ma in questo caso, il metodo appena spiegato non funge, perche' cosi' facendo vi ritrovereste nel bel mezzo della dll MFC42, con indirizzi sballati. Altro metodo e' quello dei tentativi. Cliccate sempre e vedete quanti riferimenti ci sono a quella finestra e tentate ad ogni riferimento il metodo che sto per spiegarvi (cioe' quello per crackare il programma). Dunque per crackare il programma abbiamo detto che vi trovare ora all'indirizzo 0040154E. Ora andate un po' piu' su e cercate qualcosa che richiami questo pezzo il codice, cioe' una chiamata da un jump o da una call. Saliamo un po'e toh! troviamo:


* Referred by CALL at Address:
|:0040212C


Ecco qui! Se dunque cio' che sta sotto l'indirizzo 0040154E carica la finestra incriminata, allora ci deve essere qualcosa che porta il programma a caricarla e quindi, sta sopra :)
Andiamo all'indirizzo della call 0040212C (si ci puo' andare dal menu'):

Goto -> Goto Code Location

Giunti allo spezzone di codice troveremo:

* Reference To: MSVCRT._mbscmp, Ord:0159h
                                 |
:00402112                         Call dword ptr [00416530]
:00402118                         add esp, 00000014
:0040211B                         test eax, eax
:0040211D                         je 00402238
:00402123                         push 00000000
:00402125                         lea ecx, dword ptr [esp+00000098]
:0040212C                         call 00401530
:00402131                         lea ecx, dword ptr [esp+00000094]
:00402138                         mov byte ptr [esp+00004240], 04


Ecco la call che chiama la finestra:

call 00401530

e come (spero) avrete notato prima della call c'e' un jump (je 00402238). In questo caso:

test eax, eax <- Se sono uguali, PF = 1 (PF = Parity Flag)
je 00402238   <- Jump if equal (cioe' PF = 1)

siccome il seriale "non" sara' uguale, PF = 0, jump non salta :))


Pensate un po' a questo:

if (seriale == 'xxx') goto 00402238

se il seriale e' giusto va a 00402238 altrimenti continuano ad essere eseguite le istruzioni dopo il "je 00402238" e si arriva a quella call che porta alla finestra incriminata! Ma prima di questo jump, deve pur essere calcolato il seriale in base al nome? Allora... perche' non salire ancora? Saliamo allora... :)
Ricordate che a 00402238 c'e' la finestra principale del NetInfo. Cerchiamo il solito riferimento al jump o alla call. Saliamo saliamo... eccolo!


* Jump at Address:
|:004020CF
|
:004020FB                         mov ecx, dword ptr [esp+0C]

...


Ovviamente invece di andare a 004020CF e modificare direttamente quell'indirizzo in modo che vada ad aprire la finestra principale, oppure invece di modificare il je 00402238 in jmp 00402238, perche' non patchare questo 004020FB? In fondo... si trova all'inizio della routine che andremo a disattivare, quindi contera' solo che si salta a 00402238, perche' quindi modificare il je 00402238 e far eseguire prima di questa, calcoli inutili?
Quindi andiamo a modificare 004020FB.

004020FB e' di 4 bytes: 8B 4C 24 0C

Avviamo il programma dal wdasm dal menu' Debug -> Load Process, clickiamo su Load e aspettiamo un beep. Poi selezioniamo "Goto Address" scriviamo 4020FB e premiamo invio. A questo punto siamo sulla linea di codice da cambiare.
Clickiamo su "Patch Code" e scriviamo:

jmp 402238

Apparira' questa linea nella lista in basso:

:004020FB                         jmp 00402238

Cliccate su Apply Patch -> Yes, chiudete la finestra e cliccate su Run. Wow!!! La finestra non esce piu'! Avete semi crackato il programma!!! Adesso resta la parte piu' estetica.
Siccome l'istruzione che fara' avviare il programma, ovvero:

jmp 00402238 e' di 5 bytes: E9 38 01 00 00

dovremo modificare il primo byte dell'istruzione successiva. Abbiamo detto che la routine una volta inserita questa istruzione non sara' piu' eseguita, quindi anche se "riviniamo" l'isruzione successiva a 004020FB, non causera' errori, quindi, andiamo all'indirizzo 004020FB e clickiamoci sopra. In basso, nella toolbar troveremo scritto:

... Code Data @:004020FB @Offset 000020FBh in File:NetInfo.exe

bene, prendiamo nota della scritta @Offset, quindi segnamoci: 20FBh Facciamo una copia del file del programma, e apriamola con l'hex editor, cerchiamo questo offset e poi scriviamo i bytes:

E9 38 01 00 00

salviamo ed il programma e' semi patchato. Dico semi, perche' ci resta da eliminare la scritta di errore "Incomplete or incorrect information." e poi quella fastidiosa "This is a unregistred etc. etc.". Andiamo per gradi e seguiamo la stessa tecnica. Eliminiamo "Incomplete or incorrect information": sempre nel Wdasm andiamo al menu' Refs -> String Data References. Perfetto, cercate questa stringa e cliccateci sopra. Ovviamente il fatto che cliccando piu' volte si possa giungere in piu' parti del codice, vale anche qui, perch‚ una stessa stringa per motivi di spazio, puo' essere utilizzata da piu' istruzioni. Nel nostro caso, visto che avviamo una buona dose di c..o, quella stringa viene utilizzata esclusivamente per quell'odioso messaggio. Sterminiamola!!! Clickiamo quindi su quella stringa e il Wdasm ci porta nel codice. Ok ci troviamo davanti a questo:


* Jump ad Address:
|:004115AC
|
:004115E3                         push 00000010 <- Tipo di finestra


* Possible StringData Tef Data Obj -> "Register NetInfo"

:004115E5                         push 0041BFCC <- Titolo finestra


* Possible StringData Ref from Data Obj -> "Incomplete or incorrect information."

:004115EA                         push 0041BFA4 <- Messaggio bastardo!!!
:004115EF                         mov ecx, esi


* Reference To: MFC42.Ordinal:1080, Ord:1080h

:004115F1                         Call 00413728 <- Visualizza finestra

...


Ecco la call che chiama il messaggio. Ah un consiglio... quando vedete che "Call indirizzo" oppure "Jump indirizzo" ha come prima lettera una lettera maiuscola, e' una chiamata ad una dll ed e' inutile andarci:

Jmp 00203022  <- Chiama una funzione di qualche libreria
Call 00223344 <- Idem

call 00332211 <- Questa e' una call normale e si ci puo' andare benissimo
jmp 00332211  <- Idem

Questo era un trucchetto per rendere piu' veloce la lettura del codice :))
Ritornando al NetInfo, ora che abbiamo trovato la call incriminata, andiamo su e come infatti il Wdasm ci dice che questo codice viene chiamato da:

jmp 004115AC

Andiamoci! Ecco quello che ci appare:

...

|:004115AC                         jne 004115E3

...


I bytes sono due...

A questo punto sareste tentati di scrivere je 004115E3. Ma prendiamo l'ipotesi che io con una supermega botta di culo becco il seriale giusto e lo scrivo... il codice poi non mi funziona e il programma mi da l'errore. Io invece voglio che il programma accetti qualsiasi seriale senza alcun errore, quindi il jne 004115E3 *non* deve saltare, ma deve essere eseguito il codice che sta dopo. E visto che questo jump non serve... eliminiamolo:

verra' cosi' il codice:

:004115AC 90 nop <- NOP = No OPeration
:004115AD 90 nop


percio' i bytes da scrivere all'indirizzo 004115AC sono 90 90.
Come sempre cliccate sull'istruzione da cambiare e segnatevi l'Offset.

Ora resta da modificare l'About Box in modo che sparisca quella scritta "This is a unregistred copy etc. etc." e far in modo che appaia la sigla che dice registrato a nome di X. Bene, come al solito cerchiamo "This is etc. etc." nelle stringhe, e una volta trovata, il codice sara':

...

* Jump at Address:
|:0040F1F2(C) <- La C indica che il jump e' condizionato
|

* Possible StringData Ref from Data Obj -> "This is an unregistered copy for
                                        -> "evaluation use only."

|:0040F23F                         push 0041BED0
...


Come al solito (ormai lo sapete), andiamo all'indirizzo 0040F1F2 che chiama questa istruzione e troviamo la stessa situazione del jump precedente:

...

|:0040F1F2 754B                     jne 0040F23F

...         ^
           two bytes for two nop or two nop for two bytes??? =))


ecco qui... i bytes da noppare sono quindi due e... segnato l'offset datevi da fare!!! :))

Ora chiudete il Wdasm e aprite l'hex editor. Una volta fatto (come sono puntiglioso... sembro uno di quei libri della mondadori... portare il dito al pulsante di accensione del PC e spingerlo in avanti =)), cambiate i bytes e provate il programma. Adesso se provate ad usarlo, appare qualcosa di nuovo nel menu' File -> Clear.
Infatti appare "Register NetInfo...". E questo se si seleziona, porta alla finestra di registrazione del NetInfo. Be', questo non mi piace :))
Vogliamo il programma completo? Allora diamoci da fare:

Apriamo l'hex editor, e cerchiamo la stringa "Register". Trovata? Bene, a me appare cosi':

Register.NetInfo.....Services etc. etc.

Ovviamente cambiamo la scritta, ma dobbiamo inserirne una di lunghezza uguale... io suggerisco:

Registered NetInfo!

Che ne dite? Bene, cambiamola e voila'... funziona. Segnatevi *sempre* gli offset e i bytes che cambiate... poi vi spiego. Ah... cercando la stringa e' probabile che ne trovate un'altra simile. Quella non cambiatela, perche' se notate, sotto a quella c'e' scritto:

"Incomplete or incorrect information."

E' evidente che si tratta del titolo di quella finestra che dava il messaggio di errore se si inseriva un S/N errato, e siccome non apparira' piu', non c'e' bisogno di cambiarla, no? Oppure se volete cambiarla e siete proprio fissati col cracking completo... cambiatela :))

Altra cosa che dobbiamo fare e' questa:

Chiudete il Wdasm e l'Hex workshop, fate una seconda copia del file "NON PATCHATO" e apritelo con l'Exescope. Adesso avrete anche la lista dei menu'. Bene, cercate nel menu' "Help" la voce "Register NetInfo..." e sostituitela con "Registered NetInfo!". Bene, adesso cliccate su un'altra voce e il programma vi chiedera' se volete applicare le impostazioni cambiate. Accettate e chiudete il programma. Riaprite l'hex editor e aprite sia il file appena modificato con exescope che quello "non patchato originale". Con la funzione "Compare" che incorpora l'Hex Workshop confrontate i due programmi e annotate le differenze, cioe' i bytes con i relativi offset. Una volta fatto, cambiate quei bytes modificati dall'Exescope al files precedentemente da voi patchato con i bytes trovati nel Wdasm. Adesso avete veramente fatto un bel lavoretto complimenti... avete crackato il vostro NetInfo.
Ecco qui di seguito la lista dei bytes che ho cambiato:

*****************************************************************************
Description: Jump initial nagscreen
Address: 004020FB
Offset: 20FBh
Instruction: mov ecx, dword ptr [esp+0C] -> jmp 00402238
Byte to write: E9 38 01 00 00

Description: Registered copy in about screen
Address: 0040F1F2
Offset: F1F2h
Instruction: jne 0040F23F -> nop nop
Byte to write: 90 90

Description: Bypass error message of invalid code (and now any code is correct!!!)
Address: 004115AC
Offset: 115ACh
Instruction: jne 004115E3 -> nop nop
Byte to write: 90 90

Description: Write "Registered NetInfo!" into main menu!
Address: 00405E67
Offset: 1B4B9h
Instruction: push 0041B4B0 (don't change because it's identical)
Byte to write: 65 64 20 4E 65 74 49 6E 66 6F 21

Description: Write "Registered NetInfo" into menu
Address: nothing
Offset: 204DEh
Instruction: nothing
Byte to write: 65 00 64 00 20 00 4E 00 65 00 74 00 49 00 6E 00 66 00 6F 00 21
*****************************************************************************


Segnate sempre gli offset, perche' se volete fare il crack... come lo fate senza gli offset??? =))

Con IPMonitor e' la stessa identica tecnica. Apritelo vedete le protezioni, cercate i messaggi e patchate!!!
Cmq eccovi gia' pronta la lista dei bytes da cambiare, perche' penso sia inutile ripetere le stesse cose che ho ripetuto sopra, non credete? La protezione e' completamente identica, cioe' un je -> jmp e due jne -> nop nop.


*****************************************************************************
{IPMonitor}
Description: Jump initial nagscreen
Address: 004050E6
Offset: 50E6h
Instruction: je 4050FC -> jmp 4051FC
Byte to write: E9 11 01 00 00 90

Description: Registered copy in about screen
Address: 00404595
Offset: 4595h
Instruction: jne 004045E2 -> nop nop
Byte to write: 90 90

Description: Bypass error message of invalid code (and now any code is correct!!!)
Address: 00406291
Offset: 6291h
Instruction: jne 004062CA
Byte to write: 90 90

Description: Write "Registered IPMonitor!" into main menu!
Address: 004056A9
Offset: C5D9h
Instruction: push 0040C5D0 (don't change because it's identical)
Byte to write: 65 64 20 49 50 4D 6F 6E 69 74 6F 72 21

Description: Write "Registered IPMonitor into menu
Address: nothing
Offset: E188h
Instruction: nothing
Byte to write: 65 00 64 00 20 00 49 00 50 00 4D 00 6F 00 6E 00 69 00 74 00 6F 00 72 00 21
*****************************************************************************

Note finali

A special thanks go to:

~ Mariafrancesca (mi sta facendo sklerare! Xche' non mi vuoi??? So er bono dell'ala Sud =)
~ PgreKo
~ TiN_MaN
~ Phobos
~ Quequero
~ --== ALoR ==--
~ A special thanks go to all UIC members!

Dream dreaming dreamland... and... always hack the world from the universe!

by «~{Årtêmis · 23ãm}~»

Disclaimer

Vi ricordo che il programma va comprato e non va crackato assolutamente. Ovviamente non mi ritengo responsabile in nessun frangente dell'uso che il lettore potrebbe fare di questo tutorial.

This tutorial has written only for educational purpose and the writer isn't responsable of the use that the reader will can do of this.

Noi reversiamo al solo scopo informativo e di miglioramento del linguaggio Assembly.

Capitoooooooo????? Bhè credo di si ;))))