2009-12-19 12 views
7

MacOs 10.6, se ho un file "unwanted.c", che contiene:Come mettere a nudo davvero un binario in MacOs

class secret_thing { 
public: 
secret_thing() {} 
void revealing_method_name() {} 
}; 

main() 
{ 
    secret_thing obj; 
    obj.revealing_method_name(); 
} 

Ora faccio:

$ g++ unwanted.c -o unwanted 
$ strip unwanted 
$ nm unwanted | grep secret 
0000000100000eb8 T __ZN12secret_thing21revealing_method_nameEv 
0000000100000eae T __ZN12secret_thingC1Ev 

Se ho diviso il interfaccia e implementazione della classe segreta, come la maggior parte delle persone quando scrivono il codice C++, quindi non ci sono simboli indesiderati nell'eseguibile spogliato. Purtroppo, mi viene consegnato un codice esistente di molte migliaia di righe di codice e questa non è una delle mie scelte.

Ho provato -fno-rtti, come ipotesi selvaggia, e questo non ha risolto nulla. Ho pregato gli dei di Google e ho trovato molti riferimenti agli strip club, ma nessun link utile. Ho sfogliato le pagine man per strip, g ++ e ld sul mac, e non c'erano cose ovvie da provare, anche se la frase "externs privati" era intrigante, non riuscivo a capire cosa fare al riguardo.

[aggiornamento] Purtroppo, si è verificato un problema con il mio tentativo di fare un piccolo esempio. Ecco un esempio più complicato, che è più vicino a quale sia il vero problema, che presenta ancora simboli indesiderati se è stato ottimizzato.

Mi scuso per gli esempi negativi. Risulta difficile trovare il problema più piccolo. Molte grazie per le risposte, però, ogni risposta mi spinge vicino a una soluzione.

class base { 
public: 
    virtual int revealing_method_name() = 0; 
    virtual ~base() {}; 
}; 

class secret_thing : public base { 
public: 
    int revealing_method_name() { return 0; }; 
}; 

class other_thing : public base { 
public: 
    int revealing_method_name() { return 1; }; 
}; 

int main(int argc, char**) 
{ 
    base *object = 0; 
    if(argc > 1) object = new secret_thing; 
    else object = new other_thing; 

    return object->revealing_method_name(); 
} 

risposta

8

utilizzando la seguente riga di compilazione la spoglierò con successo i simboli dal file eseguibile:

$ g++ -Xlinker -unexported_symbol -Xlinker "*" -o executable file.cpp 
$ strip executable 

Dato il file di esempio più recente, questo risultati in:

$ nm executable 
       U __ZTVN10__cxxabiv117__class_type_infoE 
       U __ZTVN10__cxxabiv120__si_class_type_infoE 
       U __ZdlPv 
       U __Znwm 
       U ___cxa_pure_virtual 
       U ___gxx_personality_v0 
0000000100000000 A __mh_execute_header 
       U _exit 
       U dyld_stub_binder 
1

Questo sembra funzionare, se lo desideri ...:

$ strip unwanted 
$ nm unwanted | grep secret | cut -f 3 -d ' ' > /tmp/remove 
$ strip -R /tmp/remove unwanted 
+0

Ho ricevuto il codice errato. Con il codice di esempio corretto, come la domanda ora legge, con l'implementazione per i metodi INSIDE la definizione della classe, strip dice: strip: simboli a cui fanno riferimento voci di tabelle di simboli indiretti che non possono essere rimosse in:/Users/michael. giocattolo/indesiderato __ZN12secret_thing21revealing_method_nameEv __ZN12secret_thingC1Ev – mtoy

+0

tuttavia la risposta è stata abbastanza utile, in quanto mi ha dato più foraggio google, quella stringa di errore rivela alcune aree di indagine più interessanti. – mtoy

1

Dato il codice di esempio che hai postato, aggiungendo il '-O' ottimizzazione dei risultati di bandiera in quei simboli non essere mostrato da nm dopo la compilazione.

+0

Hanno pubblicato un esempio più vicino al problema reale che presenta ancora il problema. L'app originale che mi ha spinto fino a questo punto è stata ottimizzata. Grazie per la risposta. – mtoy

2

Sembra che quello che vuoi veramente non sia quello di eliminare l'eseguibile, ma di offuscare la sua tabella dei simboli. Non sono sicuro, ma forse qualcosa come this sarebbe utile. Almeno, "Tabella C++ simbolo Obfuscator" è probabilmente una migliore Google stringa di ricerca ..

+0

Voglio davvero che l'eseguibile venga rimosso. Tuttavia, questo probabilmente va nel taccuino sotto la voce "soluzioni di backup spero di non aver mai bisogno di implementare". Va proprio sopra "scrivi il mio post processore che collega ciò che è scollegato che ha bisogno di quei simboli e quindi rimuove i simboli" – mtoy