Zoom Icon

Vehicle spy 3 reversing

From UIC Archive

Vehicle Spy 3

Contents


Vehicle spy 3 reversing
Author: crystalboy
Email:
Website:
Date: 01/02/2012 (dd/mm/yyyy)
Level: Luck and skills are required
Language: Italiano
Comments: Buona lettura :D



Introduzione

Ciao a tutti premetto che per me questo è il primo tutorial quindi mi scuso se non riuscirò a spiegare alcuni concetti (per me ancora sconosciuti essendo un newbie).
Per caso sono incappato in questo software.

Questo software permette di analizzare, sniffare ed emulare le comunicazioni in linea Canbus ampiamente utilizzate nel settore automotive e non, per essere un pochino più chiaro farò qualche esempio.
Come tutti sappiamo nelle vetture di moderna generazione l’elettronica è sempre più presente insieme alla meccanica per effettuare controlli su sicurezza o più comunemente per aggiungere “optional” alla vettura.
Ogni funzione presente in macchina (in linea del tutto generale) è visionata e pilotata tramite una centralina elettronica.
Questo software tramite l’ausilio di un’interfaccia hardware permette di visionare e volendo anche modificare le comunicazioni interponendosi tra le varie centraline elettroniche.
E’ possibile utilizzare il software solamente in presenza di un hardware connesso opportunatamente licenziato
(il controllo è effettuato sul numero hardware dell’interfaccia connessa).
La licenza è gestita da un file con estensione .lic che aimè è criptato. La necessità è stata di abilitare un'altra interfaccia hardware in mio possesso (con un differente numero hardware) per permettermi di utilizzarla ugualmente nonostante non sia licenziata.
Come i guru del reversing insegnano per affrontare nel migliore dei modi il nostro target bisogna studiarlo accuratamente, la calma è la virtù dei forti e un pochino di tempo nello studio preliminare può aiutare a evitare di sbattere la testa per ore senza ricavare un ragno dal buco.



Tools & Files

  • OllyDbg : a detta di molti il miglior debugger a 32bit.
  • PEiD : rileva i più comuni packers, cryptors e tipologia di compilatore utilizzato. La sua funzione può essere estesa tramite l’ausilio di plugin aggiuntivi.
  • Tsearch : Utilizzato originariamente su videogames per pc per modificare in RAM mentre il gioco era in esecuzione alcuni parametri al fine di creare trucchi come munizioni infinite o cose simili. L’ho riutilizzato come memory scanner per ricercare nel processo attivo del nostro software quello che mi serviva.


URL o FTP del programma


Essay

Studio preliminare target

Esattamente come succede in natura il Leone prima di attaccare la sua preda la studia attentamente per scoprirne i punti deboli; allo stesso modo faremo noi col nostro software. :D
Questa è la fase del reversing più importante poiché ci si fa un’idea di cosa dovremo affrontare evitando di steppare a caso ogni riga del disassemblato. Apriamo il programma con PEiD per verificare se è utilizzata qualche protezione sull’eseguibile.


Vehicle Spy 3 img1.jpg


Da questa prima analisi vediamo che il compilatore usato è Borland C++ 1999. Si evince che il programma non è packato con nessun packers ed è già un’ottima notizia. Continuiamo la nostra analisi utilizzando il plugin di PEiD Krypto ANALyzer per visualizzare eventuali criptature del codice.


Vehicle Spy 3 img2.jpg


Vehicle Spy 3 img3.jpg


Vediamo parecchie cose da questa prova, inizialmente ho pensato che ci fosse una criptatura di mezzo ma esse sono inutili per la nostra causa poiché l’eseguibile non è affatto criptato (questo si può solamente scoprire aprendolo in OllyDbg). Lo studio preliminare è terminato, non essendoci packers e criptature di mezzo possiamo dormire sonni tranquilli. Abbiamo scoperto tutto ciò che era necessario per il nostro scopo.


Primo run del software

