Question

Je l'ai déjà posé une question similaire, « PE exigences en-tête » , mais je ne suis pas vraiment satisfait de la réponse.

Je construis un assembleur / éditeur de liens, en Java SE 1.6. J'ai lu environ 5 différentes documentations / spécifications sur l'en-tête PE / COFF et le format de fichier, mais je suis bloqué à un problème:

Mon fichier généré est pas valide, dit Windows: « X n'est pas une application Win32 valide ». Je suis paumé de ce qui peut se tromper; Je revérifié chaque entrée dans la tête PE et PE en option en-tête, et tout semble être juste.
J'ai trois sections:

  • code (RVA 0x1000, 0x400 Fichier)
  • data (RVA 0x2000, 0x600 Fichier)
  • import (RVA 0x3000, 0x800 Fichier)

Ma valeur est à entrypoint 0x1000 (début de code) et mon Imagebase 0x400000. alignement de la section est 0x1000 et l'alignement de fichiers est 0x200.

Voir les révisions de cette question pour voir le fichier entier.

: J'ai attrapé un fichier PE valide (un simple "Bonjour tout le monde" application de boîte de message), et a commencé à le modifier, avec un éditeur hexadécimal (HxD). Je suis beaucoup de différents messages d'erreur, pas "X n'est pas une application Win32 valide".

Je suis conscient du fait que le contenu de mon code est pas de code « valide », mais je l'ai testé sur:. Code invalide donne une erreur crash application

Si le contenu import-section est invalide dans le fichier PE « Bonjour tout le monde », il me donne l'erreur « point de procédure ne peut être trouvée dans [...] », ou « application n'a pas pu démarrer car [.. ] dll ne se trouve pas. ", ou un accident d'application. Ces erreurs sont très utiles; ils me donnent une certaine idée de ce qui était erroné.

Mais mon fichier PE, avec l'erreur "X n'est pas une application Win32 valide.", Me rend fou: Quel est le problème avec mon fichier PE

Dumpbin sortie:

E:\Documenten\CP Language\compiler\Win32Builder>dumpbin /ALL test.exe
Microsoft (R) COFF/PE Dumper Version 10.00.21003.01
Copyright (C) Microsoft Corporation.  All rights reserved.
Dump of file test.exe
PE signature found
File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
         14C machine (x86)
           3 number of sections
    32EB4BF5 time date stamp Sun Jan 26 13:20:05 1997
           0 file pointer to symbol table
           0 number of symbols
          E0 size of optional header
         703 characteristics
               Relocations stripped
               Executable
               32 bit word machine
               Debug information stripped
               CD - run from swapfile

OPTIONAL HEADER VALUES
         10B magic # (PE32)
        8.00 linker version
        1000 size of code
        1000 size of initialized data
           0 size of uninitialized data
        1000 entry point (00401000)
        1000 base of code
        2000 base of data
      400000 image base (00400000 to 0040088F)
        1000 section alignment
         200 file alignment
        4.00 operating system version
       13.37 image version
        4.00 subsystem version
           0 Win32 version
         890 size of image
         400 size of headers
           0 checksum
           2 subsystem (Windows GUI)
           0 DLL characteristics
       40000 size of stack reserve
       11000 size of stack commit
      100000 size of heap reserve
        1000 size of heap commit
           0 loader flags
          10 number of directories
           0 [       0] RVA [size] of Export Directory
        3000 [    1000] RVA [size] of Import Directory
           0 [       0] RVA [size] of Resource Directory
           0 [       0] RVA [size] of Exception Directory
           0 [       0] RVA [size] of Certificates Directory
           0 [       0] RVA [size] of Base Relocation Directory
           0 [       0] RVA [size] of Debug Directory
           0 [       0] RVA [size] of Architecture Directory
           0 [       0] RVA [size] of Global Pointer Directory
           0 [       0] RVA [size] of Thread Storage Directory
           0 [       0] RVA [size] of Load Configuration Directory
           0 [       0] RVA [size] of Bound Import Directory
           0 [       0] RVA [size] of Import Address Table Directory
           0 [       0] RVA [size] of Delay Import Directory
           0 [       0] RVA [size] of COM Descriptor Directory
           0 [       0] RVA [size] of Reserved Directory

