2010-03-19 41 views
45

Tôi muốn tạo một bộ x86 đơn giản. Tôi tự hỏi nếu có bất kỳ hướng dẫn để làm cho lắp ráp của riêng bạn. Hoặc nếu có một người lắp ráp đơn giản mà tôi có thể học.Làm thế nào để bạn thực hiện một Assembler?

Ngoài ra, tôi tự hỏi công cụ nào được sử dụng để xem và xử lý nhị phân/hex của chương trình.

+1

Tôi muốn phát triển trình kết hợp trong C. – mudge

+0

Một số tài liệu được liệt kê trong http://stackoverflow.com/questions/1669/ học tập-để-viết-một-trình biên dịch có thể địa chỉ này như là một giai đoạn biên dịch (và một số có lẽ không). [[Liên quan, * không * một bản sao.]] – dmckee

+1

Ngoài ra hãy xem @ "Làm thế nào để viết một disassembler?" http: // stackoverflow.com/questions/924303/how-to-write-a-disassembler – claws

Trả lời

39

Đây là những gì bạn đang tìm kiếm:

Assemblers And Loaders - By David Salomon. Published February, 1993 - Tự do có sẵn (download here)

Tất nhiên, bạn sẽ cần những điều sau đây:

  1. Intel® 64 and IA-32 Architectures Software Developer's Manuals
  2. AMD-64 Architecture Programmers manual
  3. Linkers and Loaders by John R. Levine (freely available)
  4. ELF Thông số kỹ thuật File Format: System V ABI Update
  5. Microsoft Portable Executable and Common Object File Format Specification

Bạn luôn có thể tham khảo để triển khai của Nguồn mở lắp ráp:

  1. Netwide Assembler (NASM)
  2. Gnu Assembler (GAS)
2

Tôi đã viết một từ rất lâu rồi. Nó đơn giản như nhận được hướng dẫn ref của trình biên dịch x86 từ Intel, và ghi các byte vào một tệp .com (cho các cửa sổ). Tôi ước tôi có thể tìm thấy bài đăng trên diễn đàn cũ của tôi mà tôi đã tạo trên đó. Nó được viết trong D++. Chỉ cần đi để cho thấy bạn có thể làm điều đó bằng bất kỳ ngôn ngữ nào. Chỉ cần mã hóa chuỗi của bạn và dịch nó.

+0

Bạn đã sử dụng gì cho tiêu đề? – Phillip

+1

Tôi thành thật không nhớ vì đã gần 15 năm rồi, nhưng tôi không nghĩ bạn phải thực thi .com. –

+0

Tôi vừa kiểm tra và chính xác, .com không có tiêu đề, chỉ mã và dữ liệu. Làm thế nào bạn thực hiện nhị phân? Bạn đã thực thi trực tiếp trên Windows? – Phillip

4

Chỉ cần một mảnh rất nhỏ mã trong 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. 

Các lắp ráp hiểu chỉ có ba mã lắp ráp khác nhau "mov eax, immed32", "add eax, immed32", "và eax, immed32" và không có dữ liệu cũng không nhãn. Nó sẽ tạo ra một tệp thực thi Windows PE nhỏ xíu có thể xuất ra eax trong hex ở cuối.

Chú ý: Trong trường hợp của tôi, vi-rút miễn phí avira không thích đầu ra. Đó là một dương tính giả. Tôi phải tắt bảo vệ thời gian thực. Kiểm tra kết quả bằng trình gỡ rối nếu bạn không chắc chắn đây có phải là phần mềm độc hại hay không (Không phải!)

+2

Tại sao Delphi và không phải C hoặc C++? Tôi không nghĩ rằng không có nhà xây dựng phần mềm sử dụng Delphi nữa. Bạn có thể dịch mã này C hay C++ không? –

Các vấn đề liên quan