web-dev-qa-db-fra.com

Comment faites-vous un assembleur?

Je voudrais faire un simple assembleur x86. Je me demande s'il existe des tutoriels pour créer votre propre assembleur. Ou s'il y a un simple assembleur que je pourrais étudier.

De plus, je me demande quels outils sont utilisés pour regarder et gérer le binaire/hex des programmes.

51
mudge
47
claws

Juste un tout petit morceau de code dans 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.

L'assembleur ne comprend que trois codes assembleur différents "mov eax, immed32", "add eax, immed32", "et eax, immed32" et aucune donnée ni étiquette. Il produira un petit exécutable Windows PE qui sortira eax en hexadécimal à la fin.

Attention: Dans mon cas, antivirus gratuit avira n'aime pas la sortie. C'est un faux positif. J'ai dû désactiver la protection en temps réel. Vérifiez le résultat avec un débogueur si vous n'êtes pas sûr qu'il s'agisse d'un malware (ce n'est pas le cas!)

5
NilsB

En ce qui concerne l'exemple de code ...

Cependant, je ne connais aucun assembleur "simple".

2
pioto

J'en ai écrit un il y a longtemps. C'est aussi simple que d'obtenir le guide de référence de l'assembleur x86 d'Intel et d'écrire les octets dans un fichier .com (pour Windows). J'aimerais pouvoir retrouver mon ancien post sur le forum que j'ai fait dessus. Il a été écrit en D ++ . Va juste pour montrer que vous pouvez le faire dans n'importe quelle langue. Il vous suffit de symboliser votre chaîne et de la traduire.

2
Jeremy Boyd