Zoom Icon

Daily ToDo List 2.10

From UIC

Reversing and Patching Daily ToDo List 2.10

Contents


Daily ToDo List 2.10
Author: Eu4ia
Email: eu4ia.3(at)gmail.com
Website:
Date: 23/01/2007 (dd/mm/yyyy)
Level: Some skills are required
Language: Italian Flag Italian.gif
Comments: Visual Basic 6 in P-Code



Introduction

Iniziamo col dire che sono un newbie ed è il mio primo Tutorial (rabbrividiamo!) ... superato lo spavento procedo col dire che il programma in questione è semplicemente un Reminder di attività, un programma cioè con lo scopo di ricordarci i nostri appuntamenti, attività o altro. Scritto in Visual Basic 6 e compilato in Pseudo-Codice, chiamato P-Code.


Tools


UltraEdit o altro editor esadecimale
PEiD - Identifica eventuali Packers e/o linguaggio di programmazione
RegMon - Monitor del registro di sistema
ExDec - Decompilatore per VB in P-Code
WKTVB Debugger - Debugger per VB in P-Code


Link e Riferimenti

http://www.dextronet.com Target - Dextronet Daily ToDo List
Tutorial e cenni sul P-Code, di pincopall.



Essay

Lanciamo il programma che ci mostrerà il Nag Screen con la possibilità di registrarlo tramite il pulsante Unlock, premiamolo ed inseriamo "Test" come Name e 0123456789 come Serial e leggiamo il messaggio d'errore. Ci sta dicendo che il Name è troppo corto, allora proviamo ad inserire "Eu4ia" con lo stesso Serial .. niente stesso errore, allora proviamo con "Eu4ia!" e leggiamo il nuovo messaggio d'errore. Ci sta dicendo che il Serial è troppo corto (o meglio non della lunghezza giusta), allora proviamo ad inserire 40 numeri .. ma un attimo ci blocca al 39° ?!? Ok proviamo con 39 numeri e leggiamo l'errore .. "Your serial code is wrong, ..."!

Ok, così facendo abbiamo capito che il campo Name è di almeno 6 caratteri ed il Serial di 39 esatti!

Aprendo il programma con PEiD ci viene detto che è scritto in Visual Basic 5 o 6. Ho verificato se vengono ricercate chiavi nel registro di sistema tramite RegMon ed effettivamente vengono cercate le chiavi Name e Serial in HKCU/Software/Dextronet/DailyToDoList.

Quindi possiamo immaginare che se non sono presenti queste 2 chiavi e non correttamente valorizzate il programma ci proponga l'ormai noto Nag Screen. Decompilando con Olly ci troviamo davanti a qualche cosa di strano .. tutte le funzioni vengono chiamate tramite numeri od Offest calcolati da una funzione VB chiamata MethCallEngine e ci si perde dentro nel giro di 10 secondi .. ma che diavolo stiamo osservando.

Questo è un programma compilato in Pseudo-Code! (Vi rimando alla lettura del Tutorial di pincopall per i cenni sul P-Code).

Le uniche cose importanti da sapere sul P-Code in questo caso sono: che le Call si chiamano Proc, i JMP (anche condizionali) si chiamano Branch (sequite dalle condizioni F,T ecc) e le RET si chiamano ExitProc.

E' giunto l'ora di farci dare una mano da ExDec, chiediamogli di decompilare per noi il programme e .. kaboom! .. eccoci le strane righe apparirci più comprensibili, salviamone il testo, potrebbe tornare utile.

Cerchiamo con il nostro editor preferito (magari Ultraedit) all'interno del nostro file di testo appena salvato l'indirizzo 459A78, ci si ritrova infatti in quella che sembra essere la procedura di controllo del registro di sistema dove vengono verificate e lette le 2 chiavi Name e Serial.


Proc: 459b34

459A78: 1b LitStr: Name
...
459A81: 1b LitStr: Software\Dextronet\DailyToDoList\
...
459AAB: 1b LitStr: Serial
...
459AB4: 1b LitStr: Software\Dextronet\DailyToDoList\
...
459AF2: 1c BranchF: 459B05
...
459B31: 15 ExitProcI2


Cerchiamo poi l'indirizzo 45F378, ci si ritrova in quella che sembra essere la procedura di controllo dell'accoppiata Name e Serial.

Proc: 45f378