Come precedentemente accennato il software in questione per funzionare ha necessariamente bisogno di un file di licenza. Fortunatamente nel mio caso avevo già una licenza valida per un’interfaccia la numero hardware 32262.
Eseguendo il tasto Run in OllyDbg il programma parte correttamente.


Vehicle Spy 3 img4.jpg


Come visibile dalla foto il programma richiede il file di licenza, provvedo ad aggiungerlo e il risultato è il seguente:


Vehicle Spy 3 img5.jpg


La licenza è riconosciuta correttamente, sono inoltre riportate informazioni riguardanti i dati contenuti in essa. Nome compagnia, numero d’ordine, data finché è possibile usufruire degli update del software e la versione della licenza.
Queste informazioni sono tutte superflue, il VERO valore riguarda il campo Licensed Hardware che identifica le interfacce abilitate all’uso del software, tutte le interfacce con un numero hardware diverso da 32262 non saranno accettate. Il numero hardware è ovviamente univoco.
Queste valutazioni le ho effettuate provando a collegare un'altra interfaccia in mio possesso, con numero hardware 32185. Collegandola e cercando di utilizzare il programma premendo il tasto GO esso ci avvisa dandoci il messaggio: The connected hardware is not licensed. Is not included in the license file.


Vehicle Spy 3 img6.jpg


Quindi il controllo è effettuato quando viene premuto il tasto GO!
Poiché il numero hardware che è possibile utilizzare è dato dalla licenza ho inizialmente pensato di decriptarla, dopo quasi un paio di settimane di lavoro sulla routine di decriptazione della licenza (poiché ancora alle prime armi) senza arrivare a nessun risultato ho deciso di provare a patchare il programma in modo tale che accettasse qualsiasi interfaccia indipendentemente dal numero hardware.
I primi tentativi sono stati ricercare la stringa “The connected hardware is not licensed. Is not included in the license file.” tramite il comando All reference text string in OllyDbg ma anche qui senza risultato non era chiaramente visibile quindi probabilmente viene formata in seguito nel flusso del codice.


Analisi logica

Ragioniamo un attimo insieme… Il programma per bloccare una determinata interfaccia ed evitarne il suo utilizzo deve obbligatoriamente eseguire dovuti controlli sul numero hardware connesso per confrontarlo con quello abilitato dal file di licenza giusto? Quindi da qualche parte nel codice dovremmo trovare:
Se Numero Hardware connesso è diverso da Numero hardware abilitato allora blocca l’esecuzione.
Seguendo questa teoria ho ricercato in memoria in Ascii e in Unicode il numero hardware dell’interfaccia abilitata (quindi la 32262) sperando di trovarlo da qualche parte o che per lo meno fosse pushato all’interno dello stack. Anche questa volta sono stato poco fortunato.
Ho ricercato su internet per qualche software in grado di ricercare in tutta la memoria allocata in un processo attivo e mi sono imbattuto per caso in TSearch.
Questo programma permette di ricercare valori e/o stringhe all’interno di tutta la locazione di memoria occupata da un software in esecuzione nel sistema. Apriamo la nostra preda e vediamo se questa volta siamo più fortunati.


Vehicle Spy 3 img7.jpg


Cliccando su Open Process visualizziamo tutti i processi attivi nel nostro sistema:


Vehicle Spy 3 img8.jpg


Ovviamente selezioniamo la nostra preda vspy3.exe e clicchiamo su Open.


Vehicle Spy 3 img9.jpg


Clicchiamo sulla lente d’ingrandimento “Init new search” per ricercare all’interno della memoria utilizzata dal nostro software.

Vehicle Spy 3 img10.jpg

Inseriamo il numero hardware dell’interfaccia licenziata (32262) e premiamo OK.


Vehicle Spy 3 img11.jpg


Tsearch cercherà all’interno della memoria e visualizzerà il numero di occorrenze trovate al centro dello schermo. Il numero hardware è presente ben due volte in memoria! :D


