Zoom Icon

Neotrace212

From UIC

NeoTrace 2.12 Nag-Remove

Contents


Infos
Author: Int19
Email: Int19@hotmail.com, UIN: 4044843
Website: None
Date: 27/01/2000 (dd/mm/yyyy)
Level: Working brain required
Language: Italian Image:Flag_Italian.gif
Comments: Use the force, Luke.
Son Stanco, Son Stufo.



Introduzione

Cercherò di illustrarvi il metodo generale da seguire per rimuovere un nag, assumendo che il lettore abbia una conoscenza base dell'assembly. Per rendere meno ostica la comprensione del testo tenterò di spiegare ogni termine tecnico che introdurro', quindi anche se siete alle prime armi non disperate e proseguite nella lettura.


Tools usati

WinFrog (versione modificata di WinShow): Utility generale per identificare un particolare elemento di una finestra
SoftICE400 (Debugger): per dare uno sguardo al codice asm del programma a runtime
ProcDump16 (Unpacker): per poter "scompattare" il programma
GetTyp251 (Utility): ci dice se un file è "packato" e se lo è con quale tipo di "packer"
Hiew616 (Editor Assembly/Esadecimale): per rendere permanenti le modifiche apportate
Li troverete tutti sul sito che ognuno di noi dovrebbe avere nella propria lista: PlayTools


URL o FTP del programma

Potete prelevare NeoTrace direttamente da: http://www.neoworx.com/neotrace/download.asp (inattivo)


Notizie sul programma

NeoTrace è una sorta di TraceRoute visuale, consente di ottenere una rappresentazione grafica dell'instradamento dei pacchetti attraverso la rete. Lanciando il programma ci troviamo di fronte alla finestra del nag-screen che attende da parte nostra la pressione di uno tra i tasti Trial/Register/Quit Pigiando Trial, il nag scompare e viene avviato il programma, premendo Register vengono visualizzate istruzioni su come poter ordinare la versione Registrata, ovviamente premendo Quit si esce immediatamente.


Essay

Ogni buon cracker/reverser non inizierebbe mai una sessione senza possedere gli attrezzi del mestiere, quelli che vengono chiamati "Tools". È veramente fondamentale utilizzare le adeguate risorse di cui si può disporre, in modo da raggiungere l'obbiettivo nel miglior modo e nel minor tempo possibile. Oltre a quelli che ho utilizzato questa volta, vi consiglio di procurarvi:

Una calcolatrice dotata di ror/rol/shl/shr/xor... nonché conversioni di base (BaseCalc)
Un editor di risorse (Restorator)
Un potentissimo Anti-AntiDebug :-) (FrogsICE)
Un disassemblatore (IDA)
Un monitor delle operazioni compiute sui files (FileMon)
Un monitor delle operazioni compiute sul registro (RegMon)
Un tool per fare delle copie del registro in momenti differenti e poter tener traccia le chiavi modificate (RegSnap)
Un monitor delle API che vengono richiamate (APISpy)
Un Memory Dumper (ICEDump)

Detto questo, è ora di partire con il tute.
Iniziamo raccogliendo qualche informazione riguardanti il programma.
Utilizzando GetTyp, otteniamo le seguenti info...


Found no known modifier or compiler.
Name Virt size RVA Phys size Phys Ofs
.text 00026000h 00001000h 00026000h 00000000h
.rdata 00003000h 00027000h 00003000h 00000000h
.data 00009D34h 0002A000h 00001000h 00001000h
.rsrc 000B4F28h 00034000h 00005000h 00002000h
.neolit 000062BAh 000E9000h 00001BCAh 00007000h

A quanto pare GetTyp dice che il prog. non è "packato" (si dice che un programma è packato quando esso è compresso, ad ogni sua esecuzione verrà richiamata una particolare routine interna del programma che si occuperà di decomprimere il programma in memoria e poi eseguirlo. Per poterne modificare il codice contenuto nel file è necessario prima ottenere il file decompresso, per fortuna abbiamo i nostri fidati tools che ci rendono semplice questo lavoro).
Anche se GetTyp non sembra aver rilevato che il programma è packato, quella sezione ".neolit" all'interno del file è piuttosto sospetta, considerate anche che la produttrice di NeoTrace è la NeoWorx (che ha sviluppato il packer NeoLite). Apriamo ProcDump e vediamo se ne tiriamo fuori qualcosa di buono, selezioniamo "Unpack" e scegliamo come unpacker Neolite2, dopo qualche secondo ci verrà richiesto dove desideriamo salvare il programma "ripulito" (unpackato e privo delle chiamate alle routine di decompressione).
Se ora confrontate i 2 files, noterete la notevole differenza di dimensioni:

