2009-02-16 11 views
18

एक कंपाइलर लिखने के लिए एक अग्रदूत के रूप में मैं विंडोज (32-बिट) पोर्टेबल निष्पादन योग्य प्रारूप को समझने की कोशिश कर रहा हूं। विशेष रूप से मैं एक नंगे हड्डियों को निष्पादन योग्य उदाहरण का उदाहरण देखना चाहता हूं जो लोड को सही ढंग से छोड़कर, रन और बाहर निकलने के अलावा कुछ भी नहीं करता है।सबसे छोटा संभव विंडोज (पीई) निष्पादन योग्य क्या है?

मैं लेखन की कोशिश की है और एक साधारण सी मुख्य कार्य जो लेकिन इसके परिणाम स्वरूप .exe कुछ नहीं करता है संकलन ~ 22kb है और Kernel32.dll से कई आयात (संभवतः libc द्वारा इस्तेमाल किया, ढेर आदि वातावरण स्थापित करने के लिए) शामिल हैं। यहां तक ​​कि डॉस हेडर शायद छोटा हो सकता है (यह वर्तमान में डिफ़ॉल्ट प्रिंट करता है 'यह प्रोग्राम डॉस मोड में नहीं चलाया जा सकता है')।

छोटी संभव विंडोज 32-बिट निष्पादन की संरचना क्या है?

+0

पहले शीर्ष वोट वाला उत्तर यहां केवल मृत और दुर्भावनापूर्ण लिंक से लिंक था। सामग्री यहां संग्रहित है [छोटे पीई] (http://archive.is/w01DO#selection-265.0-269.6) –

+0

@ जे ... मुझे आशा है कि आपको कोई फर्क नहीं पड़ता कि मैंने उस लिंक किए गए आलेख को उत्तर के रूप में उद्धृत किया है, इसके खतरे से बचें और एक और मृत लिंक बनने से बचें। (आपकी टिप्पणी के अनुसार)। –

+0

@AgiHammerthief - यदि आप चाहते हैं, तो मेरा अतिथि बनें। पूरी चीज को ठीक से चिह्नित करने के लिए यह एक बड़ी नौकरी है। यह भी सुनिश्चित करना सुनिश्चित करें: https://meta.stackoverflow.com/a/321326/327083 –

उत्तर

2

स्रोत से उद्धृत (Creating the smallest possible PE executable):

  • सबसे छोटा संभव पीई फ़ाइल: 97 बाइट्स
  • Windows 2000 पर सबसे छोटा संभव पीई फ़ाइल: 133 बाइट्स
  • सबसे छोटा पीई फ़ाइल है कि इस पर एक फ़ाइल डाउनलोड करता है WebDAV और इसे निष्पादित करता है: 133 बाइट

पीई फ़ाइल प्रारूप की आवश्यकताओं के कारण उपरोक्त फाइलें सबसे छोटी पीई फाइलें हैं और आगे में सुधार नहीं किया जा सकता है।

यह परिणाम इस तरह के कदम है कि सी stdlib के लिए लिंक को दूर करने और शीर्ष लेख फ़ील्ड और डेटा निर्देशिका की एक संख्या को हटाने के रूप में कुछ चालाक एनएएसएम चाल, के साथ प्राप्त किया गया था।

; tiny.asm, copyright Alexander Sotirov 

BITS 32 
; 
; MZ header 
; The only two fields that matter are e_magic and e_lfanew 

mzhdr: 
    dw "MZ"  ; e_magic 
    dw 0   ; e_cblp UNUSED 

; PE signature 
pesig: 
    dd "PE"  ; e_cp, e_crlc UNUSED  ; PE signature 

; PE header 
pehdr: 
    dw 0x014C  ; e_cparhdr UNUSED   ; Machine (Intel 386) 
    dw 1   ; e_minalloc UNUSED   ; NumberOfSections 

; dd 0xC3582A6A ; e_maxalloc, e_ss UNUSED ; TimeDateStamp UNUSED 

; Entry point 
start: 
    push byte 42 
    pop eax 
    ret 

codesize equ $ - start 

    dd 0   ; e_sp, e_csum UNUSED  ; PointerToSymbolTable UNUSED 
    dd 0   ; e_ip, e_cs UNUSED   ; NumberOfSymbols UNUSED 
    dw sections-opthdr ; e_lsarlc UNUSED  ; SizeOfOptionalHeader 
    dw 0x103  ; e_ovno UNUSED    ; Characteristics 

; PE optional header 
; The debug directory size at offset 0x94 from here must be 0 

filealign equ 4 
sectalign equ 4 ; must be 4 because of e_lfanew 

%define round(n, r) (((n+(r-1))/r)*r) 

opthdr: 
    dw 0x10B  ; e_res UNUSED    ; Magic (PE32) 
    db 8          ; MajorLinkerVersion UNUSED 
    db 0          ; MinorLinkerVersion UNUSED 

; PE code section 
sections: 
    dd round(codesize, filealign) ; SizeOfCode UNUSED ; Name UNUSED 
    dd 0 ; e_oemid, e_oeminfo UNUSED ; SizeOfInitializedData UNUSED 
    dd codesize ; e_res2 UNUSED ; SizeOfUninitializedData UNUSED ; VirtualSize 
    dd start ; AddressOfEntryPoint ; VirtualAddress 
    dd codesize ; BaseOfCode UNUSED ; SizeOfRawData 
    dd start ; BaseOfData UNUSED ; PointerToRawData 
    dd 0x400000 ; ImageBase ; PointerToRelocations UNUSED 
    dd sectalign ; e_lfanew ; SectionAlignment ; PointerToLinenumbers UNUSED 
    dd filealign ; FileAlignment ; NumberOfRelocations, NumberOfLinenumbers UNUSED 
    dw 4 ; MajorOperatingSystemVersion UNUSED ; Characteristics UNUSED 
    dw 0 ; MinorOperatingSystemVersion UNUSED 
    dw 0 ; MajorImageVersion UNUSED 
    dw 0 ; MinorImageVersion UNUSED 
    dw 4 ; MajorSubsystemVersion 
    dw 0 ; MinorSubsystemVersion UNUSED 
    dd 0 ; Win32VersionValue UNUSED 
    dd round(hdrsize, sectalign)+round(codesize,sectalign) ; SizeOfImage 
    dd round(hdrsize, filealign) ; SizeOfHeaders 
    dd 0 ; CheckSum UNUSED 
    db 2 ; Subsystem (Win32 GUI) 

hdrsize equ $ - $$ 
filesize equ $ - $$ 

जीएनयू/लिनक्स ELF निष्पादनयोग्य के लिए, लेख "Whirlwind Tutorial on Creating Really Teensy ELF Executables for Linux" देखें:

पूर्ण स्रोत कोड (के रूप में यह रिक्त लाइनों को हटाने को छोड़कर लेख में प्रकट होता है, संशोधन के बिना) इस प्रकार है। टी एल; डॉ: 1340 बाइट्स, एनएएसएम

का उपयोग कर नोट: इस सवाल का जवाब 17:31 पर जम्मू का एक विस्तार ... दिसंबर 3 '16 पर की टिप्पणी, आदेश की जानकारी में पाया संरक्षित करने के लिए में है लिंक (यदि वह भी मर जाता है)।


  1. Tiny PE; अलेक्जेंडर Sotirov; 15/11/2017 @ 17:50 SAST
संबंधित मुद्दे