bonne pratique pour la fourniture d’une API C masquant des fonctions internes

J’ai écrit une bibliothèque C qui se compose de quelques fichiers .h et .c. Je le comstack comme une bibliothèque statique.

Je souhaite exposer uniquement certaines fonctions à l’utilisateur et garder le rest aussi “obscur” que possible afin de rendre l’ingénierie inverse raisonnablement difficile.

Idéalement, ma bibliothèque serait composée de:

1- Un fichier .h avec seulement les fonctions exposées à l’utilisateur

2- myLibrary.a: aussi irréversible que possible

Quelles sont les meilleures pratiques pour cela? Où devrais-je regarder, y a-t-il un bon tutoriel / livre quelque part?

Plus précisement:

pour 1

Tous mes fichiers .h et .c fonctionnent déjà et je voudrais éviter de les modifier, de déplacer les déclarations de fonction de .h à .c et d’aller dans des références circulaires potentielles pbs. Est-ce possible?

Par exemple, est-ce une bonne idée de créer un nouveau fichier .h que je n’utiliserais que pour le dissortingbuer avec mon fichier .a? Ce .h contiendrait des copies des fonctions que je veux exposer et transmettrait les déclarations des types que j’utilise. est-ce une bonne idée?

pour 2

a) quels drapeaux (ou xcode) dois-je connaître (pour supprimer, ne pas avoir de symboles de débogage, etc.) gcc?

Toute pensée aidera,

Merci, baba

La pratique habituelle est de s’assurer que chaque fonction et variable globale réservée à un usage interne à un module est déclarée static dans ce module. Cela limite l’exposition des détails de la mise en œuvre interne à partir d’un seul module.

Si vous avez besoin de détails d’implémentation internes qui concernent plusieurs modules, mais qui ne sont pas destinés au public, déclarez un ou plusieurs fichiers .h gardés privés et non livrés aux utilisateurs finaux. Les noms des objects définis de cette manière seront toujours visibles par l’éditeur de liens (et par des outils tels que objdump et nm ), mais leurs signatures détaillées ne le seront pas.

Si vous avez des structures de données livrées à l’utilisateur final, mais qui sont opaques, envisagez de demander à l’API de les fournir en tant que pointeurs vers une struct déclarée par non définie dans le fichier .h API publique. Cela préservera la sécurité du type, tout en masquant les détails de la mise en oeuvre. Naturellement, la définition complète de la struct est dans un fichier privé .h .

Avec précaution, vous pouvez conserver une struct partiellement publique connue, qui est un type-punk pour la définition réelle mais qui expose uniquement les membres publics. C’est plus difficile à tenir à jour, et si vous le faites, je veillerais à ce que des tests élémentaires solides permettent de valider que la version publique est en fait équivalente à la version privée de toutes les manières qui importent.

Naturellement, utilisez ssortingp pour supprimer les segments de débogage afin que les détails internes ne fuient pas de cette façon.

Il existe des outils qui peuvent masquer tous les noms destinés uniquement à un usage interne. Si elle est exécutée dans le cadre du processus de construction, vous pouvez utiliser une version de débogage interne comportant des noms sensibles pour tout, et envoyer une version portant toutes les fonctions internes et les variables globales avec des noms que seul un éditeur de liens peut aimer.

Enfin, familiarisez-vous avec le fait que quiconque peut utiliser votre bibliothèque sera en mesure de procéder à une ingénierie inverse de votre bibliothèque. Il existe des mesures anti-débogueur qui peuvent être sockets, mais IMHO est une folie et une frustration.

Je n’ai pas de réponse rapide autre que d’explorer l’utilisation de fonctions “statiques”. Je recommanderais de lire le travail de Miro Samek sur quelque chose qu’il appelle “C +”. ANSI C essentiellement orienté object. Excellente lecture. Il possède le logiciel Quantum leaps.

Effacez les en-têtes pour cette fonction, faites de l’obscurcissement dans la table des exportations, récupérez votre code et appliquez un algorithme anti-débogueur.

http://upx.sourceforge.net/

http://www.oreans.com/