45F154: f4 LitI2_Byte: 0x0 0 (.)
...
45F1AA: 3a LitVarStr: ( local_009C ) Your name is not long enough, please ensure that <br /> you typed it EXACTLY like in your registration <br /> email that you have received.
...
45F203: 3a LitVarStr: ( local_009C ) Your serial code has a wrong length, please <br /> ensure that you typed it EXACTLY like in your <br /> registration email that you have received.<br /> We recommend you to use clipboard.
...
45F2C7: 1b LitStr: <b>THANK YOU VERY MUCH FOR YOUR REGISTRATION!</b>
...
45F2D8: 1b LitStr: Daily To-Do list will now be restarted, please<br /> start it again!
...
45F334: 3a LitVarStr: ( local_009C ) Your serial code is wrong, please ensure that <br /> you typed it EXACTLY like in your registration <br /> email that you have received. We recommend you <br /> to use clipboard.
...
45F377: 13 ExitProcHresult

Prendiamo nota di questi 2 indirizzi particolari 459A78 e 45F154!

Prima di proseguire vi suggerisco di creare le 2 voci di registro Name e Serial come stringhe e valorizzarle per ora come "Eu4ia!" e "000111-222333-444555-666777-888999-0099".


Il formato XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXXXX-XXXX l'ho dedotto studiando il codice, in realtà
i "-" non vengono considerati come tali e quindi potrebbero essere tranquillamente dei numeri!

Proviamo ora a eseguire il Debug con WKTVB Debugger.

Appena lanciato ci troviamo all'Entry Point 469D88, premiamo F10 (Trace Over) fino a 469E4D e seguiamo questo BranchF (che equivale ad un JNE/JNZ con codice 1C) con un F8 e ci ritroviamo in 469E90. Premiamo F10 fino a 469EA5 in cui ci troveremo a saltare nella procedura chiamata modRegistration! (in 459A78 che poi è il primo indirizzo ricercato nel testo prodotto da ExDec poco prima) ed entriamoci con un F8. Ora ci troviamo appunto in 459A78.

Procediamo con degli F10 fino a 459A9E e noteremo che viene letta la stringa 'Eu4ia!' (questo è il contenuto della chiave Name nel registro) procediamo fino a 459AD1 con degli F10 e noteremo che viene letta un'altra stringa '000111-222333-444555-666777-888999-0099' (questo è il contenuto della chiave Serial nel registro).

Continuiamo con degli F10 fino al BranchF in 459AF2, questo salto non verrà fatto e si proseguirà come "unregistered" a meno che non modifichiamo quel BranchF (o meglio il P-Code 1C in 1D cioè in un JE/JZ) quindi premiamo Edit, modifichiamo quell'1C in 1D e premiamo Patch Now!

Attenzione ogni Patch eseguito ora verrà fatto solo in memoria e non nel file eseguibile, li lo faremo dopo.

Ora, dopo aver pathcato premiamo F8 e ci ritroveremo in 459B05 a dimostrazione che il salto è stato eseguito. Continuiamo con gli F10 fino a 469B31 e su questa ExitProc premiamo F8. Continuiamo con gli F10 fino a 469EF6 e su questo BranchF premiamo F8 e con F10 fino a 469F9B, ancora F8 ed F10 fino a 469FDF. Qui viene deciso se mostrare o meno il Nag Screen e quindi modifichiamo come sopra questo salto da 1C ad 1D e premiamo F8 e poi F10.

A questo punto se tutto è andato bene il programma parte correttamente. Benone .. ci siamo quasi!

A questo punte se abbiamo capito bene sarà necessario creare un file per aggiungere al registro le chiavi Name e Serial e modificare quei 2 salti in 459AF2 ed in 469FDF! Ok .. proviamo!

Editiamo il nostro file exe con un editor esadecimale tipo Ultraedit e modifichiamo quei salti sostituendo gli 1C con degli 1D (ricordate che gli offset vanno calcolati sottraendo 400000 quindi a 59AF2 e 69FDF) e creiamo un file .reg contenenti le 2 chiavi valorizzate a piacere. Il gioco dovrebbe essere fatto!

Aggiungo una piccola nota: se tutto è andato bene noterete che la finestra del programma conterrà il vostro Name seguito dal numero di user fra parentesi ( ). Questo numero equivale alle ultime 4 cifre del Serial!


Note Finali

I miei ringraziamenti vanno a:
- Quequero per un fatto di rispetto per il cervellone che si ritrova ;) e per aver creato la UIC
- Zero_G che mi ha introdotto in questo mondo meraviglioso quanto complesso
- pincopall per il suo tutorial sul p-code senza il quale sarei a girarmi i pollici anzichè scrivere queste righe ;)
- Tutti voi che mi avete seguito nonostante la premessa e a tutti i ragazzacci del forum!
- Una pacca sulla spalla anche a me per aver premuto questi 8892 caratteri sulla tastiera ;)

Eu4ia


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 malevole 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.