Quelqu'un at-il été en mesure de créer un hybride de PE COFF et ELF?
Question
Je veux dire pourrait un seul passage de fichier binaire dans les deux i386 Win32 et Linux?
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.