Vehicle Spy 3 img12.jpg


Il tutto inizia a diventare più semplice, quindi come precedentemente avevo accennato il programma per forza di cose dovrà fare un controllo! Il buon TSearch oltre a indicarci che ci sono due riferimenti in memoria ci indica anche il loro indirizzo: 3D101BC e 3D101C0.
In pratica il numero dell’hardware viene convertito da decimale in una DWORD quindi il nostro 32262 diventa 00 00 7E 06. Vi chiederete, bene che facciamo ora? :D

Patchare il programma

Apriamo OllyDbg carichiamo il nostro programma e clicchiamo sul tasto PLAY per mandare in esecuzione il software.


Vehicle Spy 3 img13.jpg


Il programma è perfettamente caricato e abbiamo connesso la seconda interfaccia con numero hardware 32185 infatti essa viene visualizzata nella parte inferiore destra del programma.
Come TSearch ci aveva indicato gli indirizzi dove è stato caricato il numero hardware dell’interfaccia abilitata (32262) sono 3D101BC e 3D101C0.
Mettiamoci in breakpoint con OllyDbg per visualizzare quando è richiamata questa porzione di memoria per i confronti.
Cliccare col tasto destro del mouse sulla parte inferiore sinistra, selezionare Go to e poi Expression oppure più semplicemente utilizzare la scorciatoia da tastiera CTRL+G.


Vehicle Spy 3 img14.jpg


Inserire l’indirizzo che TSerch ci aveva indicato e premere OK.


Vehicle Spy 3 img15.jpg


Vehicle Spy 3 img20.jpg

Come possiamo vedere effettivamente in memoria abbiamo 06 7E 00 00 però sono da considerare al contrario per la notazione Intel cioè 00 00 7E 06 = 32262 in decimale.
Perfetto ci siamo, mettiamoci in breakpoint on memory access. Breakpoint on memory access significa che all’interno del programma in esecuzione qualsiasi istruzione esegua appunto l’accesso a quella determinata locazione di memoria (sia in lettura che scrittura) porterà OllyDbg a breakkarsi immediatamente permettendovi di steppare il codice.
Selezionare i byte sul quale si vuole mettere il breakpoint e premere il tasto destro del mouse, selezionare Breakpoint e poi Memory on access.

Vehicle Spy 3 img17.jpg

Perfetto abbiamo impostato il breakpoint.
Ora torniamo al programma (che è sempre in esecuzione) e clicchiamo sul fatidico tasto GO.

Vehicle Spy 3 img18.jpg

OllyDbg entra in azione andando in break dicendoci Memory breakpoint when reading [3D101BC].
Quindi qualche istruzione ha cercato di caricarsi il numero hardware dell’interfaccia licenziata! :)

Vehicle Spy 3 img19.jpg


Andiamo più nel dettaglio poiché deduco che l’immagine non renda bene.


006CE06D CMP EDX, DWORD PTR DS:[EAX+C] ; Viene confrontato EDX che contiene 7DB9 (in decimale 32185 cioè l’interfaccia connessa ma NON abilitata) con la DWORD presente all’indirizzo EAX+0x0C (EAX vale 3D101B0+0x0C=3D101BC) cioè l’indirizzo che TSearch ci aveva indicato contenere il numero hardware dell’interfaccia abilitata dal file licenza. 006CE070 JB SHORT vspy3.006CE077 ; Se EDX è minore della DWORD letta (se 32185<32262) allora salta 006CE072 CMP EDX, DWORD PTR DS:[EAX+10] ; Viene confrontato EDX (32185) con EAX+0x10 (EAX vale 3D101B0+0x10=3D101C0) cioè il secondo indirizzo che TSearch ci aveva indicato contenere il numero hardware dell’interfaccia abilitata dal file licenza. 006CE075 JBE SHORT vspy3.006CE07B ; Se EDX è minore o uguale della DWORD letta (se 32185 <= 32262) allora salta 006CE077 XOR EAX, EAX ; Azzera EAX 006CE079 JMP SHORT vspy3.006CE080 006CE07B MOV EAX, 1 006CE080 POP EBP 006CE081 RETN

