Comentarios preliminares
En primer lugar, debemos acordar qué significa un desmontaje correcto de un programa binario. Propondría la siguiente definición:
Un desmontaje correcto de un programa binario dará el conjunto de todas las posibles instrucciones que puede ejecutar el programa cualquiera que sea la entrada toma.
Otra forma de expresarlo sería decir que exponemos las instrucciones de todas las posibles ejecuciones del programa en cada entrada que pueda tomar.
Deteniendo Problema
Aquí ya podemos hacer un paralelo con el problema de detención en una máquina de Turing que se puede definir como sigue ( Wikipedia):
El problema de detención es el problema de determinar, a partir de una descripción de un programa de computadora arbitrario y una entrada, si el programa terminará de ejecutarse o continuará ejecutándose para siempre.
Este problema (aparentemente) muy simple ha sido demostrado indecidiblemente por Turing, lo que significa que, incluso si podemos manejar una cierta cantidad de casos automáticamente con un programa, algunos casos patológicos siempre escaparán de nuestro programa que no dirá si sí o no, la máquina / programa se detendrá en la entrada dada.
Y, por supuesto, tales casos patológicos son infinitos (por lo tanto, no hay esperanza de enumerarlos uno tras uno como casos especiales).
¡Volvamos a nuestro problema de desmontaje!
Explorar todas las rutas posibles de un programa es de hecho indecidible debido al problema de detención !
De hecho, una forma dual de formular el problema de la detención es el problema de accesibilidad , en el que desea saber si hay una entrada que le permita llegar a un punto específico del programa. Y, saber si el programa puede alcanzar un lugar específico en la memoria e interpretarlo como una instrucción ( es decir, el puntero de instrucción toma el valor de esta dirección en algún momento) es un problema de accesibilidad.
Entonces, el desmontaje es indecidible .
Pero, ¿en el mundo real?
Lo sé, lo sé, esto es solo matemáticas ... No es la realidad ... La mayoría de las ofuscaciones (voluntarias o no) se pueden resolver y eliminar automáticamente del código binario ...
Bueno, esto se debió esencialmente a que las personas que hicieron estas ofuscaciones no estaban acostumbradas a indecidibles problemas ...
Imagine que inserta en su programa el cálculo de un problema indecidible, o incluso, simplemente algo lo suficientemente difícil y complejo que romperá cualquier razonamiento automatizado que se le aplique.
Para dar un ejemplo, tomemos la secuencia de Collatz ( Wikipedia), se conjetura que esta secuencia siempre termina en 1 después de algún tiempo. Pero, el problema aritmético detrás de esto es tan tremendamente complejo que esta conjetura se mantiene desde aproximadamente un siglo ... ¡Este es un predicado opaco perfecto para usar! Por supuesto, podría ser que la prueba de tal conjetura exista, pero este problema es lo suficientemente complejo como para comenzar a construir sobre él y confundir a la computadora al explorar el espacio de estados de un programa.
De hecho, esta es la actual la dirección de la investigación en una fuerte ofuscación hoy en día ... Casi hemos terminado con los pequeños trucos que se usaban antes y la gente comienza a construir cosas sobre problemas mejor fundamentados. Incluso si todavía perdemos un equivalente de un Shannon (padre de la teoría de la información) en materia de ofuscación del software para compararlo con la criptología.
Palabras finales
Entonces, vimos que el problema de desmontaje está fuertemente vinculado al problema de detención . Y, también, que el uso de problemas muy complejos podría ser el siguiente paso en la ofuscación del software moderno .
Solo quisiera decir una última palabra sobre el hecho de que las herramientas de desmontaje actuales probablemente están muy por detrás de lo que podríamos hacer si tuviéramos que ceñirnos al estado del arte en técnicas de desmontaje. Siempre lloro de dolor cuando veo cuán prehistóricas son las herramientas actuales ... pero poner en práctica todas las técnicas modernas requeriría tanto esfuerzo de desarrollo y mantenimiento que nadie parece estar listo para hacerlo (pero esto es solo mi humilde opinión).