your source protect encrypt code c++ compilation obfuscation distribute precompile

c++ - source - Distribuya una aplicación al público para que puedan compilar, sin revelar la fuente



protect your code python (8)

En resumen, no. Por definición, si pueden compilarlo, entonces tienen su fuente. Lo mejor que puedes hacer es aumentar el dolor de ellos tratando de entenderlo.

Estoy de acuerdo con John. Si tiene una pequeña cantidad de clientes y confía en ellos, una NDA sería una mejor ruta.

Otra cosa en la que acabo de pensar ... ¿qué hay de simplemente ejecutar el preprocesador y el compilador, pero no el ensamblador y el enlazador? Necesitaría una copia para el lenguaje ensamblador de cada arquitectura específica, pero supongo que sería lo suficientemente doloroso como para disuadir la edición mientras que es bastante fácil de compilar.

Tengo una aplicación patentada que me gustaría entregar a algunas personas para realizar pruebas, excepto que no queremos revelarles la fuente. La aplicación está escrita en C ++ para Linux. Vincula con paquetes disponibles en los repositorios de Fedora / Ubuntu.

¿Hay alguna forma de procesar el origen a algo intermedio ... luego distribuirlo y hacer que los usuarios realicen una compilación final que en realidad compila y vincula el código intermedio a su plataforma nativa.

Estoy tratando de ver si hay alguna alternativa a la distribución de binarios precompilados. Gracias.


No es una respuesta técnica, pero ¿confías en ellos lo suficiente como para pedir un NDA firmado?


Podría dividir su aplicación en dos partes: la primera parte contendrá bibliotecas precompiladas con la funcionalidad independiente del SO, y la segunda contendrá una pequeña parte de las fuentes que los usuarios compilarían. De esta forma, NVIDIA distribuye sus controladores.


Puede procesar el código fuente existente para "modificarlo"; básicamente, esto consiste en eliminar todos los comentarios y cambiar los nombres de las variables para que sean mínimos y eliminar todo el formato del código fuente. El problema es que pueden cambiar los nombres de las variables con relativa facilidad y agregar formato y comentarios; si bien no tendrán el mismo nivel de información en el código fuente resultante que tú, tendrán un código fuente completamente funcional (porque eso es lo que les has distribuido). Esta es la única forma de hacer este tipo de cosas.


Si es C, puede usar el compilador clang y luego volcar la representación intermedia LLVM. Si se trata de C ++, es posible que deba esperar un tiempo hasta que madure el soporte C ++ de clang.


Solo compilarlo para el ensamblador. Se puede hacer usando la opción -S.

helloworld.cpp:

#include <iostream> using namespace std; int main(void) { cout << "Hello World" << endl; return 0; }

Y luego hazlo:

emil@lanfear /home/emil/dev/assemblertest $ g++ -S -o helloworld.s helloworld.cpp emil@lanfear /home/emil/dev/assemblertest $ g++ -o helloworld helloworld.s emil@lanfear /home/emil/dev/assemblertest $ ./helloworld Hello World

Con este método, puede distribuir solo los archivos .s que contendrán un ensamblador muy difícil de leer.


La mejor solución que se me ocurre es limitar el número de plataformas que admite y hacer sus propias compilaciones, o compilar en un formato binario de difícil extracción de información, pero el usuario puede compilarlo en su formato original.

Personalmente, me gustaría ir con la opción 1.