Question

Quelles sont les exigences d’un fichier PE (PE/COFF) ?Quels champs doivent être définis, quelle valeur, au strict minimum pour lui permettre de "s'exécuter" sous Windows (c'est-à-direexécution de l'instruction "ret" puis fermeture, sans erreur).

La bibliothèque que je construis en premier est l'éditeur de liens :Maintenant, le problème que j'ai est le fichier PE (PE/COFF). Je ne sais pas ce qui est "requis" pour un fichier PE avant qu'il puisse réellement s'exécuter sur ma plateforme. Ma plateforme de test est Vista.Je reçois un message d'erreur disant "Ce n'est pas un exécutable Win32 valide." lorsque je l'exécute en double-cliquant, et j'obtiens un " Accès refusé " lors de son exécution avec CLI cmd.J'ai deux sections, .text et .data.

J'ai implémenté les en-têtes PE fournis par plusieurs documents en ligne, c'est-à-direMSDN et d'autres documentations tierces.Si j'utilise un éditeur hexadécimal, cela ressemble presque à un fichier PE ordinaire.Je n'utilise aucune importation, ni IAT, ni aucun répertoire dans l'en-tête PE.

Modifier: J'ai ajouté une table d'importation, ce n'est toujours pas un fichier .exe valide, dit mon Windows.J'ai essayé d'utiliser des valeurs qui sont également mentionnées dans le plus petit guide des fichiers PE.Pas de chance.Vraiment, la seule chose que je n'arrive pas à comprendre, c'est ce qui est requis et ce qui ne l'est pas.Certains guides me disent que tout est obligatoire, tandis que d'autres disent à propos des déprivations :et cela peut être nul.

J'espère que ces informations sont suffisantes. Merci d'avance.


Données brutes (sur demande) de l'en-tête PE actuel :

4D 5A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 50 45 00 00 4C 01 02 00 C8 7A 55 4B 00 00 00 00 00 00 00 00 E0 00 82 01 0B 01 0D 25 00 10 00 00 00 10 00 00 00 00 00 00 00 10 00 00 00 10 00 00 00 20 00 00 00 00 40 00 00 10 00 00 00 02 00 00 01 00 0B 00 00 00 00 00 03 00 0A 00 00 00 00 00 00 22 00 00 38 01 00 00 00 00 00 00 03 00 00 00 00 40 00 00 00 40 00 00 00 40 00 00 00 40 00 00 00 00 00 00 0E 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 24 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2E 74 65 78 74 00 00 00 00 00 00 00 00 10 00 00 00 02 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 60 2E 69 64 61 74 61 00 00 00 00 00 00 00 20 00 00 00 02 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3C 20 00 00 00 00 00 00 00 00 00 00 24 20 00 00 34 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4B 45 52 4E 45 4C 33 32 2E 64 6C 6C 00 00 00 00 01 00 00 80 00 00 00 00 01 00 00 80 00 00 00 00
Était-ce utile?

La solution

Vous pouvez essayer un livre comme .NET 2.0 IL Assembleur. Ce livre a un chapitre entier consacré à ce qu'un exécutable format PE ressemble (et quel .Net PE ressemble).

Vous pouvez également essayer de charger vos fichiers PE avec un lecteur de fichiers PE et examiner les résultats. Si le lecteur PE se débat avec votre PE, alors vous avez un pointeur sur ce qui est défaillant.

Voici une PE lecture de fichiers DLL j'ai écrit (avec source) . Il y a aussi une interface graphique (avec source) qui l'utilise.

La source est complètement open source (non grevés par la GPL) de sorte que vous pouvez faire ce que vous voulez (sauf imposer une GPL sur elle, ce qui l'empêcherait d'être complètement ouvert), y compris prendre votre version fermée.

Autres conseils

Ceci est une douleur complète pour copier coller dans un éditeur hexadécimal, donc, malheureusement, je ne peux pas dire quoi que ce soit juste trop intelligent de la chauve-souris.

A noter dans un fichier PE: Assurez-vous que votre tête DOS est valide. Assurez-vous que le IMAGE_OPTIONAL_HEADER est correctement formaté, parce que, malgré son nom, Windows ne fonctionne pas vraiment comme ça pour ne pas être fait correctement.

Pour plus d'informations, au-dessus et au-delà du format MS, recherche pe.txt , l'un des meilleurs guides homebrew au format PE Je sais.

Si vous pouviez juste après les octets, je pourrais essayer de le mettre dans mes propres PE et parseurs voir si je peux aider plus.

sur la création des exécutables PE minuscules pourraient intéresser: en particulier , il mentionne que les besoins chargeur Win2k KERNEL32.DLL à importer, de sorte que pourrait être utile d'examiner.

Ce que vous essayez de faire dépend de la version de Windows que vous utilisez.Par exemple, la façon dont les fichiers PE ont été lus sous Windows 2000 n'est pas la même que celle utilisée par Windows 7.Je suis un utilisateur OSX, mais sous Windows 7, je ne peux pas manipuler les fichiers PE d'une manière qui fonctionnerait sous Windows 2000 et versions antérieures.Je n'ai pas testé XP ou Vista (ou autres entre 2000 et Win7) pour voir quand Windows a commencé à lire PE différemment.Sous Windows 7, chaque bit de mémoire dans l’en-tête et le stub MS-DOS est ignoré.Les 2 seules pièces qui comptent sont le "nombre magique" (un MOT égal à "MZ") et le PE Offset, qui est un DWORD qui définit l'espace en mémoire pour le début de l'en-tête PE.Je ne sais pas si Windows ignore vraiment toutes les autres valeurs de l'en-tête et du stub MS-DOS 100 % du temps, mais en excluant les deux que je viens de mentionner, si toutes les autres valeurs sont définies sur 0, un programme exécutable valide fonctionnera correctement. .

Sous Windows 2000 et versions antérieures, je ne sais pas si ce que j'ai mentionné ci-dessus était vrai, mais vous étiez à cette époque autorisé à modifier la longueur du stub MS-DOS (ou à le supprimer peut-être), à ​​condition que la valeur PE Offset soit pointant toujours vers le bon endroit en mémoire pour trouver l’en-tête PE.Sous Windows 7, si vous modifiez la longueur du stub MS-DOS, même lorsque PE Offset pointe vers l'emplacement correct et modifié, Windows n'exécutera pas l'exe et prétendra qu'il ne s'agit pas d'une application Win32 valide.

4D 5A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

C'est le moins que la partie MS-DOS d'un fichier PE puisse avoir sous Windows 7 tout en ayant un exécutable valide et fonctionnel.Ce morceau ne peut pas être raccourci.

J'espère que cela clarifie certaines choses.

La spécification Microsoft PE / COFF est la seule spécification que je connaisse.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top