11
votes

Quelqu'un a-t-il été capable de créer un hybride de PE Coff et Elf?

Je veux dire qu'un seul fichier binaire peut-il exécuter à la fois Win32 et Linux I386?


0 commentaires

3 Réponses :


-1
votes

Bien sûr. Utilisez Java.


1 commentaires

Désolé pour la réponse Curt, mais c'était intelligemment conçu pour être exactement 15 caractères. La vraie réponse est le format Elf vs Coff est presque le moindre de vos soucis. Vous avez également des appels système complètement différents, des bibliothèques / DLL partagées, etc.



2
votes

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

Cependant, Linux prend en charge le chargement de différents formats exécutables par "interprète". De cette manière compilée .exe contenant CIL (compilé C # ou d'autres langues .NET) peut être exécutée directement sous Linux, par exemple.


2 commentaires

Comment ça se passe-t-il exactement? Vous savez que nous pouvons exécuter un .txt sous Windows.


@ deest bien oui, c'est un peu similaire, sauf "exécuter" un fichier texte que vous devez spécifier "Interprète" sur la ligne de commande: "Ouvrir foo.txt" pour utiliser Explorer (qui va probablement apparaître textué) par exemple. On parle de ce dont je parle consiste à reconnaître le type d'exécutable et à charger le format approprié directement à l'aide d'un système appelé binfmt_misc: "binfmt_misc fournit la possibilité d'enregistrer des formats binaires supplémentaires au noyau [...]". ( Tat.physik.uni-tuebingen.de/~rguer /Linux/binfmt_misc.html ) C'est juste une fonctionnalité de commodité, pas la magie.



24
votes

Ce n'est pas possible, car les deux types ont des formats conflictuels:

  • Les deux caractères initiaux d'un fichier PE doivent être 'm' 'z' code>; li>
  • Les quatre caractères initiaux d'un fichier elfe doivent être '\ x7f' 'E' '' L '' F ' CODE>. LI> ul>

    Clairement, vous ne pouvez pas créer un fichier qui satisfasse les deux formats. p>


    en réponse au commentaire d'un binaire polyglot valide comme un fichier COM de 16 bits et un fichier Linux ELF Fichier, c'est possible (bien que vraiment un fichier COM est un programme DOS, non Windows - et certainement pas win32). P>

    Voici un coupé ensemble - Compilez-le avec NASM. Cela fonctionne car les deux premiers octets d'un fichier elfe ( '\ x7f' '' ) sont également valables du code de machine 8086 (un saut relatif de 45 octets-si-la plus grande que l'instruction). Les en-têtes elfes minimaux ont cassé Brian Raiter . P>

    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     $ - $$
    


3 commentaires

Cool, mais que diriez-vous de 16 bits .com pour Windows et faites-la en quelque sorte compatible elf?


Alors, le programme COM peut-on lancer une Windows .exe? Ce serait génial.


Peut-être que le programme COM pourrait rédiger un binaire Win32 à part entière dans le répertoire temporaire des utilisateurs, puis lancer cela? (Ou même en quelque sorte le faire en mémoire). BTW, pour ceux qui se demandent: Non, les programmes 16 bits ne seront pas exécutés dans Win7 +.