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.
Voici ce que vous recherchez:
Assembleurs et chargeurs - Par David Salomon. Publié en février 199 - Disponible gratuitement ( télécharger ici )
Bien sûr, vous allez avoir besoin des éléments suivants:
Vous pouvez toujours vous référer aux implémentations des assembleurs opensource:
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!)
En ce qui concerne l'exemple de code ...
Cependant, je ne connais aucun assembleur "simple".
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.