NeoTrace212
Nag-Remove


27/01/00

by "Int19"

 

 

UIC's Home Page

Published by Quequero


Use the force, Luke

Il target non è difficile ma il tute è ugualmente ottimo...bravo int

Son Stanco, Son Stufo.
UIC's form
Home page: al momento nessuna 
E-mail: [email protected]
Int19 aka Il.Socio, ICQ:4044843
UIC's form

Difficoltà

(X)NewBies ()Intermedio ( )Avanzato ( )Master

 

Con questo semplice tute spero di aiutare alcuni di voi ad avvicinarsi a questo insteressante mondo


NeoTrace212
Nag-Remove
Written by Il Socio

Introduzione


Cerchero' 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 tentero' 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 e' "packato" e se lo e' 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

Notizie sul programma 

NeoTrace e' 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

RISPETTATE ASSOLUTAMENTE I MARGINI
Ogni buon cracker/reverser non inizierebbe mai una sessione senza possedere gli attrezzi del mestiere, quelli che vengono chiamati "Tools". E' veramente fondamentale utilizzare le adeguate risorse di cui si puo' 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... nonche' 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, e' 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 &nbspPhys Ofs
.text     00026000h &nbsp00001000h &nbsp00026000h &nbsp00000000h
.rdata   &nbsp00003000h &nbsp00027000h &nbsp00003000h &nbsp00000000h
.data     00009D34h &nbsp0002A000h &nbsp00001000h &nbsp00001000h
.rsrc     000B4F28h &nbsp00034000h &nbsp00005000h &nbsp00002000h
.neolit   000062BAh &nbsp000E9000h &nbsp00001BCAh &nbsp00007000h

A quanto pare GetTyp dice che il prog. non e' "packato" (si dice che un programma e' packato quando esso e' compresso, ad ogni sua esecuzione verra' richiamata una particolare routine interna del programma che si occupera' di decomprimere il programma in memoria e poi eseguirlo. Per poterne modificare il codice contenuto nel file e' 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 e' packato, quella sezione ".neolit" all'interno del file e' piuttosto sospetta, considerate anche che la produttrice di NeoTrace e' 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 verra' 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     &nbsp970.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 sparera' 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 e' caldamente consigliato poiche' "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 e' 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 e' pero' quello di mostrare un approccio che sia il piu' generale possibile per affrontare i nag.
Ora che abbiamo identificato la call responsabile della comparsa e chiusura del nag (DialogBoxParamA) non sara' difficile ripulire il programma.
E' sufficiente non richiamarla per evitare il noioso nag, inoltre osservate che se viene pigiato il pulsante "Trial", in eax viene restituito 1 quindi sara' opportuno settare EAX ad 1 prima di saltare a 414AF6, poiche' in seguito il programma potrebbe utilizzare EAX per qualche operazione.
Una parte importante nella rimozione del nag e' fare attenzione a non compromettere lo stack, mi spieghero' 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 occupera' 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. crashera' 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 piu' 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 e' 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, piu' 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 poiche' il programma potrebbe fare un auto-check per controllare ad esempio se compaiono sequenze di 3 o piu' nop.
Inoltre e' 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 sara' 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, poiche' 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 cosi' gente !!!
Ed ovviamente non manco di ringraziare tutti i papa' fondatori della UIC. Il Socio passa e chiude, Ciau alla prossimaaaaaaaaaaa.

Disclaimer

Vorrei ricordare che il software va comprato e  non rubato, dovete registrare il vostro prodotto dopo il periodo di valutazione. Non mi ritengo responsabile per eventuali danni causati al vostro computer determinati dall'uso improprio di questo tutorial. Questo documento è stato scritto per invogliare il consumatore a registrare legalmente i propri programmi, e non a fargli fare uso dei tantissimi file crack presenti in rete, infatti tale documento aiuta a comprendere lo sforzo immane che ogni singolo programmatore ha dovuto portare avanti per fornire ai rispettivi consumatori i migliori prodotti possibili. Noi reversiamo al solo scopo informativo e di miglioramento del linguaggio Assembly. Capitoooooooo????? Bhè credo di si ;)))) 

 
UIC's page of reverse engineering, scegli dove andare:

Home   Anonimato   Assembly    CrackMe   ContactMe   Forum       
    Iscrizione   Lezioni    Links   NewBies   News   Playstation        
  Tools   Tutorial   Search   UIC Faq

UIC