9
votes

Distribuer une application au public afin qu'elles puissent compiler, sans révéler la source

J'ai une application exclusive, je voudrais distribuer quelques personnes à des tests, sauf que nous ne voulons pas leur révéler la source. L'application est écrite en C ++ pour Linux. Il relie des forfaits facilement disponibles sur les repos fedora / Ubuntu.

Y a-t-il un moyen de traiter la source à quelque chose d'intermédiaire ... puis de la distribuer et demandez aux utilisateurs de faire une compilation finale qui compile et relie le code intermédiaire à leur plate-forme natale.

J'essaie de voir s'il existe une alternative à la distribution de binaires précompilés. Merci.


2 commentaires

J'ai eu une question très similaire Stackoverflow.com/questions/1025494/Obfuscant-c-c-code


Quelle est la motivation? Y a-t-il une raison particulière pour laquelle ils ne peuvent pas être autorisés à voir la source? Et quelle est la raison de ne pas vouloir distribuer des fichiers binaires précompilés?


8 Réponses :


4
votes

Vous pouvez traiter le code source existant pour "l'endormir"; Fondamentalement, cela consiste à dénormer tous les commentaires et à modifier des noms de variables pour être minimes et en désaccorder la mise en forme du code source. Le problème est que, ils peuvent relativement facilement changer les noms de variable et ajouter le formatage et les commentaires; Bien qu'ils n'auront pas le même niveau d'informations dans le code source résultant que vous le faites, ils auront un code source fonctionnel complètement (car c'est ce que vous avez distribué à eux). Il s'agit de la seule façon de faire ce genre de chose.


3 commentaires

Ceci s'appelle "Source enveloppée" et elle était assez courante pour E.G. Logiciel UNIX.


Ne pouviez-vous pas également supprimer les informations de débogage de celui-ci ou c'est ce que vous parlez de?


Non, vous ne pouvez pas pré-dépasser les informations de débogage lorsque vous distribuez un code source (même du code source mutilé). Les informations de débogage ne sont pas créées avant que le binaire soit compilé.



0
votes

Si c'est C, vous pouvez utiliser le Clang compilateur, puis vider la représentation intermédiaire LLVM. Si c'est C ++, vous devrez peut-être attendre un moment jusqu'à la maturation du support C ++ de Clang.


3 commentaires

La représentation intermédiaire LLVM a déjà été compilée et donc tout changement de temps de construction (par exemple une taille différente d'une structure sur un système d'un autre) ne sera pas reflété dans les fichiers binaires résultants. Cela ne fonctionnera donc généralement que dans les cas où la distribution des binaires aurait été aussi efficace.


En supposant que le seul objectif est de le rendre portable à d'autres plates-formes, c'est assez bon, n'est-ce pas?


Prenons un exemple facile. Linux et BSD ont des structures système qui sont différentes tailles. Lorsque vous compilez de la représentation intermédiaire de C à LLVM, le fichier d'en-tête qui déclare ces structures sur la plate-forme où vous compilez (disons, openbsd) décidera de la taille de la taille du compilateur de la structure. Lorsque vous essayez d'utiliser cette représentation intermédiaire LLVM pour créer un binaire exécutant sous Linux, la taille de la structure sera fausse et votre programme se bloque. Donc, non, ne semble pas assez bon pour moi.



5
votes

Ce n'est pas une réponse technique, mais faites-vous suffisamment confiance à eux pour demander une NDA signée?


1 commentaires

Les développeurs de jeux font cela avec des bêtas en ligne, mais c'est une récompense plus élevée / plus élevée.



5
votes

Il suffit de le compiler à assembler. Peut être fait à l'aide de l'option -s.

helloworld.cpp: xxx

et ensuite faire: xxx

Utilisation de cette méthode que vous pouvez distribuer uniquement les fichiers .s qui contiendront très dure l'assembleur.


3 commentaires

Cela ne résout pas la question de la "plate-forme natale", car elle dépend de la machine (et éventuellement dépendante de la distribution, selon les en-têtes incluses).


Point équitable. Je crois toujours que cela pourrait être une option dans certains cas, alors je quitterai le message plutôt que de la supprimer.


Même si elle est dépendante de la plate-forme, il n'y a pas tant de plates-formes là-bas - vous pouvez le faire très probablement séparément pour toutes les plateformes d'intérêt.



1
votes

En bref, non. Par définition si elles peuvent la compiler, elles ont votre source. Le mieux que vous puissiez faire est d'augmenter la douleur d'en essayer de le comprendre.

Je suis d'accord avec John. Si vous avez un petit nombre de clients et que vous leur faites confiance, une NDA serait une meilleure voie.

Une autre chose que je viens de penser à ... Qu'en est-il de simplement exécuter le préprocesseur et le compilateur, mais pas l'assembleur et le lieur? Vous auriez besoin d'une copie pour chaque langue d'assemblage de l'architecture spécifique, mais je suppose que cela serait suffisamment douloureux pour dissuader la modification tout en compilant.


0 commentaires

1
votes

Vous pouvez diviser votre application en deux parties: la première partie contiendra des bibliothèques précompilées avec la fonctionnalité indépendante du système d'exploitation et le second contiendra une petite partie de sources que les utilisateurs compileraient. De cette façon, Nvidia distribue leurs pilotes.


0 commentaires

1
votes

Vous pouvez obfosser votre code C / C ++. Voir ma question pour Outils d'obfuscation C / C ++


0 commentaires

1
votes

La meilleure solution que je puisse proposer est de limiter le nombre de plates-formes que vous prenez en charge et de faire vos propres compilations, ou de compiler un format binaire difficile à extraire des informations de, mais l'utilisateur peut compiler cela à leur langue maternelle. format.

Personnellement, j'irais avec l'option 1.


1 commentaires

Comme il a déjà des dépendances spécifiques Fedora et Ubuntu, la liste des plates-formes cibles est déjà limitée. Donc oui - l'option 1 est la plus raisonnable. En outre, fournissant des utilisateurs finaux avec des fichiers binaires précompilés spécifiques à une architecture, c'est comment cela se fait pour la plupart (tout?) Logiciel propriétaire écrit en C ++.