x86 - nivel - programas hechos en lenguaje ensamblador
¿Cómo se hace un ensamblador? (4)
En lo que respecta al código de ejemplo ...
Sin embargo, no conozco ensambladores "simples".
Me gustaría hacer un ensamblador x86 simple. Me pregunto si hay algún tutorial para hacer tu propio ensamblador. O si hay un ensamblador simple que podría estudiar.
Además, me pregunto qué herramientas se utilizan para ver y manejar el binario / hex de programas.
Esto es lo que estás buscando:
Ensambladores y cargadores - Por David Salomon. Publicado en febrero de 1993 - Libremente disponible ( descargar aquí )
Por supuesto, vas a necesitar lo siguiente:
- Intel® 64 e IA-32 Architectures Manuales de desarrollador de software
- Manual de programadores de arquitectura AMD-64
- Enlazadores y cargadores por John R. Levine (disponible gratuitamente)
- Especificaciones de formato de archivo ELF: System V ABI Update
- Especificación de formato de archivo ejecutable y ejecutable portátil de Microsoft
Siempre puede referirse a las implementaciones de Opensource Assemblers:
Solo un pequeño fragmento de código en Delphi 7.
{$APPTYPE CONSOLE}
program assembler;
uses sysutils;
const
s1=#0#77#1#90#59#64#4#80#1#69#3#76#1#1#1#1#14#224#2#15#1#1#1#11#1#1#1#1#1#64#13+
#116#1#16#13#64#3#16#4#2#3#1#8#3#2#10#7#32#4#2#7#3#5#16#4#16#5#1#10#16#13#16#3+
#184#124#184#5#16#3#184#5#2#15#96#3#224#173#52#1#16#3#40#1#16#23#65#1#16#3#80#1+
#16#7#75#1#69#1#82#1#78#1#69#1#76#1#51#1#50#1#46#1#68#1#76#1#76#4#71#1#101#1+
#116#1#83#1#116#1#100#1#72#1#97#1#110#1#100#1#108#1#101#4#87#1#114#1#105#1#116+
#1#101#1#67#1#111#1#110#1#115#1#111#1#108#1#101#1#65#2#72#1#101#1#108#1#108#1+
#111#1#44#1#32#1#87#1#111#1#114#1#108#1#100#1#33#1#13#1#10#5#0;
s3=#1#185#1#7#4#136#1#195#1#128#1#227#1#15#1#193#1#216#1#4#1#128#1#251#1#9+
#1#118#1#3#1#128#1#195#1#39#1#128#1#195#1#48#1#136#1#153#1#96#1#16#1#64#2#73#1+
#125#1#228#1#106#2#104#1#112#1#16#1#64#2#106#1#8#1#104#1#96#1#16#1#64#2#106#1+
#245#1#255#1#21#1#40#1#16#1#64#2#80#1#255#1#21#1#44#1#16#1#64#2#195;
var
f:file of byte;p,i:integer;o:string;
t:text;line:string;
procedure w(s: string);
begin
i:=1;
while i<length(s) do begin
inc(p,ord(s[i]));
setlength(o, p);
o[p]:=s[i+1];
inc(i,2);
end;
end;
procedure al(b: byte);
var
a: longword;pc: pchar;
begin
a := strtoint(line); pc:=@a;
o := o + chr(b) + pc^ + (pc+1)^ + (pc+2)^ + (pc+3)^; inc(p,5); // mov eax, imm32
end;
begin
assign(f,''out.exe'');
rewrite(f);
p:=1;
w(s1);
assignfile(t, ''''); reset(t);
while not eof(t) do begin
readln(t, line); line := trim(line);
if copy(line,1,8) = ''mov eax,'' then begin
system.delete(line,1,8);
al($b8); // mov eax, imm32
end
else if copy(line,1,8) = ''add eax,'' then begin
system.delete(line,1,8);
al($05); // add eax, imm32
end
else if copy(line,1,8) = ''and eax,'' then begin
system.delete(line,1,8);
al($25); // and eax, imm32
end
end;
closefile(t);
w(s3);
blockwrite(f,o[1],p); close(f);
end.
El ensamblador solo entiende tres códigos de ensamblador diferentes "mov eax, immed32", "agregar eax, immed32", "y eax, immed32" y no contiene datos ni etiquetas. Producirá un pequeño ejecutable de Windows PE que emite eax en hexadecimal al final.
Atención: en mi caso, a avira free antivirus no le gusta el resultado. Es un falso positivo. Tuve que desconectar la protección en tiempo real. Verifique el resultado con un depurador si no está seguro si esto es un malware (¡no lo es!)
Yo escribí uno hace mucho tiempo. Es tan simple como obtener la guía de referencia del ensamblador x86 de Intel y escribir los bytes en un archivo .com (para Windows). Desearía poder encontrar mi antigua publicación en el foro que hice en ella. Fue escrito en D ++ . Solo sirve para mostrar que puedes hacerlo en cualquier idioma. Solo tokenize su cadena y tradúzcala.