Question

Je veux dire pourrait un seul passage de fichier binaire dans les deux i386 Win32 et Linux?

Était-ce utile?

La solution

Ceci est impossible, parce que les deux types ont des formats contradictoires:

  • Les deux premiers caractères d'un fichier PE doit être 'M' 'Z';
  • Les quatre premiers caractères d'un fichier ELF doit être '\x7f' 'E' 'L' 'F'.

Il est clair que vous ne pouvez pas créer un fichier qui satisifies les deux formats.


En réponse au commentaire sur un binaire Polyglotte valide à la fois comme un fichier COM 16 bits et un fichier ELF Linux, qui est possible (bien que réellement un fichier COM est un programme DOS, pas Windows - et certainement pas Win32).

Voici que j'entrechoquer - le compiler avec MSNA. Cela fonctionne parce que les deux premiers octets d'un fichier ELF (de '\x7f' 'E') se trouvent également le code machine 8086 valide (45 octets par rapport Saut si supérieur à l'instruction). têtes minimum ELF cribbed de Brian Raiter .

BITS 32
ORG 0x08048000

  ehdr:                                                 ; Elf32_Ehdr
                db      0x7F, "ELF", 1, 1, 1, 0         ;   e_ident
        times 8 db      0
                dw      2                               ;   e_type
                dw      3                               ;   e_machine
                dd      1                               ;   e_version
                dd      _start                          ;   e_entry
                dd      phdr - $$                       ;   e_phoff
                dd      0                               ;   e_shoff
                dd      0                               ;   e_flags
                dw      ehdrsize                        ;   e_ehsize
                dw      phdrsize                        ;   e_phentsize
                dw      1                               ;   e_phnum
                dw      0                               ;   e_shentsize
                dw      0                               ;   e_shnum
                dw      0                               ;   e_shstrndx
  ehdrsize      equ     $ - ehdr

times 0x47-($-$$) db    0

; DOS COM File code
BITS 16
    mov dx, msg1 - $$ + 0x100
    mov ah, 0x09
    int 0x21
    mov ah, 0x00
    int 0x21
  msg1:         db      `Hello World (DOS).\r\n$`

BITS 32
  phdr:                                                 ; Elf32_Phdr
                dd      1                               ;   p_type
                dd      0                               ;   p_offset
                dd      $$                              ;   p_vaddr
                dd      $$                              ;   p_paddr
                dd      filesize                        ;   p_filesz
                dd      filesize                        ;   p_memsz
                dd      5                               ;   p_flags
                dd      0x1000                          ;   p_align
  phdrsize      equ     $ - phdr

; Linux ELF code
  _start:
    mov eax, 4      ; SYS_write
    mov ebx, 1      ; stdout
    mov ecx, msg2
    mov edx, msg2_len
    int 0x80
    mov eax, 1      ; SYS_exit
    mov ebx, 0
    int 0x80
  msg2:         db      `Hello World (Linux).\n`
  msg2_len      equ     $ - msg2

  filesize      equ     $ - $$

Autres conseils

Les deux formats sont suffisamment différents qu'un hybride est peu probable.

Cependant, Linux prend en charge le chargement des différents formats exécutables par « interprète ». De cette façon, compilé les fichiers contenant .exe CIL (compilé C # ou d'autres langages .NET) peut être exécuté directement sous Linux, par exemple.

Bien sûr. Utilisez Java.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top