12
votes

Comment convertir le format PE (exécutable portable) en Elf sous Linux

Quel est le meilleur outil pour convertir les binaires PE en binaires elfes?

Voici une brève motivation pour cette question:

  1. suppose que j'ai un programme C simple.
  2. Je l'ai compilé à l'aide de GCC pour Linux (ceci donne elfe) et à l'aide de "I586-MINGW32MSVC-GCC" pour Windows (cela donne un binaire PE).
  3. Je veux analyser ces deux binaires pour des similitudes, utilisant l'outil d'analyse statique de Bitblaze - Vigne ( http: //bitblaze.cs.berkeley.edu/vine.html )
  4. Maintenant, Vigne n'a pas de bon soutien pour les binaires PE, alors je voulais convertir PE-> ELF, puis continuer avec ma comparaison / analyse.

    Étant donné que toute analyse doit fonctionner sur Linux, je préférerais un utilitaire / outil qui fonctionne sous Linux.

    merci


6 commentaires

Bonjour, AMAN! Voulez-vous exécuter des fichiers binaires Windows sur Linux? Conversion de l'exécutable de l'EP en Elf n'est pas une solution!


@Siuchingpong: Je veux comparer les deux, j'ai mis à jour la description afin que les gens puissent lancer avec des réponses.


@Aman: Je vois. Votre question est beaucoup plus claire maintenant. Je ne pense pas que je connaisse suffisamment le sujet pour répondre à votre question, mais je peux vous donner des suggestions de mieux que je peux. J'ai visité le lien que vous avez posté, vous n'avez nulle part quoi que ce soit sur PE ou ELF, alors peut-être que cela fonctionne pour PE aussi. Compilez-le simplement en utilisant Mingw ou Cygwin pour essayer. Savez-vous quelle «section de code» d'un binaire est? Je pense que si vous pouvez l'extraire et le sauvegarder dans un fichier, la vigne peut peut-être analyser ce «binaire binaire». Voici quelques mots clés qui peuvent être utiles: Binutils, Objdump, Objcopy, NM, Lastel, LD, LLD, AR, AS.


S'il vous plaît n'oubliez pas de +1 mes commentaires si vous les trouvez utile :-).


@SIUCHINGPONG: lorsque j'ai exécuté l'analyse de la vigne, un message d'avertissement indique que l'outil n'est pas prêt pour les fichiers binaires PE.


+1 pour "Vine: le composant d'analyse statique de BitBlaze". Je ne savais pas quelque chose comme ça existe.


3 Réponses :


2
votes

Je ne sais pas si cela correspond totalement à vos besoins, mais c'est une option pour vous de croiser avec votre version Mingw de GCC?

Je veux dire faire: Est-ce que cela répond à vos besoins pour que I586-MINGW32MSVC-GCC compilent directement vers des fichiers binaires au format Elf (au lieu des PS que vous obtenez actuellement). Une description de la façon de faire des choses dans l'autre sens peut être trouvée ici - i Imaginez que ce sera un petit hacky mais tout à fait possible de faire ce travail pour vous dans l'autre sens (je dois admettre que je ne l'ai pas essayé).


0 commentaires

13
votes

Il est possible de reconstruire un exe en tant que binaire elfe, mais le binaire résultant segfault très peu après le chargement, en raison du système d'exploitation manquant.

Voici une méthode de le faire. P>

Résumé H2>
  1. Dump Les en-têtes de section du fichier EXE. LI>
  2. extraire les données de la section brutes de l'EXE. LI>
  3. encapsule les données de la section brutes dans les extraits de script de liaison GNU. Li>
  4. Écrivez un script de liaison pour créer un binaire Elf, y compris ces scripts de l'étape précédente. Li>
  5. Exécuter ld code> avec le script de liaison pour produire le fichier ELF. LI>
  6. Exécutez le nouveau programme et regardez-le Segfault car il ne fonctionne pas sous Windows (et il essaie d'appeler des fonctions dans le tableau d'adresses d'importation, qui n'existe pas). LI> OL>

    Exemple détaillé H2>
    1. vider les en-têtes de section du fichier EXE. J'utilise objdump code> à partir du paquet de compilateur de mingw code> pour le faire. P> XXX PRE> LI>

    2. Utilisez dd code> (ou un éditeur Hex) pour extraire les données de la section brutes de l'EXE. Ici, je vais juste copier le code et les sections de données (nommé Auto et Dgroup dans cet exemple). Vous voudrez peut-être copier des sections supplémentaires. P>

      0051D8DB ; size_t stackavail(void)
      0051D8DB proc    stackavail near
      0051D8DB         push    edx
      0051D8DC         call    [ds:off_5A0588]
      0051D8E2         mov     edx, eax
      0051D8E4         mov     eax, esp
      0051D8E6         sub     eax, [edx]
      0051D8E8         pop     edx
      0051D8E9         retn
      0051D8E9 endp    stackavail
      


0 commentaires

5
votes

J'ai trouvé un moyen plus simple de le faire. Utilisez la commande Strip.

Exemple P>

strip --info


0 commentaires