¿Es importante ofuscar el código de la aplicación C ++?

11

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?

usuario827992
fuente
44
Recuerde, haga lo que haga, alguien con demasiado tiempo podrá desobusarlo / descompilarlo
Zavior
13
Muchos compiladores vienen con un /Ointerruptor de ofuscación. Algunos incluso tienen múltiples niveles de ofuscación, hasta /O3;)
MSalters
@MSalters No, g ++ has -O3;)
B 3овић
@Zavior O simplemente aplicar ingeniería inversa, simple y llanamente. Ni siquiera requiere el binario en sí, solo un análisis exhaustivo del software.
John Weisz

Respuestas:

27

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:

Luego, finalmente, está la cuestión de la privacidad del código. Esta es una causa perdida. No hay transformación que impida que un hacker determinado comprenda su programa. Esto resulta ser cierto para todos los programas en todos los idiomas, simplemente es más cierto con JavaScript porque se entrega en forma de fuente. El beneficio de privacidad proporcionado por la ofuscación es una ilusión. Si no desea que la gente vea sus programas, desconecte su servidor. - Douglas Crockford


¿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" ...

haylem
fuente
Una vez utilizamos un dongle de hardware donde había un requisito de licencia para oscurecer todas las llamadas a la función del dongle, y nos proporcionaron una herramienta para hacerlo. ¡Siempre me hizo sospechar un poco sobre la calidad de su 'protección'!
Martin Beckett
@ MartinBeckett: un poco extraño de hecho.
haylem
3

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.

James McLeod
fuente
0

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.

Compañeros de Donal
fuente