Кто-нибудь смог создать гибрид PE COFF и ELF?
2292 просмотра
3 ответа
Я имею в виду, может ли один двоичный файл работать в Win32 и Linux i386?
Автор: est Источник Размещён: 13.11.2019 11:29Ответы (3)
21 плюса
Это невозможно, потому что два типа имеют конфликтующие форматы:
- Первые два символа PE-файла должны быть
'M' 'Z'
; - Первые четыре символа файла ELF должны быть
'\x7f' 'E' 'L' 'F'
.
Очевидно, что вы не можете создать один файл, который удовлетворяет обоим форматам.
В ответ на комментарий о двоичном файле polyglot, допустимом и как 16-битный COM-файл, и как ELF-файл Linux, это возможно (хотя на самом деле COM-файл - это программа DOS, а не Windows - и, конечно, не Win32).
Вот один, который я собрал вместе - скомпилируйте его с помощью NASM. Это работает, потому что первые два байта файла ELF ( '\x7f' 'E'
) также являются допустимым машинным кодом 8086 (45-байтная относительная инструкция перехода, если больше, чем). Минимальные заголовки ELF, полученные от Брайана Райтера .
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 $ - $$
Автор: caf
Размещён: 17.01.2010 11:52
2 плюса
Два формата достаточно различны, так что гибрид маловероятен.
Тем не менее, Linux поддерживает загрузку различных исполняемых форматов с помощью «интерпретатора». Таким образом, скомпилированные .exe
файлы, содержащие CIL (скомпилированный C # или другие языки .NET), могут выполняться, например, непосредственно под Linux.
-1 плюса
Вопросы из категории :
- linux Как отправить файл в виде вложения электронной почты с помощью командной строки Linux?
- linux Как разделить два 64-битных числа в ядре Linux?
- linux Изучение файлов Беркли БД из CLI
- linux Как передать пароль на scp?
- winapi Какой самый простой способ для анализа файла INI в C ++?
- winapi Как преобразовать std :: string в LPCWSTR в C ++ (Unicode)
- winapi Как настроить OpenFileDialog для выбора папок?
- winapi Как прочитать значение из реестра Windows
- binary Как посчитать количество установленных бит в 32-битном целом числе?
- binary как читать двоичные файлы NASA .hgt
- binary Конвертировать из BitArray в Byte
- binary Оптимизировать алгоритм двоичного поиска
- elf Кто-нибудь смог создать гибрид PE COFF и ELF?
- elf Инструмент для изменения динамического раздела двоичного файла ELF
- elf Объяснение readelf -S output
- elf C / C ++ с GCC: статически добавлять файлы ресурсов в исполняемый файл / библиотеку
- coff ECOFF & MIPS PECOFF же
- coff Как создать исполняемый файл C # без Exe-Container
- coff Как я могу проверить версию файла LIB?