PDA

View Full Version : [C] consigli offuscamento codice


andros94
09-06-2012, 16:02
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

Chinonso
09-06-2012, 18:54
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 normale

#include <stdio.h>

int main()
{
printf("Ciao!");
}

// 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
}



A mio parere l'offuscamento rende solo più "noioso" ricavare il codice pulito, ma non ne vedo l'utilità. A meno che tu non abbia creato un super programma da nascondere a chissà quali spie industriali, non ne vale la pena... Anche se sprecassi molto tempo a mascherare perfettamente il codice, tieni conto che con un semplice disassemblatore e molta pazienza si può ricavare l'algoritmo, offuscato o meno. Il codice compilato non è altro che una serie di istruzioni assembly...

pabloski
09-06-2012, 19:45
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.

andros94
09-06-2012, 22:15
ma il compilatore che sostituisce e l' assembly risulta uguale, o in codice assembly si notano le differenze usando DEFINE o non usandolo

pabloski
09-06-2012, 22:20
ma il compilatore che sostituisce e l' assembly risulta uguale, o in codice assembly si notano le differenze usando DEFINE o non usandolo

#define definisce degli alias che vengono sostituiti nel codice prima della compilazione, quindi il risultato in linguaggio macchina sarà lo stesso

Chinonso
09-06-2012, 22:47
ma il compilatore che sostituisce e l' assembly risulta uguale, o in codice assembly si notano le differenze usando DEFINE o non usandolo
Come ti abbiamo già detto io e Pabloski, il codice C (offuscato o meno) produce lo stesso risultato quando è compilato.

Ti faccio un esempio. Il seguente programmino C (ovviamente di nessuna utilità pratica), confrontato con il relativo codice Assembly x86:

int main()
{
int a = 3, b = 5, c;

c = a+b;

// return 0 è sottinteso anche se non si scrive esplicitamente
}



.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



Come vedi, nel codice assembly x86 non ci sono i nomi di variabili, ma in questo caso trovi solo il nome del registro accumulatore (EAX), la piccola area di memoria del processore che è specializzata a contenere i risultati delle operazioni aritmetico-logiche effettuate dalla ALU. L'istruzione ADD somma il valore al registro...

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