2010-03-19 21 views
45

Mi piacerebbe creare un semplice assemblatore x86. Mi chiedo se ci sono tutorial per creare il tuo assemblatore. O se c'è un semplice assemblatore che potrei studiare.Come si fa un assemblatore?

Inoltre, mi chiedo quali strumenti sono utilizzati per osservare e gestire il binario/hex dei programmi.

+1

Preferirei sviluppare l'assembler in C. – mudge

+0

Alcuni dei riferimenti elencati in http://stackoverflow.com/questions/1669/ learning-to-write-a-compiler probabilmente affronta questo come una fase di compilazione (e alcuni probabilmente non lo fanno). [[Correlato, * non * un duplicato.]] – dmckee

+1

Dai anche un'occhiata @ "Come scrivere un disassemblatore?" http: // StackOverflow.it/questions/924303/how-to-write-a-disassembler – claws

risposta

39
2

Ne ho scritto uno molto tempo fa. È semplice come ottenere la guida di riferimento per assemblatore x86 di Intel e scrivere i byte in un file .com (per Windows). Vorrei poter trovare il mio vecchio post sul forum che ho realizzato. È stato scritto in D++. Basta mostrare che puoi farlo in qualsiasi lingua. Basta tokenizzare la stringa e tradurla.

+0

Cosa hai usato per l'intestazione? – Phillip

+1

Sinceramente non ricordo perché sono passati quasi 15 anni, ma non penso che sia necessario per un eseguibile .com. –

+0

Ho appena controllato e tu sei corretto, .com non ha intestazione, solo codice e dati. Come hai eseguito il binario? Hai eseguito direttamente su Windows? – Phillip

4

Basta un piccolo pezzo di codice in 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:[email protected]; 
    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'assemblatore comprende solo tre diversi codici assembler "mov eax, immed32", "aggiungere eax, immed32", "e EAX, immed32" e non ci sono dati né etichette. Produrrà un piccolo file eseguibile di Windows PE che emette eax in esadecimale alla fine.

Attenzione: nel mio caso l'antivirus gratuito avira non gradisce l'output. È un falso positivo. Ho dovuto disattivare la protezione in tempo reale. Controlla il risultato con un debugger se sei incerto se si tratta di malware (non lo è!)

+2

Perché Delphi e non C o C++? Non penso che non ci sia più un costruttore di software che usi Delphi. Puoi tradurre questo codice C o C++? –