Da quest’analisi pare chiarissimo cosa succede:
(6CE070) se il numero dell’interfaccia connessa è minore di quella abilitata EAX viene azzerato (noi normalmente incapperemmo in questo caso poiché 32185 è minore di 32262) e poi salta tramite il jump alla funzione 006CE080 che visualizza in seguito il codice d’errore: The connected hardware is not licensed. Is not included in the license file.
Il ruolo fondamentale in questo pezzo di codice lo ricopre EAX, infatti è lui che determina se l’interfaccia sarà o meno abilitata.
Se al RETN EAX sarà 0 l’interfaccia non funzionerà, se invece sarà 1 avremo risolto i nostri problemi.
Andiamo avanti nello studio sempre al passo 6CE070 supponiamo che abbiamo inserito un’interfaccia con un codice superiore al 32262 ad esempio 32560.
Viene eseguito il confronto se 32560 è minore di 32262 non essendo la condizione vera non saltiamo.
Viene riconfrontato il valore 32560 con la successiva DWORD (ricorda TSearch) che contiene 32262, in questo caso abbiamo JBE cioè salta se minore o uguale.
Poiché 32560 non è minore e non è uguale a 32262 anche in questo caso EAX viene xorato e quindi azzerato.
In pratica come si supponeva nello studio preliminare solo ed esclusivamente se il numero dell’hardware connesso coincide con quello abilitato dalla licenza avremo EAX settato a 1 e quindi l’interfaccia sarà funzionante (com’è giusto che sia).
Ma noi non vogliamo questo giusto?
Allora patchamo il programma! La soluzione che propongo è solamente una delle tante. Io ho risolto cosi:

006CE06D CMP EDX, DWORD PTR DS:[EAX+C] ; Quando viene premuto il tasto GO nel software arriviamo sempre qui, che succede ora? Viene confrontato 32185 con 32262. 006CE070 NOP ; NOP significa NO operation 006CE071 NOP 006CE072 CMP EDX, DWORD PTR DS:[EAX+10] ; Viene confrontato 32185 con la successive DWORD in memoria 32262 006CE075 JMP SHORT vspy3.006CE07B ; Ho modificato il jump da JBE (Salta se minore o uguale) a JMP (salta sempre) 006CE077 XOR EAX, EAX ; Questa istruzione non verrà mai eseguita 006CE079 JMP SHORT vspy3.006CE080 ; Questa istruzione non verrà mai eseguita 006CE07B MOV EAX, 1 ; EAX varrà 1 quindi la nostra interfaccia sarà abilitata 006CE080 POP EBP 006CE081 RETN

In sostanza ho eliminato il primo JB in modo tale che non faccia nulla (NOP) e nel secondo controllo indipendentemente dal numero hardware che viene letto si salta sempre all’istruzione MOV EAX,1.
Non ci rimane altro che salvare le modifiche all’eseguibile e voilà il programma è perfettamente funzionante! :D



Note Finali

Siamo giunti al termine di questo tute. Che cosa abbiamo imparato? Nonostante ci possano essere operazioni complesse come licenze criptate pazienza e determinazione portano sempre al risultato voluto.

Vorrei ringraziare innanzitutto l’amico sparpacillon che mi ha dato parecchi consigli sia per questo target sia per altri. Inoltre vorrei ringraziare tutti i membri e la UIC in generale, che grazie ai tutorial mi permette di imparare molto in un mondo che fino a poco fa per me, era solamente fantascienza! :) Per qualsiasi dubbio o domanda in merito al tute e non, contattatemi tramite il forum della UIC senza problemi! Un saluto a tutti, al prossimo tute! ;)

crystalboy


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.