64 votes

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.

58voto

claws Points 8398

6voto

NilsB Points 205

Juste un très petit morceau de code 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.

L'assembleur comprend trois différents codes assembleur "mov eax,immed32", "add eax,immed32", "et eax,immed32" et pas de données ni d'étiquettes. Il va produire une petite de Windows PE exécutable qui sorties eax dans l'hex à la fin.

Attention: Dans mon cas, avira free antivirus n'aime pas la sortie. C'est un faux positif. J'ai dû désactiver la protection en temps réel. Vérifier le résultat avec un débogueur si vous êtes incertain si c'est des logiciels malveillants (Il n'est pas!)

4voto

Dean Lawrence Points 41

Vous pouvez suivre ce tutoriel. J'ai créé le mien en utilisant ce tutoriel, essayez-le.

http://www.icemanind.com/VMCS.pdf

3voto

Jeremy Boyd Points 1257

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.

2voto

pioto Points 471

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

Cependant, je ne connais aucun assembleur "simple".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X