有没有人能够创建 PE COFF 和 ELF 的混合体? [英] Has anyone been able to create a hybrid of PE COFF and ELF?
问题描述
我的意思是一个二进制文件可以在 Win32 和 Linux i386 中运行吗?
这是不可能的,因为两种类型的格式有冲突:
- PE 文件的前两个字符必须是
'M' 'Z'
; - ELF 文件的前四个字符必须是
'x7f' 'E' 'L' 'F'
.
显然,您无法创建同时满足两种格式的文件.
<小时>为了回应有关多语言二进制文件既可用作 16 位 COM 文件又可用作 Linux ELF 文件的评论,这是可能的(尽管 COM 文件实际上是一个 DOS 程序,而不是 Windows - 当然也不是 Win32).>
这是我拼凑出来的 - 用 NASM 编译它.它起作用是因为 ELF 文件的前两个字节 ('x7f' 'E'
) 恰好也是有效的 8086 机器代码(45 字节的相对跳转-if-greater-than 指令).来自 Brian Raiter 的最小 ELF 标头.
BITS 32组织机构 0x08048000艾德:;Elf32_Ehdrdb 0x7F, "ELF", 1, 1, 1, 0 ;电子身份倍 8 分贝 0dw 2 ;e_typedw 3 ;电子机器dd 1 ;电子版本dd _start ;电子条目dd 博士 - $$ ;e_phoffdd 0 ;e_shoffdd 0 ;e_flagsdw ehdrsize ;e_ehsizedw phdrsize ;e_phentsizedw 1 ;e_phnumdw 0 ;e_shentsizedw 0 ;e_shnumdw 0 ;e_shstrndxehdrsize equ $ - ehdr时间 0x47-($-$$) db 0;DOS COM 文件代码位 16mov dx, msg1 - $$ + 0x100移动啊,0x09整数 0x21移动啊,0x00整数 0x21msg1: db `Hello World (DOS).
$`位 32博士:;Elf32_博士dd 1 ;p_typedd 0 ;p_offsetdd $$ ;p_vaddrdd $$ ;p_paddrdd 文件大小;p_fileszdd 文件大小;p_memszdd 5 ;p_flagsdd 0x1000 ;p_alignphdrsize equ $ - phdr;Linux 精灵代码_开始:移动 eax, 4 ;SYS_write移动 ebx, 1 ;标准输出mov ecx, msg2mov edx, msg2_len整数 0x80移动 eax, 1 ;SYS_exit移动 ebx, 0整数 0x80msg2: db `Hello World (Linux).
`msg2_len equ $ - msg2文件大小等于 $ - $$
I mean could a single binary file run in both Win32 and Linux i386 ?
This is not possible, because the two types have conflicting formats:
- The initial two characters of a PE file must be
'M' 'Z'
; - The initial four characters of an ELF file must be
'x7f' 'E' 'L' 'F'
.
Clearly, you can't create one file that satisifies both formats.
In response to the comment about a polyglot binary valid as both a 16 bit COM file and a Linux ELF file, that's possible (although really a COM file is a DOS program, not Windows - and certainly not Win32).
Here's one I knocked together - compile it with NASM. It works because the first two bytes of an ELF file ('x7f' 'E'
) happen to also be valid 8086 machine code (a 45 byte relative jump-if-greater-than instruction). Minimal ELF headers cribbed from 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).
$`
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).
`
msg2_len equ $ - msg2
filesize equ $ - $$
这篇关于有没有人能够创建 PE COFF 和 ELF 的混合体?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!