open - hex editor windows 10
¿Cómo escribir y ejecutable Windows.exe manualmente(código de máquina con editor Hex)? (6)
1) un archivo .com es el más simple para comenzar y se ejecutará en dosbox, básicamente el programa comienza en algo como offset 0x100 en el archivo, creo que el primer 0x100 puede ser lo que sea, no lo recuerdes
2) aunque es cierto que los primeros programas a menudo se escriben y se ensamblan a mano en el código de la máquina, estamos hablando de que cuando agrega dos números, los guarda en la memoria y está tan feliz de que se tome el resto del día libre. un programa de "mundo hello" que imprime cosas en una tarjeta de video es mucho más complicado. Ahora puede hacer uno muy simple utilizando dos llamadas al sistema, y tal vez eso no es lo que le interesa, tal vez lo es.
3) basado en 2, cualquier cosa más complicada que una o unas pocas instrucciones a la vez en las décadas de 1960 o 1970, incluso cuando escribes ensamblando manualmente un programa, escribes tu programa en ensamblador a mano, y luego lo ensamblas en código máquina, luego cárgalo. Básicamente, aprenda primero el lenguaje ensamblador, luego aprenda cómo generar el código máquina para él, luego comience a escribir esos bytes en un editor hexadecimal. No es entonces 1960, a menos que disfrute de un dolor excesivo, aprenda lo anterior al escribir asm, use un ensamblador para generar el código de máquina, luego use un desensamblador para desmontarlo y examine el lenguaje ensamblador y el código máquina uno al lado del otro para mejorar significativamente la cantidad de tiempo que le tomará obtener un programa de trabajo. Si trabajó para una empresa de chips antes de que hubiera sistemas operativos y conjuntos de instrucciones, aún se aprovecharía de otros miembros del equipo, los diseñadores de chips, etc. para comprender cómo hacer el código de máquina y organizarlo. Usted no se daría cuenta de esto con solo experiencia lingüística de alto nivel y hacerlo todo por su cuenta con la esperanza de tener éxito.
4) x86 es un conjunto de instrucciones horrible, si no conoces el ensamblaje, te recomiendo que no lo aprendas primero. tener una x86 es la peor excusa que escuché para aprender x86 primero. ya mencionó dosbox, por lo que ya está planeando emular / simular, use un buen conjunto de instrucciones y simule o compre ese hardware (menos de $ 50, incluso por debajo de $ 20, le comprarán una placa con conjuntos de instrucciones mucho mejores). Recomiendo simular / emular primero y en paralelo con el hardware si elige comprar alguno. Si realmente quieres una educación, escribe tu propio simulador, no es nada difícil. Tal vez invente su propio conjunto de instrucciones.
5) Tengo una colección de simuladores y otros recursos de metal desnudo http://github.com/dwelch67 El msp430 no está mal, puedes obtener el hardware por menos de $ 5 si sientes la necesidad. Brazo es bueno, ambos basados en 32/16 (raspberry pi, sam7s, etc.) y 16 bit thumbs (basado en cortex-m, mbed, maple mini, stm32f4 discovery, etc.). El simulador ámbar viene de un procesador de código abierto que estoy simulando con el verilador, por lo que puede, si lo elige, tener la ventaja de mirar dentro del procesador para ver qué está sucediendo en el nivel de la señal. thumbulator no requiere nada más que el compilador ac / c ++ para ponerlo en funcionamiento, el formato de archivo "binario" puede escribir el "código de máquina" en hexadecimal y solo tiene que ir, con un editor hexadecimal lo hará de todos modos. Tengo varios simuladores de conjuntos de instrucciones para elegir, además de ejemplos de bare metal incrustado en algunas placas que cuestan entre $ 5 y digamos $ 80.
6) nada de esto te ayudará a entender lo que hace un compilador. Conocer el lenguaje ensamblador y luego desensamblar el resultado de los compiladores es su mejor camino hacia ese conocimiento, el código de la máquina no está involucrado, no es necesario ejecutar realmente los programas. Un compilador va del lenguaje de nivel superior a un lenguaje de nivel inferior (de C a asm o de C ++ a asm, por ejemplo). Luego, comprenda lo que hace un ensamblador, hay muchas soluciones diferentes, tanto debido a la historia como debido a otras razones. La solución típica de hoy es un compilador, ensamblador y enlazador separado (el compilador llama al ensamblador y al enlazador por usted a menos que le diga que no; los tres pasos están ocultos a la vista; de hecho, el proceso de compilación puede ser más de un programa). ejecutar para completar esa tarea). Los ensambladores que generan un binario tendrán que resolver todo el programa, los ensambladores que generan un objeto dejarán agujeros en el código de máquina para que el enlazador complete. Cosas como ramificar o llamar elementos en otro objeto que no puede codificar hasta que el enlazador coloque cosas en el binario y conoce el espaciado / direccionamiento. También accediendo a variables que viven en otros objetos.
Probablemente no ve ejemplos reales en la edición hexadecimal de un programa porque primero es una pregunta tan amplia que no hay una respuesta simple (qué operación, sistema, qué sistema llama o qué los está creando, qué formato de archivo, qué editor hexadecimal, etc. ) También porque es una pregunta y un problema de alto nivel, las preguntas reales son: ¿dónde aprendo el ensamblaje ?, ¿dónde aprendo la relación entre el ensamblaje y el código de máquina ?, ¿dónde aprendo las llamadas al sistema (que no son una pregunta de ensamblaje? no están relacionados con el aprendizaje asm, aprendes el lenguaje ensamblador y aprendes a usarlo como una herramienta para realizar llamadas al sistema si no puedes realizar las llamadas al sistema directamente usando un lenguaje más alto), ¿dónde aprendo los formatos de archivo ejecutables como .com, .exe, coff, elf, etc. ¿Qué es un editor hexadecimal bueno o fácil o algún adjetivo que se ejecuta en el sistema operativo o entorno xyz. Haga esas preguntas por separado y encontrará las respuestas y ejemplos, y una vez que tenga esas respuestas sabrá cómo hacer un programa usando un editor hexadecimal escribiendo en código máquina. Un ejemplo más breve es que ESTÁS viendo ejemplos hexadecimales de programas completos cuando ves el desmontaje de un programa publicado en SO, algunos de los cuales son programas completos que se muestran en hexadecimal. y si conoce el formato de archivo, simplemente puede escribirlo en un editor hexadecimal.
Me gustaría saber cómo es posible escribir algo tan simple como un programa Hello World con solo usar un editor hexadecimal. Sé que podría usar un ensamblador y lenguaje de ensamblaje para esto a un nivel cercano a la máquina, pero solo quiero experimentar con realmente escribir códigos de máquina en un ejemplo de juguete como Hello World.
Esto podría ser un simple archivo DOS .COM que puedo ejecutar en DOSBox. Pero sería bueno si alguien pudiera proporcionar un ejemplo para un archivo .EXE para ejecutarlo directamente en mi PC con Windows.
Esto es pura curiosidad. No ... No estoy pensando en escribir programas directamente en código de máquina binaria (ni siquiera suelo escribir código ensamblador, solo uso C / C ++ como mis herramientas de bajo nivel la mayoría del tiempo). Solo quiero ver si es posible hacerlo, porque probablemente alguien tuvo que hacerlo en los primeros días de las computadoras.
PD: Sé que hay preguntas similares sobre este tema, pero ninguna proporciona un ejemplo de trabajo. Solo quiero un ejemplo simple para que pueda ayudarme a entender cómo los compiladores y ensambladores generan un archivo ejecutable. Quiero decir ... alguien debe haber hecho esto a mano en el pasado para los primeros programas. Además, para el formato EXE de Windows, debe haber alguien en Microsoft que haya escrito las primeras herramientas para generar el formato y la forma en que Windows lo lee y luego lo ejecuta.
Escribí un artículo sobre cómo crear archivos binarios ejecutables de DOS simplemente usando el ECHO en el símbolo del sistema. ¡No se requieren otras utilidades HEX de terceros ni IDEs x86!
La técnica utiliza una combinación de teclado - códigos ALT ASCII que convierten OPCODES a un formato binario legible directamente bajo MSDOS. El resultado es un archivo binario * .com completamente ejecutable.
http://colinord.blogspot.co.uk/2015/02/extreme-programming-hand-coded.html
Extracto: escriba los siguientes comandos clave en el símbolo del sistema DOS recordando mantener ALT izquierda.
c:/>Echo LALT-178 LALT-36 LALT-180 LALT-2 LALT-205 LALT-33 LALT-205 LALT-32 > $.com
Los códigos anteriores son en realidad valores de código de operación que describen un programa de ensamblaje X86 para imprimir un signo de dólar en la pantalla.
Su mensaje debería verse algo similar a continuación cuando haya terminado. ¡Presiona enter para construir!
c:/>Echo ▓$┤☻═!═ > $.com
Ejecute el archivo ''$ .com'' y verá que se muestra un solo dólar ($) en la pantalla.
c:/>$.com
$
c:/>
¡Felicidades! Acabas de crear tu primer archivo ejecutable codificado a mano denominado $ .com.
Hago binarios a mano, pero creo que es más fácil en el ensamblaje que un editor hexadecimal puro, donde actualizar cualquier cosa sería difícil.
El más fácil es seguramente el formato DOS COM, que incluso puede escribir en el bloc de notas , o al menos, es muy fácil incluso para un Hello World normal.
El EXE (formato no DOS) no requiere mucho tampoco ver here .
Si estás tratando de hacer un PE, puedes hacer un TinyPE .
La mayoría de los binarios deberían estar disponibles como PE , y EXE y COM .
Hay un exe bastante minimalista pero totalmente funcional (en Win7, también) en corkami/wiki/PE101 , cada byte se explica en el gráfico. Puede escribirlo todo a mano en un editor hexadecimal, pero los rellenos pueden hacer que sea un poco tedioso.
En cuanto a la historia, sí alguien en Microsoft inventó el formato exe (el antiguo formato DOS MZ exe) y él (u otra persona en Microsoft) escribió un cargador para él y un enlazador, que es lo que tradicionalmente convierte el resultado de un compilador ("archivos de objeto") en archivos ejecutables. Es posible (e incluso probable, yo diría) que los primeros programas ejecutables se escribieron a mano, después de todo, solo pretendían probar el nuevo cargador.
Más tarde, Microsoft extendió el formato COFF de AT & T al formato PE, que aún tiene el encabezado MZ y normalmente (pero, opcionalmente, no está en el ejemplo de corkami, y puede ser cualquier cosa) incluye un pequeño programa DOS solo para imprimir el mensaje "Este programa no se puede ejecutar en modo DOS".
No se ve bien, pero este tutorial debería brindarle una mejor idea de cómo se ensamblan los mapas para el código de máquina (x86 ELF): http://timelessname.com/elfbin/ (especialmente, mire la mitad inferior de la página)
Esta página trata sobre mis intentos de crear el binario EL86 x86 más pequeño que se ejecutaría diciendo Hello World en Ubuntu Linux. Mis primeros intentos comenzaron con C y luego pasaron al ensamblaje x86 y finalmente a un hexeditor.
Es genial analizar ejecutables muy pequeños como estos porque la asignación entre el ensamblado y el código de máquina será más fácil de detectar. Este es también un artículo realmente interesante sobre el tema (sin embargo, no está relacionado exactamente con su pregunta): http://www.phreedom.org/research/tinype/ (x86 PE)
puede hacer un desmontaje e intentar descubrir el código de máquina para los códigos de operación que usa en su ensamblador
por ejemplo
org 0x100
mov dx,msg
mov ah,0x09
int 0x21
ret
msg db ''hello$''
compilado con nasm -fbin ./a.asm -o ./a.com tiene ndisasm a.com entregue el siguiente desmontaje:
00000000 BA0801 mov dx,0x108
00000003 B409 mov ah,0x9
00000005 CD21 int 0x21
00000007 C3 ret
00000008 68656C push word 0x6c65
0000000B 6C insb
0000000C 6F outsw
0000000D 24 db 0x24
00000000 to 00000007 are the instructions
para que pueda jugar con el código de máquina ba0801, usando algún editor hexadecimal, intente cambiarlo a ba0901, y solo se imprimirá ''ello'', puede jugar con su editor hexadecimal y rellenar con NOP, que es 0x90 en la máquina código, por ejemplo:
00000000: ba 50 01 90 90 90 90 90 90 90 90 90 90 90 90 90 .@..............
00000010: b4 09 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................
00000020: cd 21 90 90 90 90 90 90 90 90 90 90 90 90 90 90 .!..............
00000030: c3 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 ................
00000040: 71 77 65 72 74 79 75 69 61 73 64 66 67 68 6a 24 qwertyuiasdfghj$
00000050: 61 73 64 66 67 68 6a 6b 61 73 64 66 67 68 6a 24 asdfghjkasdfghj$
00000060: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ----------------
si guarda esto con la extensión .com, puede ejecutarlo en DosBox