2012-03-30 22 views
9

Estoy aprendiendo el ensamblaje, la motivación es capaz de ingeniero inverso. Estoy tratando de encontrar el ensamblador con el que debería comenzar, para poder encontrar tutoriales y comenzar a escribir algunos ensamblajes.NASM es ensamblado puro, pero MASM es ensamblado de alto nivel?

Me enteré de que MASM tiene muchas construcciones integradas, así que las usaré principalmente en lugar de codificarlas, lo que tendré que hacer si elijo NASM.

Mi pregunta es ... ¿es eso cierto? Si es así, qué ensamblador sugieres para aprender a ensamblar desde la perspectiva de un ingeniero inverso y algunos buenos tutoriales para él.

Además, si tiene otras sugerencias con respecto a la inversión? Enfoque alternativo o algo así?

P.S: He leído muchos artículos y preguntas aquí, pero todavía estoy confundido.

+4

Al invertir, lee principalmente el ensamblaje. Entonces no te beneficias con construcciones de alto nivel. – CodesInChaos

+0

Un poco fuera de tema pero dado que está interesado en la ingeniería inversa, por favor, confirme la propuesta de sitio de ingeniería inversa aquí: http://area51.stackexchange.com/proposals/26607/reverse-engineering – teukkam

+0

votantes negativos? ¿Cualquier razón? – questions

Respuesta

7

Mi recomendación, desde el punto de vista de la "ingeniería inversa", es comprender cómo un compilador traduce conceptos de alto nivel a instrucciones de lenguaje ensamblador en primer lugar. La comprensión de cómo se realiza la asignación de registros en varios compiladores y cómo varias optimizaciones oscurecerán la representación de alto nivel de los bucles anidados (et.al.) es más importante que la capacidad de escribir un dialecto particular de entrada de ensamblaje.

Su mejor opción es comenzar con los archivos intermedios del lenguaje ensamblador del código fuente que escribe (vea this question for more information). Luego puede cambiar la fuente y ver cómo afecta los archivos intermedios. El otro lugar para comenzar es usando un desensamblador interactivo como IDA Pro.

En realidad escribir programas de lenguaje ensamblador y aprender la sintaxis de NASM, MASM, gas, de as es la parte más fácil y realmente no importa cuál aprende. Son muy similares porque la sintaxis del idioma de origen es muy básica. Si planea aprender a desensamblar y entender qué está haciendo un programa, entonces ignoraría por completo los macroensambladores ya que las macros desaparecerían por completo durante la traducción y no los verá cuando vea la salida del desensamblador.

Diatriba de aprendizaje Asamblea

Aprender un lenguaje ensamblador es diferente que el aprendizaje de un lenguaje de programación de alto nivel. Hay menos construcciones sintácticas si ignora los ensambladores de macros. El problema es que cada cadena de compiladores tiene una representación ligeramente diferente, por lo que debe concentrarse en conceptos tales como modos de direcciones compatibles, restricciones de registro, etc. Estos no son parte del lenguaje en sí, ya que están dictados por el hardware.

El enfoque que tomé (parcialmente porque la universidad me obligó a hacerlo), es explorar y comprender el hardware en sí (por ejemplo, # de registros, tamaño de registros, tipo de instrucciones de ramificación compatibles, etc.) y un poco más conceptos académicos tales como interrupciones y el uso de la manipulación bit a bit para la concordancia de enteros antes de comenzar a escribir programas de lenguaje ensamblador. Esta es una ruta mucho más larga, pero da como resultado una gran comprensión del ensamblaje y la forma de escribir programas de alto rendimiento.

Lo interesante es que en el tiempo que pasé aprendiendo ensamblaje y construcción de compiladores (que está intrínsecamente relacionado), realmente escribí muy pocos programas de ensamblaje. Con más frecuencia, debo escribir pequeños fragmentos de ensamblaje en línea aquí y allá (por ejemplo, configurar registros de índice cuando el cargador de tiempo de ejecución no lo hizo).He dedicado una enorme cantidad de tiempo a disecar los volcados de emergencia desde una ubicación de memoria, un archivo de mapa de cargador y listas de salida de ensamblador. Honestamente, puedo decir que la sintaxis de cada ensamblador es radicalmente diferente, así como lo que harán los diversos compiladores para confundir el intento en un código rápido o pequeño.

Aprender a escribir programas de ensamblaje fue la parte menos valiosa del proceso educativo. Era necesario entender cómo se traduce la fuente a los bits y bytes que ejecuta la computadora, pero realmente no era lo que realmente necesitaba para realizar una ingeniería inversa desde un binario en bruto (desensamblador -> lista de ensamblaje -> mejor estimación de intento de alto nivel) o un volcado de memoria. Hago más de esto último, pero los requisitos del trabajo son los mismos.

  1. Realmente tiene que entender cuáles son las limitaciones de la arquitectura.
  2. Hay que conocer la sintaxis muy básica del ensamblador de pregunta - ¿cómo se indican los modos de dirección, cómo se indican los registros, lo que es del orden de argumentos para una move
  3. qué transformaciones de un compilador para pasar de if (a > 0) a mov.b r0,d0 ... bnz $L

comenzar por aprender acerca de la arquitectura del ordenador (por ejemplo, leer algo de Andrew Tanenbaum), entonces, ¿cómo un sistema operativo realmente carga y ejecuta un programa (Linkers & Loaders de Levine), a continuación, compilar programas sencillos en C/C++ y buscar en la asamblea listados de idiomas.

+3

Pero para entender el desmontaje ... ¿no necesito aprender a ensamblar? – questions

+2

@ preguntas: Creo que la mejor manera de aprender el ensamblaje es mirar el código desmontado y descubrir qué hace. Pero esa es mi opinión personal. – hirschhornsalz

Cuestiones relacionadas