2009-09-04 18 views
18

Busqué en Google y veo una sorprendente cantidad de respuestas frívolas que se ríen básicamente del que pregunta por esa pregunta.convertir ASM en C (no en el de ingeniería inversa)

Microchip proporciona algún código fuente de forma gratuita (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 "código fuente" y es archivo comprimido). Está en ASM y cuando lo miro empiezo a mirar bizco. Me gustaría convertirlo en algo parecido a un lenguaje de tipo c para poder seguirlo. Debido a líneas como:

GLOBAL _24_bit_sub 
movf BARGB2,w 
subwf AARGB2,f 

son probablemente muy simples pero no significan nada para mí.

Debe haber algún traductor automatizado de ASM a C por ahí, pero todo lo que puedo encontrar es que la gente diga que es imposible. Francamente, es imposible que sea imposible. Ambos lenguajes tienen estructura y esa estructura seguramente puede traducirse.

gracias.

+3

Francamente, den una razón por la que debe ser posible. – Gerhard

+4

Si quiere entender el código, la única forma es aprender este lenguaje ensamblador. La traducción automática le dará algo ilegible. Tal vez incluso más ilegible que la fuente. Y el decompilador (si existe) no puede ayudarlo, si este código está escrito a mano (no compilado primero). Pero si solo quieres ejecutar/portar el código, mira mi publicación. – zxcat

+0