CLEAN.EXE 970.752
NEOTRACE.EXE 367.627

Adesso lanciamo il file CLEAN.EXE e lavoriamo un po' per rimuovere il nag.
Ci troviamo davanti alla finestra del nag che attende la pressione di un pulsante, grazie a WinFrog possiamo scoprire l'handle della finestra principale che contiene i pulsanti, nel mio caso: 6d0 (hex) sicuramente voi avrete un'altro valore. In alternativa a WinFrog, potete usare il comando "task" dal quale ricaverete il nome del task del programma (Neotrace) e successivamente "hwnd Neotrace" che vi sparerà una lista di tutti i controlli della finestra di Neotrace e relativi handle, a questo punto dovrete individuare qual'e' l'handle della finestra principale (fase non sempre semplicissima), come avrete capito anche voi, WinFrog è caldamente consigliato poiché "snellisce" il lavoro. Dunque, una volta individuato l'handle della finestra (con WinFrog o tramite task/hwnd) CTRL-D ed eccoci in SoftIce, piazziamo un breakpoint bmsg HandleTrovato wm_command ("bmsg 6d0 wm_command") e procediamo pigiando il pulsante Trial.
SoftIce compare ed in questo momento dovremmo trovarci di fronte alla parte di codice del modulo user, pigiamo un po' di volte F12 fino a quando non rientriamo in una parte di codice di neotrace, dovremmo aver raggiunto questo punto...

Call USER32!EndDialog <--- prima eravamo dentro a questa call
POP EDI <--- Arriviamo qui
XOR EAX, EAX
POP ESI
ADD ESP, F0
RET

A quanto pare il codice qui sopra si occupa di chiudere il nag. Al termine del ret ci troviamo di nuovo dentro un modulo di sistema, Kernel32 come prima continuamo a pigiare F12 fino a ritovarci in una zona di codice di neotrace e finalmente arriviamo qui (***)...

414A00 CALL 4092A0
414AD5 ADD ESP, 04
414AD8 PUSH 00 <---| Parametri per
414ADA PUSH 004161D0 | richiamare
414ADF PUSH 00 | la funzione
414AE1 PUSH 00000226 | DialogBoxParamA
414AE6 PUSH ESI <---| (Identificati consultando una Api-Reference)
414AE7 Call USER32!DialogBoxParamA <--- Creazione del NAG
414AED CMP EAX, 2 <--- (***)Arriviamo qui, EAX vale 1
414AF0 POP ESI
414AF1 JNZ 414AF6 <---| salta se non è stato pigiato il pulsante "Quit"
414AF3 XOR EAX,EAX | altrimenti
414AF5 RET <---| esce dalla routine e dal programma

Come potete vedere ora, avremmo anche potuto piazzare un semplice breakpoint sulla funzione DialogBoxParamA e saremmo arrivati allo stesso punto, lo scopo del tute è però quello di mostrare un approccio che sia il più generale possibile per affrontare i nag. Ora che abbiamo identificato la call responsabile della comparsa e chiusura del nag (DialogBoxParamA) non sarà difficile ripulire il programma. È sufficiente non richiamarla per evitare il noioso nag, inoltre osservate che se viene pigiato il pulsante "Trial", in eax viene restituito 1 quindi sarà opportuno settare EAX ad 1 prima di saltare a 414AF6, poiché in seguito il programma potrebbe utilizzare EAX per qualche operazione. Una parte importante nella rimozione del nag è fare attenzione a non compromettere lo stack, mi spiegherò meglio.. Se osservate il codice sopra, noterete che prima della call vengono effettuate 4 push, queste push, servono per passare i parametri alla funzione DialogBoxParamA, la quale si occuperà poi della loro rimozione dallo stack, qui di seguito vi ho riportato i cambiamenti del puntatore dello stack ad ogni esecuzione delle istruzioni....

ESP=72FD7C
414AD8 PUSH 00 --> ESP=72FD78
414ADA PUSH 004161D0 --> ESP=72FD74
414ADF PUSH 00 --> ESP=72FD70
414AE1 PUSH 00000226 --> ESP=72FD6C
414AE6 PUSH ESI --> ESP=72FD68
414AE7 Call USER32!DialogBoxParamA --> ESP=72FD7C
ESP=72FD7C

