2010-03-19 25 views
45

मैं एक साधारण x86 असेंबलर बनाना चाहता हूं। मैं सोच रहा हूं कि क्या आपका स्वयं का असेंबलर बनाने के लिए कोई ट्यूटोरियल है। या यदि एक साधारण असेंबलर है जिसे मैं पढ़ सकता हूं।आप एक असेंबलर कैसे बनाते हैं?

इसके अलावा, मुझे आश्चर्य है कि बाइनरी/हेक्स कार्यक्रमों को देखने और संभालने में कौन से टूल्स का उपयोग किया जाता है।

+1

मैं सी – mudge

+0

में असेंबलर को विकसित करना पसंद करूंगा http://stackoverflow.com/questions/1669/ में सूचीबद्ध कुछ संदर्भ सीखने के लिए लिखने-ए-कंपाइलर शायद इसे संकलन के चरण के रूप में संबोधित करते हैं (और कुछ शायद नहीं)। [[संबंधित, * नहीं * एक डुप्लिकेट।]] – dmckee

+1

यह भी देखें कि "एक डिस्सेबलर कैसे लिखें?" http: // stackoverflow।कॉम/प्रश्न/9 24303/कैसे-टू-राइट-ए-डिससेबलर – claws

उत्तर

39

यह आप के लिए क्या देख रहे है:

Assemblers And Loaders - By David Salomon. Published February, 1993 - स्वतंत्र उपलब्ध (download here)

बेशक

, आपको निम्न की आवश्यकता करने जा रहे हैं:

  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 फ़ाइल स्वरूप विनिर्देश: System V ABI Update
  5. Microsoft Portable Executable and Common Object File Format Specification

तुम हमेशा ओपनसोर्स असेम्बलर्स के कार्यान्वयन का उल्लेख कर सकते हैं:

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

मैंने बहुत समय पहले लिखा था। यह इंटेल से x86 असेंबलर रेफ गाइड प्राप्त करने और बाइट्स को .com फ़ाइल (विंडोज़ के लिए) लिखने जितना आसान है। काश मैं अपनी पुरानी फोरम पोस्ट को उस पर बना सकता हूं। यह D++ में लिखा गया था। बस यह दिखाने के लिए चला जाता है कि आप इसे किसी भी भाषा में कर सकते हैं। बस अपनी स्ट्रिंग को टोकननाइज़ करें और इसका अनुवाद करें।

+0

आपने हेडर के लिए क्या उपयोग किया? – Phillip

+1

मैं ईमानदारी से याद नहीं करता क्योंकि यह लगभग 15 साल रहा है, लेकिन मुझे नहीं लगता कि आपको एक .com निष्पादन योग्य के लिए होना था। –

+0

मैंने अभी जांच की है और आप सही हैं, .com के पास कोई हेडर नहीं है, केवल कोड और डेटा है। आपने बाइनरी कैसे निष्पादित की? क्या आपने सीधे विंडोज़ पर निष्पादित किया था? – Phillip

4

बस एक बहुत छोटे टुकड़े डेल्फी 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. 

कोडांतरक केवल तीन अलग अलग कोडांतरक कोड "mov eax, immed32" समझता है, "eax जोड़ने के लिए, immed32", "और eax, immed32" और कोई डेटा है और न ही लेबल। यह एक छोटे से विंडोज पीई निष्पादन योग्य उत्पादन करेगा जो अंत में हेक्स में ईएक्स आउटपुट करता है।

ध्यान दें: मेरे मामले में एविरा मुक्त एंटीवायरस आउटपुट पसंद नहीं करता है। यह एक झूठी सकारात्मक है। मुझे वास्तविक समय की सुरक्षा बंद करनी पड़ी। यदि आप मैलवेयर हैं तो यह अनिश्चित है यदि यह मैलवेयर है (यह नहीं है!)

+2

क्यों डेल्फी और सी या सी ++ नहीं? मुझे नहीं लगता कि डेल्फी का उपयोग करके कोई सॉफ्टवेयर निर्माता नहीं है। क्या आप इस कोड सी या सी ++ का अनुवाद कर सकते हैं? –

संबंधित मुद्दे