Est-il important d'obscurcir le code d'application C ++?


11

Dans le monde Java, cela semble parfois être un problème, mais qu'en est-il du C ++? Existe-t-il des solutions différentes?

Je pensais au fait que quelqu'un peut remplacer la bibliothèque C ++ d'un système d'exploitation spécifique par une version différente de la même bibliothèque, mais pleine de symboles de débogage pour comprendre ce que fait mon code. Est-ce une bonne chose d'utiliser des bibliothèques standard ou populaires?

Cela peut également se produire avec une bibliothèque de DLL sous Windows remplacée par la «version de débogage» de cette bibliothèque. Vaut-il mieux préférer la compilation statique? Dans les applications commerciales, je vois que pour le cœur de leur application, ils compilent tout statiquement et pour la plupart, les DLL (bibliothèques dynamiques en général) sont utilisées pour offrir des technologies tierces comme des solutions anti-piratage (je le vois dans de nombreux jeux ), Bibliothèque GUI (comme Qt), bibliothèques OS, etc.

La compilation statique est-elle l'équivalent de l'obfuscation dans le monde Java? En mieux, est-ce la solution la meilleure et la plus abordable pour protéger votre code?


4
N'oubliez pas, quoi que vous fassiez, quelqu'un avec trop de temps pourra le désobfusquer / décompiler
Zavior

13
De nombreux compilateurs sont livrés avec un /Ocommutateur d'obfuscation. Certains ont même plusieurs niveaux d'obscurcissement, jusqu'à /O3;)
MSalters

@MSalters Non, g ++ has -O3;)
BЈовић

@Zavior Ou inversement, simplement et simplement. Il ne nécessite même pas le binaire lui-même, juste une analyse approfondie du logiciel.
John Weisz

Réponses:


27

Ne perdez pas votre temps à perdre des batailles

Comme indiqué dans de nombreuses autres réponses similaires pour C ++ et d'autres langages, cela est principalement inutile .

Lectures complémentaires

