2009-11-27 43 views
23

Acabo de terminar de aprender el lenguaje ensamblador. Pero no pude entender qué podría implementar (para práctica/como proyecto pequeño). Sería genial si es algo útil para cualquier persona.Acaba de aprender el lenguaje ensamblador x86. ¿Qué puedo hacer con eso?

+3

No siempre se trata de implementar. El conocimiento moderado del ensamblador puede ayudar bastante cuando se depura (especialmente si alguna vez se encuentra con un error de generación de código del compilador que utiliza). –

+18

¿Has aprendido el ensamblaje sin una razón específica? –

+0

¿Es esta comunidad wiki? No estoy seguro de que haya una respuesta correcta aquí. – iokevins

Respuesta

52

Una de mis aficiones favoritas es Ingeniería inversa.

Requiere un sólido conocimiento de ensamblaje y el uso de desmontadores/depuradores para recorrer el código compilado. Esto le permite alterar, comprender e invertir los programas compilados. ¡Cada nuevo programa es como un rompecabezas esperando a ser resuelto!

Por ejemplo, muchas personas invierten juegos como Minesweeper cuando recién comienzan.

Aquí está una captura de pantalla de una sección clave de código en Buscaminas que invirtió un tiempo atrás (comentarios en el lado derecho): alt text

Esta fue localizado por la colocación de un punto de interrupción en las llamadas a la función rand() y la intensificación hacia atrás en la pila de llamadas. Después de algo de investigación se hace obvio que:

  1. campo de minas de altura está situado en 0x1005338
  2. campo de minas Ancho, ubicado en 0x1005334
  3. campo de minas BaseAddress se encuentra en 0x1005340

Con este conocimiento se convierte en fácil para determinar la ubicación de cualquier mina en el campo de minas:

cellAddress = mapBaseAddress + (32 * (y+1)) + (x+1); 

¡Entonces, con un simple bucle y algunas llamadas al ReadProcessMemory(), tiene el mejor hack Minesweeper!

Leer el ensamblaje escrito a mano es mucho más fácil que leer el ensamblaje generado por la máquina. Los compiladores modernos hacen algunas cosas mágicas y locas para el código para la optimización que a veces puede ser difícil de seguir. Por lo tanto, esto definitivamente impulsará su conocimiento de ensamblaje.

hay un montón de actividades que se ramifican desde esta:

  1. inversas ocultos de la API en las bibliotecas
  2. Escribir piratería de juegos avanzados mediante inyección de DLL, Cuevas de código, función que engancha y mucho más!
  3. Comprenda las limitaciones de varios esquemas de protección empleados por el software
  4. Invierta un formato de archivo que no se haya publicado o conocido y escriba el código para leer este formato con fines de interoperabilidad.
  5. Emuladores de escritura para varios sistemas (incluidos los sistemas de juegos antiguos)
  6. Comprenda cómo un programa conocido hace una tarea en particular.
  7. Invierta malware y virus para ver cómo y qué hacen.

¡Y mucho más!

Si usted está interesado, le recomiendo el libro: Reversing: Secrets of Reverse Engineering

+12

Maldita sea, eso suena genial. Acabas de hacerme querer volver a aprender a ensamblar. +1 – Cybis

+0

¡Explicación excelente y clara! – defines

+0

¿Qué software está usando @Simucal? –

0

Por lo menos ahora se puede ensamblador de salida de gcc como esto:

gcc -c -S test.c -o test.asm

A continuación, se puede inspeccionar la salida del código C generado para propósitos educativos.

3

Usted podría tomar un vistazo al proyecto liboil:

http://liboil.freedesktop.org/wiki/

Es una biblioteca de innerloops altamente optimizados.

La mayoría de los bucles ya tienen una implementación de ensamblador x86, pero todavía quedan algunos bucles para reescribir.

4

Dependiendo de qué tan bien haya aprendido el ensamblaje, podría intentar escribir el firmware para microprocesadores pequeños o incluso para dispositivos pequeños conectados a su computadora. También podría intentar escribir aplicaciones de software completas en ensamblaje y darles una interfaz gráfica de usuario atractiva.

En general, desde mi experiencia, el ensamblaje no es tan útil en la programación de proyectos de software masivos porque para muchas aplicaciones, la velocidad realmente no importa (al menos, no en los días de procesadores multi-core) lo que puedes hacer es algo limitado.

+2

Además, si no eres realmente bueno en la optimización del código, es probable que el compilador genere código más rápido de todos modos. –

+0

La velocidad importa, pero afortunadamente no es necesario que escriba en lenguaje ensamblador para obtener una gran velocidad para sus aplicaciones. Además, es necesario ser un gurú de ensamblaje para superar un compilador moderno en las optimizaciones. –

