10
votes

Comment dépenser vraiment un binaire dans MacOS

macos 10.6, si j'ai un fichier "non désiré.c" qui contient: xxx pré>

maintenant je fais: p> xxx pré>

si J'ai scindé l'interface et la mise en œuvre de la classe secrète, car la plupart des gens font lors de l'écriture de code C ++, il n'y a pas de symboles indésirables dans l'exécutable dépouillé. Malheureusement, je suis remis une base de code existante de plusieurs milliers de lignes de code et ce n'est pas l'un de mes choix. P>

J'ai essayé -fno-RTTI, comme une supposion sauvage, et cela n'a pas corriger quoi que ce soit. J'ai prié les dieux Google et j'ai trouvé de nombreuses références aux clubs de strip-tease, mais pas de liens utiles. J'ai écrémé les pages de l'homme pour Strip, G ++ et LD sur le Mac, et il n'y avait pas de choses évidentes à essayer, bien que l'expression "externes privés" intriguait, je ne pouvais pas comprendre quoi faire à ce sujet. p>

[Mise à jour] Malheureusement, il s'avère être un problème de tentative de faire un petit exemple. Voici un exemple plus compliqué, qui est plus proche de ce que le problème réel est, qui a toujours des symboles indésirables s'il est construit optimisé. P>

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 pousse près d'une solution. P>

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


0 commentaires

4 Réponses :


2
votes

Cela semble fonctionner comme souhaité ...:

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


2 commentaires

J'ai eu le mauvais code posté. Avec le code d'exemple correct, comme la question se lit maintenant, avec la mise en oeuvre des méthodes à l'intérieur de la définition de la classe, la bande dit: STANDES: Symboles référencés par des entrées de table de symboles indirectes qui ne peuvent pas être dépouillées dans: /USERS/MICHAEL.TOY/ Non désiré __zn12Secret_thing21revealing_Method_Nameev __zn12Secret_thingc1ev


Cependant, la réponse était très utile, car elle me donnait plus de FIDDER Google, cette chaîne d'erreur révèle des domaines d'enquête plus intéressants.



1
votes

Compte tenu de l'exemple de code que vous avez affiché, l'ajout du drapeau d'optimisation '-O' "donne les résultats de ces symboles non affichés par nm après compilation.


1 commentaires

Ont posté un exemple de problème plus proche du problème qui présente toujours le problème. L'application originale qui m'a conduit à ce point a été construite optimisée. Merci pour la réponse.



2
votes

Cela ressemble à ce que vous voulez vraiment ne pas dépouiller l'exécutable, mais d'obscurcir sa table de symboles. Je ne suis pas sûr, mais peut-être quelque chose comme Ce serait utile . Au moins, "C ++ Symbole Table Obfusculateur" est probablement une meilleure chaîne de recherche Google.


1 commentaires

Je veux vraiment que l'exécutable 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 passe juste au-dessus "Ecrivez mon propre processeur postal qui relie ce qui est jamais démontré qui nécessite ces symboles, puis lande les symboles"



10
votes

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

donné le dernier fichier exemple, il en résulte: xxx


0 commentaires