|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Feb 2010
Messaggi: 57
|
[C] consigli offuscamento codice
Avrei bisogno di un programma per offuscare codice C....l' importante e che non siano riconoscibili le chiamate alle funzioni !!
per esempio sostituire tutti i printf del codice con parole diverse ma che facciano sempre riferimento al printf |
![]() |
![]() |
![]() |
#2 |
Junior Member
Iscritto dal: Mar 2012
Messaggi: 13
|
Se cerchi su Google "c obfuscator" puoi trovare ciò che desideri, ma la maggior parte dei software di offuscamento rinominano semplicemente costanti e variabili con sequenze di lettere e numeri casuali. Manualmente potresti utilizzare i #define e una funzione per decodificare le stringhe, ad esempio:
Codice:
// Codice normale #include <stdio.h> int main() { printf("Ciao!"); } Codice:
// Codice semioffuscato #include <stdio.h> #define QUESTO printf( #define E "Ciao!" /* Si potrebbe sostituire "Ciao" * con "%s" e decodificare in seguito * la stringa crittata tramite una funzione */ #define OFFUSCATO ); main() { QUESTO E OFFUSCATO } Ultima modifica di Chinonso : 09-06-2012 alle 18:28. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Ma soprattutto qual'è il senso di offuscare il sorgente di un programma che poi verrà convertito in binario?
Se non vuoi che leggano i sorgenti, tienili privati. Sul serio, non riesco a capire l'utilità di una simile operazione. Il codice javascript si offusca, perchè viene distribuito in forma sorgente. Si offuscano pure alcuni tipi di bytecode, perchè sono relativamente facili da decodificare e contengono informazioni che aiutano il reverse engineering. Ma un programma C compilato è una brutta bestia in ogni caso. Semmai si procede ad usare tecniche varie sull'eseguibile, per renderlo robusto al reverse engineering. |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Feb 2010
Messaggi: 57
|
ma il compilatore che sostituisce e l' assembly risulta uguale, o in codice assembly si notano le differenze usando DEFINE o non usandolo
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
#define definisce degli alias che vengono sostituiti nel codice prima della compilazione, quindi il risultato in linguaggio macchina sarà lo stesso
|
![]() |
![]() |
![]() |
#6 | |
Junior Member
Iscritto dal: Mar 2012
Messaggi: 13
|
Quote:
Ti faccio un esempio. Il seguente programmino C (ovviamente di nessuna utilità pratica), confrontato con il relativo codice Assembly x86: Codice:
int main() { int a = 3, b = 5, c; c = a+b; // return 0 è sottinteso anche se non si scrive esplicitamente } Codice:
.code main proc mov eax, 3 ; a add eax, 5 ; a+b xor eax, eax ; resetta eax a 0 ret 0 ; return 0 main endp end Se tu compili il codice C precedente su una CPU con architettura x86 in modalità "debug" (senza ottimizzazioni) e poi lo disassembli, tra le varie righe del listato (più lungo di quello che ho scritto io, perché il compilatore C inserisce anche altri dati) troverai "mov eax, 3" e "add eax, 5"... dalle quali si capisce che si vuole sommare 3+5, cioè 8... Se il programma è compilato con ottimizzazioni, poiché svolge un calcolo molto semplice (a+b), potrebbe caricare direttamente 8 nel registro, senza i passaggi intermedi... Poiché noto che non conosci i fondamenti della programmazione, invece di pensare subito ad offuscare codice invano, ti consiglierei prima di comprare un libro sui fondamenti dell'informatica e uno sul linguaggio C. Col tempo e un po' di impegno la maggior parte delle risposte arriveranno da sole.. Ultima modifica di Chinonso : 09-06-2012 alle 23:14. |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:19.