En el mundo de Java, a veces parece ser un problema, pero ¿qué pasa con C ++? ¿Hay diferentes soluciones?
Estaba pensando en el hecho de que alguien puede reemplazar la biblioteca C ++ de un sistema operativo específico con una versión diferente de la misma biblioteca, pero llena de símbolos de depuración para comprender lo que hace mi código. ¿Es bueno usar bibliotecas estándar o populares?
Esto también puede suceder con alguna biblioteca dll en Windows reemplazada por la "versión de depuración" de esa biblioteca. ¿Es mejor preferir la compilación estática? En aplicaciones comerciales, veo que para el núcleo de su aplicación compilan todo estáticamente y en su mayor parte los dlls (bibliotecas dinámicas en general) se utilizan para ofrecer algunas tecnologías de terceros como soluciones antipiratería (lo veo en muchos juegos). ), Biblioteca GUI (como Qt), bibliotecas OS, etc.
¿Es la compilación estática el equivalente a la ofuscación en el mundo Java? En mejores términos, ¿es la mejor y más asequible solución para proteger su código?
fuente
/O
interruptor de ofuscación. Algunos incluso tienen múltiples niveles de ofuscación, hasta/O3
;)-O3
;)Respuestas:
No pierdas tu tiempo perdiendo batallas
Como se señaló en muchas otras respuestas similares para C ++ y otros lenguajes, esto es inútil en su mayoría .
Otras lecturas
Lecturas seleccionadas sobre el tema (no todas son específicas de C ++, pero se aplican los principios generales):
Respuestas de StackExchange
Documentos
Citas famosas sobre ofuscación:
¿Nunca?
No estoy diciendo que nunca debas ofuscarte y que no hay buenas razones para ello, pero cuestiono seriamente su necesidad en la mayoría de los casos y su rentabilidad.
Además, hay situaciones en las que la ofuscación es un requisito de facto. Por ejemplo, si escribe virus, obviamente la ofuscación (y una dinámica, preferiblemente) es algo tan bueno para la supervivencia de su programa como su capacidad de replicarse. Sin embargo, esto difícilmente constituye un caso "común" ...
fuente
No, no vale la pena el esfuerzo, y creo que es completamente innecesario. Las funciones que llama probablemente se pueden adivinar por la funcionalidad que proporciona.
La razón por la que existen ofuscadores para Java es porque la asignación entre el código de bytes de Java y el código fuente de Java está bastante bien definida, y los nombres de todas las funciones y variables miembro se almacenan en el código de bytes (independientemente de si son públicas, privadas o protegidas ) para que un intérprete de código de bytes de Java pueda presentar algo de Java genérico que muestra la estructura de la fuente original bastante bien para una fuente no ofuscada.
C ++ compila directamente al lenguaje de máquina. Se puede desmontar, pero el lenguaje ensamblador es bastante tedioso de tratar. La descompilación es mucho más complicada debido a todos los cambios que los optimizadores realizan en el código durante la compilación.
fuente
Pensando en esto, hay varios tipos diferentes de ofuscación. Comencemos con la ofuscación del código fuente, que es una completa pérdida de tiempo; ¡Es bastante difícil de entender sin eso! En cambio, centrémonos en la ofuscación del paquete de entrega, de cómo se entrega el código al usuario.
Ofuscación menor
Existe una ofuscación menor para evitar que el usuario ocasional meta sus dedos y rompa cosas fácilmente. No excluye al pirata informático determinado, pero tiene valor para ayudar a garantizar que lo que se le pide que respalde sea lo que realmente ha entregado. El nivel de protección requerido para este tipo de cosas es realmente bastante bajo; el paquete de entrega simplemente no debe verse legible y editable (sin herramientas especializadas) y eso es bastante bueno.
La minificación de Javascript es un ejemplo de esto, aunque no se comercializa como tal. Nadie en su sano juicio querría leer y editar un archivo JS minimizado, incluso si es técnicamente posible hacerlo si está determinado / lo suficientemente persistente.
De manera similar con la entrega de aplicaciones Java. El simple hecho de empaquetar el código en un JAR ejecutable detendrá la mayoría de las tonterías, a pesar de que tiene toda la fuerza de un cortés cartel de "Por favor, manténgase alejado de la hierba" en un parque de la ciudad.
Incluso al entregar código C ++, quitar los símbolos innecesarios del ejecutable será suficiente para calificar como ofuscación menor. La clave es que es incómodo leer el resultado como usuario, pero no es un problema ejecutarlo como una computadora.
Ofuscación mayor
La ofuscación importante es mantener alejado al usuario decidido y conocedor . También es un juego perdedor total; Si una computadora puede ejecutarlo, una persona puede separarlo y resolver lo que hace. Lo más cercano que podría ser sería hacer que el programa se desencripte continuamente, transformando lo que hace en un momento en algo completamente diferente que hace en otro momento. Crear tal cosa sería bastante difícil y aún así no mantendría a un hacker realmente bueno (aunque al final estaría muy enfadado con usted por la cantidad de esfuerzo requerido para descifrar todo ese código auto modificable).
Es mucho mejor pensar en términos de otras soluciones. Por ejemplo, podría mantener las "joyas de la corona" del código en los servidores que controla y solo permitir llamadas de servicio, lo que convierte al cliente en un regalo esencialmente gratuito que es un front-end para los bits valiosos. O podría ir por la ruta más contractual / legal, y solo entregar ejecutables a organizaciones que formalmente acuerden no hurgar dentro de su código o compensarlo si lo hacen (por lo que sería algún tipo de NDA). El objetivo sería crear un fuerte incentivo para que el pirata informático no piratee, y para que los usuarios mantengan el código alejado de los piratas informáticos no vinculados por el acuerdo.
Pero no debe suponer que su código nunca puede ser descifrado. Con la virtualización, cualquier estado de ejecución de un programa puede examinarse y rastrearse, y cualquier cosa que intente vencerlo (por ejemplo, el seguimiento del reloj a una fuente de tiempo externa) será mucho más probable que cause problemas para los usuarios legítimos que los piratas informáticos. (Consulte el historial de DRM para ver cómo incluso los editores de información muy determinados no pueden mantener sus sistemas seguros una vez que el código está en manos de sus oponentes). Es mucho mejor centrarse en hacer felices a los usuarios legítimos. Las pérdidas ocasionales ocasionadas por el crack no serán nada comparadas con el dinero extra que se obtiene al satisfacer a los clientes adecuadamente.
fuente