SECTION HEADER #1
   .code name
    1000 virtual size
    1000 virtual address (00401000 to 00401FFF)
      23 size of raw data
     400 file pointer to raw data (00000400 to 00000422)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
60000020 flags
         Code
         Execute Read    
RAW DATA #1
  00401000: 68 00 00 00 00 68 0D 20 40 00 68 00 20 40 00 68  h....h. @.h. @.h
  00401010: 00 00 00 00 E8 64 30 40 00 68 00 00 00 00 E8 6C  ....èd0@.h....èl
  00401020: 30 40 00                                         0@.

SECTION HEADER #2
   .data name
    1000 virtual size
    2000 virtual address (00402000 to 00402FFF)
      23 size of raw data
     600 file pointer to raw data (00000600 to 00000622)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
C0000040 flags
         Initialized Data
         Read Write
RAW DATA #2
  00402000: 48 65 6C 6C 6F 20 57 6F 72 6C 64 21 00 48 65 6C  Hello World!.Hel
  00402010: 6C 6F 20 53 74 61 63 6B 20 4F 76 65 72 66 6C 6F  lo Stack Overflo
  00402020: 77 21 00                                         w!.

SECTION HEADER #3
 .import name
    1000 virtual size
    3000 virtual address (00403000 to 00403FFF)
      90 size of raw data
     800 file pointer to raw data (00000800 to 0000088F)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
50000040 flags
         Initialized Data
         Shared
         Read Only
RAW DATA #3
  00403000: 54 30 00 00 00 00 00 00 00 00 00 00 3C 30 00 00  T0..........<0..
  00403010: 64 30 00 00 5C 30 00 00 00 00 00 00 00 00 00 00  d0..\0..........
  00403020: 47 30 00 00 6C 30 00 00 00 00 00 00 00 00 00 00  G0..l0..........
  00403030: 00 00 00 00 00 00 00 00 00 00 00 00 75 73 65 72  ............user
  00403040: 33 32 2E 64 6C 6C 00 6B 65 72 6E 65 6C 33 32 2E  32.dll.kernel32.
  00403050: 64 6C 6C 00 74 30 00 00 00 00 00 00 82 30 00 00  dll.t0.......0..
  00403060: 00 00 00 00 74 30 00 00 00 00 00 00 82 30 00 00  ....t0.......0..
  00403070: 00 00 00 00 00 00 4D 65 73 73 61 67 65 42 6F 78  ......MessageBox
  00403080: 41 00 00 00 45 78 69 74 50 72 6F 63 65 73 73 00  A...ExitProcess.

  Section contains the following imports:

user32.dll
            403064 Import Address Table
            403054 Import Name Table
                 0 time date stamp
                 0 Index of first forwarder reference

                0 MessageBoxA

kernel32.dll
            40306C Import Address Table
            40305C Import Name Table
                 0 time date stamp
                 0 Index of first forwarder reference

                0 ExitProcess

Summary
    1000 .code
    1000 .data
    1000 .import
Était-ce utile?

La solution 3

La taille de l'image est, selon dumpbin 890, alors qu'il devrait être la taille de l'image dans la mémoire, à savoir la dernière section de RVA + taille arrondie en place de cette section (par exemple 0x5000 dans ce cas).

Il fonctionne. Merci pour anserws, en particulier l'indice à dumpbin!

Autres conseils

Vous abordez certainement ce problème par le mauvais bout. Piratage l'hexagone ne va jamais vous obtenir ce que vous voulez, la structure de fichier PE est trop sophistiqué. Vous aurez besoin de deux choses.

  • Matt Pietrek de article fondateur est une lecture essentielle pour comprendre la structure . Ne pas commencer le code jusqu'à ce que vous comprenez au moins 75% de celui-ci.
  • Vous aurez besoin du SDK de Windows. Le include / fichier winnt.h contient les déclarations des structures utilisées dans le format PE. Il commence à _IMAGE_DOS_HEADER, le premier morceau du fichier.

Ecrire le code pour créer les structures de leurs déclarations, c'est la seule façon de se retrouver avec un fichier exécutable valide.

PS: vos dépotoirs hexagonaux raccrochent les navigateurs de quelqu'un qui essaie de regarder votre question

.

Un rapide Google a révélé:

http://rcecafe.net/?p=26 . Personne ici ne va prosterner à travers vos octets pour vous, le meilleur que vous pouvez vous attendre à des outils est des pointeurs.

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