compilador - convertir c en asm
convertir ASM a C(no ingenierĂa inversa) (13)
Busqué en Google y veo una cantidad sorprendente de respuestas frívolas que básicamente se ríen del autor de la pregunta por hacer tal pregunta.
Microchip proporciona algún código fuente gratis (no quiero publicarlo aquí en caso de que sea un no-no. Básicamente, google AN937, haga clic en el primer enlace y hay un enlace para el "código fuente" y es un archivo comprimido). Está en ASM y cuando lo miro, comienzo a tener los ojos cruzados. Me gustaría convertirlo en algo parecido al lenguaje de tipo AC para que pueda seguirlo. Porque líneas como:
GLOBAL _24_bit_sub
movf BARGB2,w
subwf AARGB2,f
Probablemente sean muy simples pero no significan nada para mí.
Debe haber algún traductor automático de ASM a C por ahí, pero todo lo que puedo encontrar es gente que dice que es imposible. Francamente, es imposible que sea imposible. Ambos idiomas tienen estructura y esa estructura seguramente puede ser traducida.
gracias.
Debe haber algún traductor automático de ASM a C por ahí, pero todo lo que puedo encontrar es gente que dice que es imposible. Francamente, es imposible que sea imposible.
No, no es. La compilación pierde información: hay menos información en el código de objeto final que en el código fuente de C. Un descompilador no puede crear mágicamente esa información de la nada, por lo que la descompilación verdadera es imposible.
Absolutamente se puede hacer un programa de CA de ensamblador. El problema es que puede no parecerse a lo que estás pensando, o quizás lo sea. Mi PIC está oxidado pero usando otro ensamblador, digamos que tenías
add r1,r2
En C digamos que se convierte en
r1 = r1 + r2;
Posiblemente más legible. Se pierde el sentido de los nombres de las variables, tal vez los valores saltan de la memoria a los registros y regresan y los registros se están reutilizando. Si estás hablando de las fotos más antiguas que tenían lo que dos registran un acumulador y otro, bueno, en realidad podría ser más fácil porque las variables estaban en la memoria en su mayor parte, miras la dirección, algo así como
q = mem[0x12];
e = q;
q = mem[0x13];
e = e + q;
mem[0x12] = e;
Largo y extenso, pero está claro que mem [0x12] = mem [0x12] + mem [0x13];
Estas ubicaciones de memoria son probablemente variables que no saltarán como el código C compilado para un procesador con un montón de registros. La imagen puede facilitar la identificación de las variables y luego hacer una búsqueda y reemplazarlas para nombrarlas en el archivo.
Lo que está buscando se llama traducción binaria estática, no necesariamente una traducción de un binario a otro (de un procesador a otro), pero en este caso una traducción del binario pic al C. Idealmente, usted querría tomar el ensamblador dado en el Nota de la aplicación y móntela en un binario con las herramientas de microchip, luego haga la traducción. También puedes hacer una traducción binaria dinámica, pero es incluso menos probable que encuentres uno de ellos y normalmente no da como resultado C, sino un binario a otro. ¿Alguna vez te has preguntado cómo funcionan esos joysticks de $ 15 en Wal-Mart con pac-man y galaga? La rom del arcade se convirtió utilizando una traducción binaria estática, se optimizó y se limpió, y la C o cualquier lenguaje intermedio compilado para el nuevo procesador de destino en la caja de la computadora de mano. Me imagino que no todos se hicieron de esta manera, pero estoy bastante seguro de que algunos lo fueron.
La pregunta del millón, ¿puedes encontrar un traductor binario estático para una foto? Quién sabe, probablemente tengas que escribir uno tú mismo. Y adivine qué significa eso, escriba un desensamblador y, en lugar de desensamblar una instrucción en la sintaxis del ensamblador nativo, como agregar r0, r1 imprimirá su desensamblador r0 = r0 + r1; Para cuando termine este desensamblador, sabrá tan bien el lenguaje ensamblador pic que no necesitará el traductor de asm a C. Tienes un problema de huevo y gallina.
Creo que es más fácil tomar un libro sobre el ensamblaje de PIC y aprender a leerlo. El ensamblador es generalmente bastante simple de aprender, ya que es un nivel muy bajo.
Echa un vistazo a asm2c
Herramienta Swift para transformar código de ensamblaje TASM DOS / PMODEW 386 a código C
Echa un vistazo a esto: Decompiler
Un descompilador es el nombre dado a un programa de computadora que realiza la operación inversa a la de un compilador. Es decir, traduce un archivo que contiene información a un nivel relativamente bajo de abstracción (generalmente diseñado para ser legible por computadora en lugar de legible por humanos) en una forma que tenga un nivel más alto de abstracción (generalmente diseñado para ser legible por humanos).
Es difícil convertir una función de asm a C, pero se puede hacer a mano. Convertir un programa completo con un descompilador le dará un código que puede ser imposible de entender, ya que gran parte de la estructura se perdió durante la compilación. Sin nombres significativos de variables y funciones, el código C resultante es aún muy difícil de entender.
No es fácilmente posible.
Una de las grandes ventajas de C sobre ASM, aparte de la legibilidad, fue que impidió trucos de programación "inteligentes".
Hay muchas cosas que puede hacer en ensamblador que no tienen un equivalente directo de C, o implican una sintaxis tortuosa en C.
El otro problema es que los tipos de datos, la mayoría de los ensambladores, tienen solo dos tipos de datos intercambiables: bytes y palabras. Puede haber algunas construcciones de lenguaje para definir ints y flotadores, etc. pero no se intenta verificar que la memoria se usa como se define. Por lo tanto, es muy difícil asignar el almacenamiento ASM a los tipos de datos C.
Además, todo el almacenamiento del ensamblador es esencialmente una "estructura"; el almacenamiento se distribuye en el orden en que se define (a diferencia de C, donde el almacenamiento se ordena a capricho del tiempo de ejecución). Muchos programas de ASM dependen del diseño de almacenamiento exacto; para lograr el mismo efecto en C, tendría que definir todo el almacenamiento como parte de una sola estructura.
También hay una gran cantidad de instrucciones en uso (en el viejo IBM Manframes LA, la dirección de carga, la instrucción se usaba con regularidad para realizar aritmos simples, ya que era más rápida y no necesitaba un registro de desbordamiento)
Si bien puede ser técnicamente posible traducir a C, el código C resultante sería menos legible que el código ASM que se tradujo.
No es imposible, es muy difícil. Un ensamblador experto y programador en C probablemente podría hacerlo, o puedes mirar usando un Decompiler . Algunos de estos hacen un buen trabajo al convertir el asm a C, aunque es probable que tenga que cambiar el nombre de algunas variables y métodos.
Visite este sitio para obtener una lista de los descompiladores disponibles para la arquitectura x86.
No se puede convertir de manera determinista el código del ensamblaje a C. Las interrupciones, el código de auto-modificación y otras cosas de bajo nivel no tienen representación más que el ensamblado en línea en C. Hay solo una medida en la que un ensamblado a C puede funcionar. Sin mencionar que el código C resultante será más difícil de entender que leer el código de ensamblaje ... a menos que esté usando esto como base para comenzar la reimplementación del código de ensamblaje en C, entonces es algo útil. Echa un vistazo a la extensión Hex-Rays para IDA.
Obtener el mismo código fuente de un programa compilado es básicamente imposible. Pero los descompiladores han sido un área de investigación en ciencias de la computación (por ejemplo, el descompilador dcc , que fue un proyecto de doctorado).
Hay varios algoritmos que se pueden usar para hacer una comparación de patrones en el código de ensamblaje y generar un código C equivalente, pero es muy difícil hacerlo de una manera general que funcione bien para todas las entradas.
Es posible que desee revisar Boomerang para un esfuerzo de código abierto semi-reciente en un descompilador generalizado.
Puedo decir que con una garantía del 99%, no hay un convertidor listo para este lenguaje ensamblador, por lo que necesita escribir uno. Simplemente puede implementarlo reemplazando el comando ASM con la función C:
movf BARGB2,w -> c_movf(BARGB2,w);
subwf AARGB2,f -> c_subwf(AARGB2,f);
Esta parte es fácil :) Entonces necesitas implementar cada función. Puede declarar registros como globales para facilitar las cosas. También puede usar no funciones, pero # define, llamando a funciones si es necesario. Esto ayudará con el procesamiento de argumentos / resultados.
#define c_subwf(x,y) // I don''t know this ASM, but this is some Substraction must be here
El caso especial son las directivas / etiquetas de ASM, creo que se puede convertir solo con #defines.
La diversión comienza cuando llegas a algunas características específicas de la CPU. Esto puede ser llamadas a funciones simples con operaciones de pila, algunas operaciones específicas de IO / Memoria. Más divertidas son las operaciones con el registro de contador de programas, que se utilizan para cálculos, o para usar / contar tics / latencias.
Pero hay otra manera, si este hardcore sucede. Es hardcore también :) Existe una técnica llamada recompilación dinámica . Se utiliza en muchos emulators .
No necesitas recompilar tu ASM, pero la idea es casi la misma. Puede usar todos sus #defines desde el primer paso, pero agregue el soporte de la funcionalidad necesaria para ellos (incrementando PC / Ticks). También debe agregar algún entorno virtual para su código, como los administradores de memoria / IO, etc.
Buena suerte :)
Sí, es muy posible aplicar ingeniería inversa al código de ensamblador a una buena calidad C.
Trabajo para un MicroAPL, una compañía que produce una herramienta llamada Relogix para convertir el código del ensamblador a C. Se mencionó en una de las otras publicaciones.
Por favor, eche un vistazo a los ejemplos en nuestro sitio web:
Una vez trabajé en un proyecto donde una parte importante de la propiedad intelectual eran algoritmos serios codificados en el código de ensamblaje x86. Para portar el código a un sistema integrado, el desarrollador de ese código (no yo) usó una herramienta de un equipo llamado MicroAPL (si recuerdo bien):
Me sorprendió mucho lo bien que lo hizo la herramienta.
Por otro lado, creo que es una de esas cosas "si tiene que preguntar, no puede permitírselo" (sus rangos de precios para una conversión única de un proyecto funcionan a aproximadamente 4 líneas de ensamblaje procesadas). por un dólar).
Pero, a menudo, las rutinas de ensamblaje que obtiene de un proveedor se empaquetan como funciones a las que se puede llamar desde C, por lo que siempre que las rutinas hagan lo que usted desea (en el procesador que desea usar), es posible que solo necesite ensamblarlas. Más o menos olvídate de ellos, son solo funciones de biblioteca a las que llamas desde C.