5

Esto puede parecer muy cliché, pero puede intentar responder algunas de las preguntas al projectueler mediante el ensamblaje.

5

Hoy en día, el ensamblador se utiliza en las siguientes áreas:

  • kernel de desarrollo/OS. Pregúnteles a los chicos de Linux o revisen los otros proyectos de sistema operativo que hay.
  • el desarrollo del compilador (alguien tiene que traducir los lenguajes de alto nivel a la CPU)
  • desarrollo de controladores
  • dispositivos embebidos (pero cada vez más se están moviendo a lenguajes de alto nivel aquí, también ... mis Set Top Box carreras Python) el desarrollo
  • juego para los efectos especiales (pero esto es sobre todo en los dialectos ensamblador específicos para la tarjeta gráfica)
0

Si ya está un desarrollador en un lenguaje de programación de alto nivel, el lenguaje ensamblador que permite crear rutinas/funciones optimizadas. No sé sobre los demás, pero Delphi, por ejemplo, le permite integrar perfectamente el código ensamblador en cualquier unidad, y se encarga de los parámetros de la función, etc.

15

Puede aprender cómo funciona el sistema operativo a bajo nivel (interrupciones , memoria virtual, etc.). Primero escriba un gestor de arranque que le dará acceso completo al hardware, luego podrá comenzar a jugar con el modo protegido, la programación VGA, etc.

Dos buenos recursos:
http://wiki.osdev.org/Main_Page
http://www.osdever.net/FreeVGA/home.htm

[Editar]

Si usted quiere aprender acerca de optimizaciones, echa un vistazo a la página web de Agner Fog: http://agner.org/optimize/.

[Editar]

Copiado del comentario de Simucal:

Es posible que desee añadir un enlace a MikeOS también. Es un pequeño sistema operativo escrito en Assembly que está diseñado como una herramienta de aprendizaje para ver cómo funcionan los sistemas operativos simples. Tiene código y documentación bien comentados: http://mikeos.berlios.de

+7

+1 para los enlaces – jldupont

+0

Bueno, gracias. – Tebo

+0

Ojalá pudiera elegir varias respuestas. – claws

5

Optimización. Aprenda cómo usar el VTune de Intel si programa en Windows. Aquí puedes ver dónde están tus cuellos de botella. Luego, vuelva a escribir esas rutinas en ensamblador.

Como la mayoría de los softwares modernos cambian todo el tiempo, esto es más un ejercicio intelectual y una auto satisfacción para hacer que algo funcione más rápido que beneficios en el mundo real.

Hay una o dos personas que han reescrito muchas de las primordiales C centrales, memcpy, memset etc. en el ensamblador adaptado a la CPU del tiempo de ejecución. Entonces, el código es más grande ya que tiene rutinas adicionales para aprovechar las extensiones de CPU, SSE, etc., pero más rápido. Estos primitivos C a menudo terminan en muchos paquetes .dlls ya que la mayoría de los programas hacen cosas de memoria todo el tiempo.

1

supongo que se podría intentar code-golf

También hay al menos un uno mismo escrito para PC en ensamblaje: MenuetOS. (No tengo idea de por qué.) Pueden querer contribuciones.

Entiendo que antes de la invención de C a principios de la década de 1970, la mayoría de los sistemas operativos se escribían en ensamblaje directo. No recomendaría hacer eso, pero podrías escribir un programa independiente, solo por diversión. Tenga en cuenta que la CPU se iniciará en el modo de 16 bits y es bastante difícil lograr que cambie a 32 bits. Probablemente sea mejor simplemente escribir el programa independiente en 16-bit x86. Puede usar un simulador para el desarrollo.

2

Puede buscar un robot o un controlador que pueda conectarse a su puerto Paralelo y escribir algunos manejadores de teclas geniales para controlarlos. También puede interceptar las llamadas de la BIOS como Int13 for Disk y escribir algunas herramientas de duplicación de disco, controladores RAID, etc. Puede conectar algunos transductores como Temp/vibración/presión, etc. y realizar alguna adquisición de datos.

0

Sería muy bueno si es algo útil para cualquier persona.

Se ha familiarizado con el bajo nivel de funcionamiento de las computadoras. Poder leer el ensamblaje puede ayudarlo a comprender cómo se comporta su compilador.

El resto puede provocar algunas críticas, ya que refleja una vista polarizada. Un día después de un lamentable proyecto integrado, mi mentor me dijo: "Si alguien que trabaja para usted escribe en asamblea, despídalo para que conserve su propio trabajo". Estoy de acuerdo con él. Desde el punto de vista programático, escribiendo en el montaje es demasiado problemático.

Cuestiones relacionadas