@Gerhard Ya hay un compilador de ensamblador lenguaje-a-C llamado Boomerang. Algunos programas de lenguaje ensamblador pueden descompilarse automáticamente en C, como [este de aquí] (http://boomerang.sourceforge.net/cando.php?hidemenu). –

Respuesta

37

Puede hacer absolutamente un programa c desde ensamblador. El problema es que puede no parecerse a lo que estás pensando, o tal vez lo hará. Mi PIC está oxidado, pero utilizando otro ensamblador, decir que tenía

add r1,r2 

En C que permite decir que se convierte en

r1 = r1 + r2; 

Posiblemente sea más legible. Perderá el sentido de los nombres de las variables, tal vez porque los valores saltan de la memoria a los registros y viceversa, y los registros se vuelven a utilizar. Si usted está hablando de las fotos antiguas que tenía lo que dos registros de un acumulador y otro, así que en realidad podría ser más fácil ya que las variables estaban en la memoria en su mayor parte, nos fijamos en la dirección, algo así como

q = mem[0x12]; 
e = q; 
q = mem[0x13]; 
e = e + q; 
mem[0x12] = e; 

largo y extraído, pero está claro que mem [0x12] = mem [0x12] + mem [0x13];

Estas ubicaciones de memoria son variables probables que no saltan como código C compilado para un procesador con un montón de registros. La imagen podría facilitar la determinación de las variables y luego buscar y reemplazar para nombrarlas en el archivo.

Lo que está buscando se llama una traducción binaria estática, no necesariamente una traducción de un binario a otro (un procesador a otro) pero en este caso una traducción de pic binary a C. Idealmente, usted querría tomar el ensamblador dado en la nota de la aplicación y ensamblarlo en un binario utilizando las herramientas de microchip, luego hacer la traducción. También puede realizar una traducción binaria dinámica, pero es aún menos probable que encuentre una de ellas y normalmente no resulta en C, sino en un binario a otro. ¿Alguna vez se ha preguntado cómo funcionan esos joysticks de $ 15 en Wal-Mart con pac-man y galaga? La rom del arcade se convirtió utilizando la traducción binaria estática, optimizada y limpiada, y el C o cualquier lenguaje intermedio compilado para el nuevo procesador de destino en el cuadro 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 de dólares, ¿puedes encontrar un traductor binario estático para una foto? Quién sabe, probablemente debas escribir uno tú mismo. Y adivina qué significa eso, escribes un desensamblador, y en lugar de desensamblar una instrucción en la sintaxis del ensamblador nativo como add r0, r1, tienes tu desensamblador print r0 = r0 + r1; En el momento en que termine este desensamblador, conocerá el lenguaje ensamblador de imágenes tan bien que no necesitará el conversor asm a C. Usted tiene un problema de huevo y pollo.

+7

Buenos puntos; +1 para tus explicaciones. Sin embargo, no creo que se pueda hacer 100% automáticamente. Porque en el montaje el código puede usar cada bit de la CPU. Por ejemplo, los efectos secundarios como el ajuste de cero y los bits de acarreo y de signo se pueden usar en cualquier lugar del código. Normalmente, estos no son visibles en C. Entonces, dicho traductor necesitaría filtrar los cambios previstos de los no intencionados. La virtualización es más fácil, ya que no necesita una comprensión del código, simplemente modela la CPU. – Adriaan

+2

Se puede hacer 100% automáticamente y preservar la semántica. El estilo de codificación y otras convenciones, por otro lado, se perderán por completo (porque están implícitos). –

6

Debe haber algún traductor automatizado de ASM a C, pero lo único que puedo encontrar es que la gente diga que es imposible. Francamente, es imposible que sea imposible.

No, no lo es. La compilación pierde información: hay menos información en el código objeto final que en el código fuente C. Un decompilador no puede crear mágicamente esa información de la nada, por lo que la verdadera descompilación es imposible.

+2

A menos que malinterprete algo, la pregunta no es sobre descompilar, sino convertir la fuente de ASM a C – UnkwnTech

+15

. No está pidiendo que sea descompilador de nuevo a la fuente * original * (ese es el problema de la hamburguesa a la vaca). Solo quiere una traducción C *, lo cual es absolutamente posible porque C es Turing-completo. – caf

+2

¿Alguna vez utilizó un ensamblador para el traductor C? Escupieron lenguaje ensamblador pero con sintaxis C: se obtienen variables como 'eax' y' ebx' (para IA-32). Son casi, pero no del todo, completamente inútiles. También puede aprender a leer el lenguaje ensamblador. – kquinn

3

Salida esto: decompiler

Un decompilador es el nombre dado a un programa equipo que realiza la operación inversa a la de un compilador . Es decir, se traduce una que contiene información archivo en un relativamente bajo nivel de abstracción (por lo general diseñado para ser equipo legible en lugar de legible por humanos) en una forma que tiene un mayor nivel de abstracción (por lo general diseñado para ser humana legible).

17

conseguir exactamente el mismo código fuente volver de un programa compilado es básicamente imposible. Pero los decompiladores han sido un área de investigación en ciencias de la computación (por ejemplo, the dcc decompiler, que fue un proyecto de doctorado).

Existen varios algoritmos que se pueden usar para hacer coincidencia de patrones en el código ensamblador y generar código C equivalente, pero es muy difícil hacerlo de una manera general que funciona bien para todas las entradas.

Es posible que desee comprobar Boomerang para un esfuerzo de código abierto semi reciente en un descompilador generalizado.

+0

Boomerang funcionó bastante bien para mi propósito, ¡gracias! – Steven

+0

Hablé demasiado pronto. Primero, cuando escribí "funcionó" fue un error tipográfico, que se suponía que era "obras". Leí sus páginas pero no las había intentado. ¡Ahora que lo tengo, no funciona para nada! Definitivamente es para ingeniería inversa, ya que SOLO aceptará (estúpidamente) un archivo binario. Suspiro. Tal vez "descompilador" no es lo que estoy buscando, sino simplemente un "traductor" – Steven

+2

@Steven: - ¿no podrías compilar el código y luego descompilarlo usando Boomerang? –

4

No es imposible, simplemente es muy difícil. Un ensamblador habilidoso y un programador de C probablemente podrían hacerlo, o podría mirar usando un Decompiler. Algunos de ellos hacen un buen trabajo al convertir el asm a C, aunque probablemente tendrá que cambiar el nombre de algunas variables y métodos.

Consulte this site para obtener una lista de descompiladores disponibles para la arquitectura x86.

3

No es posible.

Una de las grandes ventajas de C sobre ASM, aparte de la legibilidad, era que evitaba los trucos de programación "inteligentes".

Hay muchas cosas que se pueden hacer en ensamblador que no tienen equivalente C directa, o que involucren sintaxis tortuosa en C.

El otro problema es la mayoría de los tipos de datos montadores essentialy tener sólo dos tipos de datos intercambiables: bytes y palabras. Puede haber algunas construcciones de lenguaje para definir ints y floats etc. pero no hay ningún intento de verificar que la memoria se use como se define. Por lo tanto, es muy difícil mapear el almacenamiento de ASM a los tipos de datos de C.

Además, todo el almacenamiento del ensamblador es esencialmente una "estructura"; el almacenamiento se organiza en el orden en que se define (a diferencia de C, donde el almacenamiento se ordena según el capricho del tiempo de ejecución). Muchos programas de ASM dependen del diseño de almacenamiento exacto: para lograr el mismo efecto en C necesitarás definir todo el almacenamiento como parte de una única estructura.

También hay una gran cantidad de instrucciones absused (el viejo mundo Olde IBM manframes la LA, dirección de carga, la instrucción era regularmente utilizado para realizar arithimatic sencilla, ya que era más rápido 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.

7

Una vez trabajé en un proyecto en el que una parte importante de la propiedad intelectual consistía en algoritmos serios codificados en código de ensamblaje x86. Para aportar el código a un sistema embebido, el desarrollador de ese código (no yo) utiliza una herramienta de un grupo llamado MicroAPL (si no recuerdo mal):

que era muy, muy sorprendido de lo bien que lo hizo la herramienta.

Por otro lado, creo que es uno de esos tipos de cosas "si tienes que preguntar, no puedes pagarlo" (sus rangos de precios para una conversión única de un proyecto rondan las 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 que se pueden llamar desde C, siempre que las rutinas hagan lo que desee (en el procesador que desee usar), es posible que solo necesite para ensamblarlos y olvidarse más o menos de ellos, son solo funciones de biblioteca que llama desde C.

+1

sí, está destinado a ser llamado. El problema es que ya tenemos un PID de cosecha propia que funciona más o menos bien. Quiero ver si su implementación ofrece alguna ventaja. No sé si alguna vez afinaron un control PID, pero es muy tedioso y lento, por lo que vale la pena convencerme de que hay una razón para hacerlo en lugar de solo usarlo y esperar lo mejor. por otro lado ... no vale la pena pagar nada por :) – Steven

0

Es difícil convertir una función de asm a C pero posible a mano. La conversión de 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 sigue siendo muy difícil de entender.

2

Puedo decir que con un 99% de garantía, no hay un convertidor listo para este lenguaje ensamblador, por lo que debe escribir uno. Usted puede simplemente ponerlo en práctica la sustitución de comandos 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 :) Luego hay que aplicar cada función. Puede declarar registros como globales para facilitar las cosas. También puede usar funciones no, pero define #, llamando 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 

Caso especial es directivas/etiquetas de ASM, creo que se puede convertir con #defines solamente.

La diversión comienza cuando se alcanzan 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 del contador de programas, que se usan para cálculos o usan/cuentan tics/latencias.

Pero hay otra manera, si sucede esto del hardcore. Es duro también :) Existe una técnica llamada dynamic recompilation existe. Se usa en muchos emulators.

