Repository 32bit  Forum
Repository 64bit  Wiki

gcc, C/C++ e reverse engineering

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

gcc, C/C++ e reverse engineering

Messaggioda ksniffer » mer mar 04, 2009 21:40

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?
Avatar utente
ksniffer
Linux 2.6
Linux 2.6
 
Messaggi: 540
Iscritto il: lun lug 30, 2007 12:18
Kernel: 2.6.34
Desktop: KDE 4.4.4
Distribuzione: ArchLinux

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

Messaggioda phobos3576 » mer mar 04, 2009 22:44

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.
Avatar utente
phobos3576
Staff
Staff
 
Messaggi: 2980
Iscritto il: sab apr 16, 2005 23:00
Slackware: 13.1
Kernel: 2.6.37-smp
Desktop: KDE 4.5.3


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti

cron