2009-12-19 16 views
7

MacOs 10.6, si j'ai un fichier "unwanted.c" qui contient:Comment enlever vraiment un binaire MacOs

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

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

Maintenant, je fais:

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

Si je partage la interface et l'implémentation de la classe secrète, comme le font la plupart des gens lors de l'écriture de code C++, il n'y a pas de symboles indésirables dans l'exécutable dépouillé. Malheureusement, je reçois une base de code existante de plusieurs milliers de lignes de code et ce n'est pas un de mes choix.

J'ai essayé -fno-rtti, comme une supposition sauvage, et cela n'a rien arrangé. J'ai prié les dieux de Google et trouvé de nombreuses références à des clubs de strip-tease, mais pas de liens utiles. J'ai parcouru les pages man pour strip, g ++ et ld sur le mac, et il n'y avait pas de choses évidentes à essayer, même si l'expression "external externs" était intrigante, je ne savais pas quoi faire à ce sujet.

[mise à jour] Malheureusement, il y a un problème avec ma tentative d'en faire un petit exemple. Voici un exemple plus compliqué, qui est plus proche de ce qu'est le vrai problème, qui a toujours des symboles non désirés s'il est construit optimisé.

Je m'excuse pour les mauvais exemples. Il s'avère difficile de trouver le plus petit problème réel. Merci beaucoup pour les réponses, cependant, chaque réponse me rapproche d'une solution.

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(); 
} 

Répondre

8

Utilisation de la ligne de compilation suivante je bande avec succès les symboles de l'exécutable:

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

Étant donné le dernier exemple de fichier, ce résultats en:

$ 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

Cela semble fonctionner comme on le souhaite ...:

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

J'ai eu le mauvais code affiché. Avec le code d'exemple correct, comme la question maintenant, avec l'implémentation pour les méthodes à l'intérieur de la définition de classe, strip dit: strip: symboles référencés par des entrées de table de symboles indirectes qui ne peuvent pas être supprimées:/Users/michael. jouet/indésirable __ZN12secret_thing21revealing_method_nameEv __ZN12secret_thingC1Ev – mtoy

+0

Cependant, la réponse a été très utile, car elle m'a donné plus de google, cette chaîne d'erreur révèle des domaines d'investigation plus intéressants. – mtoy

1

Étant donné l'exemple de code que vous avez posté, en ajoutant le drapeau d'optimisation -o résultats dans ces symboles n'étant pas représenté par nm après la compilation.

+0

Avez-vous posté un exemple plus proche du problème réel qui présente toujours le problème. L'application originale qui m'a conduit à ce point a été optimisée. Merci pour la réponse. – mtoy

2

Il semble que ce que vous voulez vraiment, ce n'est pas de supprimer l'exécutable, mais d'obscurcir sa table de symboles. Je ne suis pas sûr, mais peut-être quelque chose comme this serait utile. Au moins, « C++ symbole table obfuscateur » est probablement une meilleure chaîne de recherche Google ..

+0

Je veux vraiment que l'exécutable soit dépouillé. Cependant, cela va probablement dans le cahier sous la rubrique "solutions de sauvegarde, j'espère que je n'ai jamais besoin de mettre en œuvre". Il va juste au-dessus "écris mon propre post-processeur qui lie ce qui n'est jamais lié et qui a besoin de ces symboles puis dépouille les symboles" – mtoy