Se noi ci limitassimo a nooppare la call, il puntatore allo stack (ESP) avrebbe come valore 72FD68 e non quello che dovrebbe avere se la call fosse stata eseguita (72FD7C) quindi punterebbe a dati inconsistenti e probabilmente il prog. crasherà dopo qualche operazione sullo stack. Quindi, per assicurarci che tutto fili liscio, dobbiamo anche nooppare le varie push dei parametri sullo stack.

Ora sta a voi scegliere come modificare il prog. per non mostrare più il nag, ad esempio potreste fare una modifica del genere (ho scritto le istruzioni modificate in minuscolo)

CALL 4092A0
ADD ESP, 04
mov eax, 1 <--- per far credere al prog. che si è pigiato il pulsante "Trial"
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
CMP EAX,2
JNZ 414AF6

oppure, più semplicemente cosi'...

CALL 4092A0
ADD ESP, 04
mov eax, 1
pop esi
jmp 414AF6

Le variazioni sono molteplici, solitamente si sconsiglia di ricorrere ai nop poiché il programma potrebbe fare un auto-check per controllare ad esempio se compaiono sequenze di 3 o più nop. Inoltre è buona norma cercare di forzare il meno possibile il normale flusso del programma a meno di non conoscere MOLTO bene il comportamento del codice che si ha sottomano.

Se ora aprite il file con un editor esadecimale e rendete definitive le modifiche il nag sarà deltutto scomparso.


Note finali

Un ringraziamento a tutti coloro che hanno condiviso le loro conoscenze diffondendo tutes sull'argomento, sono davvero troppi per poterli nominare, in ogni caso, se hai mai scritto un tute considerati pure in questa lista, poiché ognuno ha qualcosa da insegnare (ed io ho ancora molto da imparare:-P). Un saluto a tutti i compagni della UIC in particolare Ritz, GR!SU', Syscalo, BlackDruid, AndreaGeddon, continuate così gente !!! Ed ovviamente non manco di ringraziare tutti i papà fondatori della UIC. Il Socio passa e chiude, Ciau alla prossimaaaaaaaaaaa.


Disclaimer

I documenti qui pubblicati sono da considerarsi pubblici e liberamente distribuibili, a patto che se ne citi la fonte di provenienza. Tutti i documenti presenti su queste pagine sono stati scritti esclusivamente a scopo di ricerca, nessuna di queste analisi è stata fatta per fini commerciali, o dietro alcun tipo di compenso. I documenti pubblicati presentano delle analisi puramente teoriche della struttura di un programma, in nessun caso il software è stato realmente disassemblato o modificato; ogni corrispondenza presente tra i documenti pubblicati e le istruzioni del software oggetto dell'analisi, è da ritenersi puramente casuale. Tutti i documenti vengono inviati in forma anonima ed automaticamente pubblicati, i diritti di tali opere appartengono esclusivamente al firmatario del documento (se presente), in nessun caso il gestore di questo sito, o del server su cui risiede, può essere ritenuto responsabile dei contenuti qui presenti, oltretutto il gestore del sito non è in grado di risalire all'identità del mittente dei documenti. Tutti i documenti ed i file di questo sito non presentano alcun tipo di garanzia, pertanto ne è sconsigliata a tutti la lettura o l'esecuzione, lo staff non si assume alcuna responsabilità per quanto riguarda l'uso improprio di tali documenti e/o file, è doveroso aggiungere che ogni riferimento a fatti cose o persone è da considerarsi PURAMENTE casuale. Tutti coloro che potrebbero ritenersi moralmente offesi dai contenuti di queste pagine, sono tenuti ad uscire immediatamente da questo sito.

Vogliamo inoltre ricordare che il Reverse Engineering è uno strumento tecnologico di grande potenza ed importanza, senza di esso non sarebbe possibile creare antivirus, scoprire funzioni malevoli e non dichiarate all'interno di un programma di pubblico utilizzo. Non sarebbe possibile scoprire, in assenza di un sistema sicuro per il controllo dell'integrità, se il "tal" programma è realmente quello che l'utente ha scelto di installare ed eseguire, né sarebbe possibile continuare lo sviluppo di quei programmi (o l'utilizzo di quelle periferiche) ritenuti obsoleti e non più supportati dalle fonti ufficiali.