convertir ejecutable de nuevo a código fuente C

14

Desafortunadamente, perdí mi código fuente y solo tengo el archivo de salida que hizo con gcc en Linux y no tengo acceso a mi PC ahora. ¿Hay alguna forma de convertir el archivo de salida en el archivo de origen (en c bajo Linux)?

mahsa
fuente
Lo que quieres se llama descompilador. Puede encontrar ayuda con esta respuesta: stackoverflow.com/questions/193896/whats-a-good-c-decompiler
Eric Renouf
IDA Pro con el módulo descompilador es la única solución práctica que realmente funciona con grandes ejecutables.
fpmurphy
@ fpmurphy1 Tienes Hopper, que es comparable en calidad a IDA Pro y cuya licencia es una fracción del precio.
Rui F Ribeiro
@ fpmurphy1 Todavía no he logrado ver la calidad del código generado por Avast ... ¿quién usa las plataformas Intel de 32 bits? Además, no he usado Wintel en décadas. ver unix.stackexchange.com/questions/418354/… La diferencia en el precio es bastante significativa, sin embargo, los rayos hexadecimales / IDA pro comienzan desde 1500USD para obtener una licencia personal hasta algunos valores exorbitantes para licencias comerciales como 5000USD o hasta AFAIK, Hopper es 100USD para un solo usuario y 130 para una sola computadora.
Rui F Ribeiro
@RuiFRibeiro. Una gran cantidad de malware que examino sigue siendo de 32 bits.
fpmurphy

Respuestas:

25

Entonces tenías una vaca, pero la convertiste inadvertidamente en hamburguesa, y ahora quieres recuperar tu vaca.

Lo siento, simplemente no funciona de esa manera.

Simplemente restaure el archivo fuente de sus copias de seguridad.

Ah, no tenías copias de seguridad. Desafortunadamente, el universo no te da un descanso para eso.

Puedes descompilar el binario. Eso no le dará su código fuente, pero le dará algo de código fuente con el mismo comportamiento. No obtendrá los nombres de las variables a menos que sea un binario de depuración. No obtendrá exactamente la misma lógica a menos que haya compilado sin optimizaciones. Obviamente, no recibirás comentarios.

He usado Boomerang para descompilar algunos programas, y el resultado fue más legible que el código de la máquina. No sé si es la mejor herramienta que existe. De todos modos, no esperes milagros.

Gilles 'SO- deja de ser malvado'
fuente
1
Boomerang se ve bastante ordenado; lástima que la documentación haga referencia a gcc -O4 ya que eso no hace absolutamente nada (más allá de -O3) si la memoria me sirve bien. Su última oración, por supuesto, es extremadamente válida, así como sus primeras cinco oraciones. Eso no quiere decir que el resto no sea válido, ya que estás haciendo un punto muy fuerte sobre la importancia de hacer copias de seguridad regularmente. +1
Pryftan
6

Varias herramientas son comunes en ingeniería inversa de un ejecutable.

  1. El comando "archivo" que toma la ruta del archivo como primer parámetro para que pueda determinar (en la mayoría de los casos) qué tipo de ejecutable tiene.
  2. Desmontadores que muestran EXACTAMENTE lo que hace el ejecutable pero es difícil de leer para aquellos que no escriben código de ensamblaje en esa arquitectura específica o que tienen experiencia con el desmontaje.
  3. Los descompiladores como Boomerang, Hex-rays y Snowman pueden proporcionar una mayor legibilidad, pero no recuperan los nombres de variables reales o la sintaxis del programa original y no son 100% confiables, especialmente en los casos en que los ingenieros que crearon el ejecutable probaron con estos paquetes e intentaron ofuscar aún más la seguridad.
  4. Diagramas de flujo de datos o tablas. No conozco ninguna herramienta gratuita para hacer esto automáticamente, pero un script de Python o Bash sobre la parte superior de un analizador de texto de la salida del ensamblaje (que puede escribirse en sed o Perl) puede ser útil.
  5. Lápiz y papel, lo creas o no, para anotar flujos e ideas.

En la mayoría de los casos que he visto, el código necesitaba ser reescrito desde cero, mantenido como un programa en lenguaje ensamblador o reconstituido mediante la aplicación de solicitudes de cambio a una versión anterior.

Douglas Daseeco
fuente
1
# 1: cierto aunque también tiene sus fallas. # 3: ¿Supongo que esos son comerciales? Solo tengo curiosidad académica (tengo copias de seguridad redundantes, así que no necesito ese tipo de cosas). # 4: cflow (aunque eso usa la fuente, hay algunos que funcionan en el binario, con algunas advertencias, por supuesto) viene a la mente. Hay otros por ahí, dependiendo de lo que buscas. En cuanto a la salida gráfica, no puedo ayudar, ya que no me gusta o necesito una salida gráfica para ese tipo de cosas (en realidad me resultaría más molesto). # 5: muy cierto. También puede usar un archivo de texto aquí, por supuesto.
Pryftan
3

Lo que quieres hacer se llama "descompilar". Hay muchos descompiladores por ahí y no es práctico cubrirlos todos aquí.

Sin embargo, como comentario general: la conversión de la fuente C al código de máquina ejecutable es con pérdida. Por ejemplo:

  • Los comentarios se pierden irreversiblemente
  • Los nombres de las variables se han ido
  • A veces, los bucles se desenrollan para el rendimiento
  • Las funciones pueden reorganizarse

Es raro que el código se compile como está escrito. La mayoría de los compiladores en estos días cambiarán drásticamente su código para optimizarlo. Entonces, cuando descompila, el compilador solo puede adivinar cómo debe haber sido el código fuente, no tiene forma de saber cuál era su código, porque se ha ido. Si el descompilador es bueno, el código que obtenga al menos volverá a compilarse en un ejecutable equivalente, y luego puede comenzar a refactorizarlo lentamente para que sea legible. Pero lo más probable es que el descompilador produzca un código de espagueti absolutamente ilegible, y será un gran dolor de cabeza descifrarlo. A veces, puede terminar siendo menos trabajo reescribir el programa desde cero.

Bagalaw
fuente
Sobre el tema de los comentarios, algo que noté recientemente es, y no tengo idea si esto permitiría que un descompilador lea los comentarios, ni espero que los descompiladores incluso busquen este tipo de cosas: esto: -C No descarte los comentarios. Todos los comentarios se pasan al archivo de salida, excepto los comentarios en las directivas procesadas, que se eliminan junto con la directiva. Destaca los efectos secundarios, así como el de la opción -CC (esto es para gcc, aunque probablemente sea el cpp). No es que espere que se aplique al OP, pero tal vez sea de interés para algunos.
Pryftan