Lectures sélectionnées sur le sujet (toutes ne sont pas spécifiques au C ++, mais les principes généraux s'appliquent):

Réponses StackExchange

Papiers

Citations célèbres sur l'obscurcissement:

Enfin, il y a la question de la confidentialité du code. C'est une cause perdue. Aucune transformation n'empêchera un pirate informatique déterminé de comprendre votre programme. Cela s'avère vrai pour tous les programmes dans toutes les langues, c'est plus évidemment vrai avec JavaScript car il est fourni sous forme source. L'avantage de confidentialité offert par l'obscurcissement est une illusion. Si vous ne voulez pas que les gens voient vos programmes, débranchez votre serveur. - Douglas Crockford


Jamais?

Je ne dis pas que vous ne devriez jamais masquer et qu'il n'y a pas de bonnes raisons à cela, mais je remets sérieusement en question la nécessité de cela dans la plupart des cas, et sa rentabilité.

De plus, il existe des situations où l'obscurcissement est une exigence de facto. Par exemple, si vous écrivez des virus, l'obscurcissement (et un dynamique, de préférence) est évidemment aussi bon pour la survie de votre programme que sa capacité à se répliquer. Cependant, cela ne constitue guère un cas "commun" ...


Nous avons déjà utilisé un dongle matériel où il y avait une exigence de licence pour obsfurcate tous les appels de fonction dongle - et ils ont fourni un outil pour le faire. Cela m'a toujours un peu méfié de la qualité de leur «protection»!
Martin Beckett

@MartinBeckett: un peu bizarre en effet.
haylem

3

Non, cela ne vaut pas la peine, et je pense que c'est complètement inutile. Les fonctions que vous appelez peuvent probablement être devinées par la fonctionnalité que vous fournissez.

La raison pour laquelle il existe des obfuscateurs pour Java est que le mappage entre le code d'octet Java et le code source Java est assez bien défini et que les noms de toutes les fonctions et variables membres sont stockés dans le code d'octet (qu'ils soient publics, privés ou protégés). ) donc un interpréteur de code d'octet Java peut présenter du Java générique qui montre assez bien la structure de la source d'origine pour une source non obscurcie.

C ++ se compile directement en langage machine. Il peut être démonté, mais le langage d'assemblage est assez fastidieux à gérer. La décompilation est beaucoup plus délicate en raison de tous les changements que les optimiseurs apportent au code pendant la compilation.


0

En y réfléchissant, il existe plusieurs types d'obscurcissement. Commençons par l'obscurcissement du code source, ce qui est une perte de temps complète; c'est déjà assez difficile à comprendre sans ça! Alors concentrons-nous plutôt sur l'obscurcissement du package de livraison, sur la façon dont le code est remis à l'utilisateur.

Obfuscation mineure

Un brouillage mineur existe pour empêcher l'utilisateur occasionnel de fourrer ses doigts et de casser des objets facilement. Cela n'empêche pas le pirate informatique déterminé, mais cela a de la valeur pour aider à garantir que les choses que vous êtes invité à soutenir sont ce que vous avez réellement livré. Le niveau de protection requis pour ce genre de chose est vraiment assez faible; le paquet de livraison doit simplement ne pas être lisible et modifiable (sans outils spécialisés) et c'est assez bien.

La minification de Javascript en est un exemple, bien qu'elle ne soit pas commercialisée comme telle. Personne sensé ne voudrait lire et éditer un fichier JS minifié, même s'il est techniquement possible de le faire si vous êtes déterminé / assez persistant.

De même avec la livraison d'applications Java. Le simple fait d'emballer le code dans un fichier JAR exécutable arrêtera la majorité de la folie, même s'il a toute la force d'un panneau poli «S'il vous plaît, évitez l'herbe» dans un parc de la ville.

Même lors de la livraison de code C ++, la suppression des symboles inutiles de l'exécutable sera suffisante pour être qualifiée d'obscurcissement mineur. La clé est qu'il est difficile de lire le résultat en tant qu'utilisateur, mais pas un problème pour l'exécuter en tant qu'ordinateur.

Obscurcissement majeur

L'obscurcissement majeur empêche l'utilisateur déterminé et bien informé . C'est aussi une partie perdante totale; si un ordinateur peut l'exécuter, une personne peut le séparer et déterminer ce qu'il fait. Le plus proche que vous pourriez obtenir serait de faire en sorte que le programme se décrypte continuellement, transformant ce qu'il fait à un moment donné en une chose complètement différente qu'il fait à un autre moment. La création d'une telle chose serait plutôt difficile et ne garderait toujours pas un très bon pirate informatique (bien qu'ils seraient vraiment assez croisés avec vous à la fin de celui-ci à la quantité d'effort requise pour décrypter tout ce code auto-modifiant).

Il vaut mieux penser en termes d'autres solutions. Par exemple, vous pouvez conserver les «joyaux de la couronne» du code sur les serveurs que vous contrôlez et n'autoriser que les appels de service, ce qui fait du client un cadeau essentiellement gratuit qui est un frontal pour les bits de valeur. Ou vous pouvez emprunter la voie la plus contractuelle / légale et ne remettre les exécutables qu'aux organisations qui acceptent formellement de ne pas fouiller dans votre code ou de vous indemniser si elles le font (ce serait donc une sorte de NDA). L'objectif serait de créer une forte incitation pour le pirate à ne pas pirater, et pour les utilisateurs de garder le code à l'écart de tout pirate non lié par l'accord.

Mais vous ne devez pas supposer que votre code ne peut jamais être fissuré. Avec la virtualisation, tout état de programme d'une exécution peut être examiné et suivi, et tout ce qui tente de le vaincre (par exemple, le suivi de l'horloge vers une source de temps externe) sera beaucoup plus susceptible de causer des problèmes aux utilisateurs légitimes qu'aux pirates. (Consultez l'historique de DRM pour savoir comment même des éditeurs d'informations très déterminés ne peuvent pas sécuriser leurs systèmes une fois que le code est entre les mains de leurs adversaires.) Il est préférable de se concentrer sur la satisfaction des utilisateurs légitimes. Les pertes occasionnées par la fissure occasionnelle ne seront rien comparées à l'argent supplémentaire apporté par la satisfaction satisfaisante des clients.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.