Pagina 1 di 1

gcc, C/C++ e reverse engineering

Inviato: mer 4 mar 2009, 21:40
da ksniffer
Salve,
so che la domanda che sto per fare scatenerà l'ira per chi usa Software Libero. Dove lavoro mi hanno chiesto di trovare un modo di impedire il reverse engineering, nei limiti del possibile, o comunque di renderlo difficile. Il software è scritto in C/C++. Esiste qualche strumento che si affianca al gcc per nascondere il nascondibile?

Re: gcc, C/C++ e reverse engineering

Inviato: mer 4 mar 2009, 22:44
da phobos3576
Il reverse engineering viene fatto necessariamente con appositi programmi chiamati "disassemblatori" (come NDISASM) o anche con i debugger (come GDB) usati come "disassemblatori"; visto che il sorgente, scritto in qualsiasi linguaggio, deve essere in ogni caso convertito in codice macchina, è sempre possibile visualizzare tale codice macchina sotto forma di listato assembly.

Per evitare questo lavoro di disassemblaggio, in passato (quando mi dilettavo con queste cose) si inseriva nei propri programmi apposito codice che mandava in tilt i debugger; ciò è possibile in quanto il debugger usa determinati servizi di sistema per svolgere il proprio lavoro. Il codice "di guardia" inserito nel proprio programma ha il compito allora di intercettare queste particolari chiamate di sistema reindirizzando tutto verso un'altra porzione di codice che, generalmente, manda in crash il programma stesso.

Ai tempi del DOS questa tecnica era facile da applicare in quanto i programmi accedevano al SO attraverso gli interrupt (con l'istruzione INT); in particolare, i debugger usavano appositi interrupt a loro dedicati. Bastava allora inserire nel proprio programma il codice necessario per accorgersi di quelle chiamate di interrupt, e il gioco era fatto.

In ambiente Linux la situazione è molto simile in quanto le chiamate di sistema non sono altro che chiamate ad appositi interrupt; in ambiente Windows, invece, si ricorre ad apposite "funzioni di sistema".

In definitiva, bisogna studiarsi per bene il funzionamento dei disassembler sotto i vari SO per sapere come intervenire; in ogni caso, questo è uno di quei campi dove la conoscenza dell'assembly è d'obbligo.