No necesita recompilar su ASM, pero la idea es casi la misma. Puede usar todas sus definiciones del primer paso, pero agregue compatibilidad con las funciones necesarias (incrementando PC/Ticks). También necesita agregar algún entorno virtual para su código, como administradores de memoria/IO, etc.

Buena suerte :)

1

Creo que es más fácil de tomar un libro en el montaje de CFP y aprender a leerlo. Ensamblador es generalmente bastante simple de aprender, ya que es de muy bajo nivel.

8

Usted no puede forma determinista convertir el código de montaje a C. Las interrupciones, código mutante, y otras cosas de bajo nivel tiene ninguna representación que no sea ensamblado en línea en C. Sólo hay alguna medida en que una asamblea para El proceso C puede funcionar. Sin mencionar que el código C resultante probablemente será más difícil de entender que leer el código ensamblador ... a menos que esté usando esto como base para comenzar la reimplementación del código ensamblador en C, entonces es algo útil. Mira el plugin de Hex-Rays para IDA.

+1

... aunque los rayos X también pueden ser ** bastante ** engañosos, especialmente si usted está más acostumbrado al desmontaje ... – 0xC0000022L

+0

estuvo de acuerdo. no sé por qué no mencioné eso –

6

Sí, es muy posible código ensamblador para una buena calidad C.

trabajo para una MicroAPL, una compañía que produce una herramienta llamada Relogix para convertir código ensamblador para C. Se mencionó en una ingeniería inversa, de los otros mensajes.

favor, eche un vistazo a los ejemplos en nuestro sitio web:

http://www.microapl.co.uk/asm2c/index.html

0

Salida asm2c

herramienta Swift para transformar código/PMODEW 386 Asamblea TASM DOS para el código C

Cuestiones relacionadas