2017-06-03 5 views
2

Il est connu que le fichier * .lib de la bibliothèque Visual Studio est une archive Unix "ar" contenant des modules objet au format COFF. Mais j'ai trouvé que les bibliothèques pour l'importation de DLL sont une archive de petits morceaux (ou stubs) qui ne sont pas des objets COFF. Un exemple est la bibliothèque VS15 \ lib \ ucrt \ ucrt.lib. Ces blocs contiennent le nom de la fonction et la référence à la bibliothèque DLL qui définit cette fonction. Voici un exemple (vidage hexadécimal) de talon pour « puts » fonction:Format de la bibliothèque d'importation Microsoft Visual Studio

00-00-FF-FF-00-00-4C-01-39-E9-80-55-26-00-00-00 ......L.9..U&... 
93-00-08-00-5F-70-75-74-73-00-61-70-69-2D-6D-73 “..._puts.api-ms 
2D-77-69-6E-2D-63-72-74-2D-73-74-64-69-6F-2D-6C -win-crt-stdio-l 
31-2D-31-2D-30-2E-64-6C-6C-00     1-1-0.dll. 

Il est certainement pas l'objet COFF (bien qu'il contient 386 signature spécifique à l'architecture 0x14C COFF). Je ne trouve aucune documentation sur le format de ces objets d'importation. Quelqu'un connaît-il ce format?

Peut être des spécifications non-officielles?

Peut-être un code source pouvant traiter ce format?

+0

Est-ce que cela aide: https://blogs.msdn.microsoft.com/ronpih/2006/10/28/new-version-of-the- microsoft-pecoff-spec /? –

+0

Je connais bien cette documentation, c'est mon manuel. Hélas, il ne décrit que les modules objets COFF traditionnels, mais pas les stubs d'importation. –

+0

Notez que les bibliothèques d'importation ucrt sont encore plus spéciales que les bibliothèques d'importation normales: elles peuvent contenir une logique spéciale pour charger des DLL spécifiques à la version. Voir par exemple https://mingwpy.github.io/ucrt.html pour la raison pour laquelle la simple génération d'une bibliothèque d'importation pour la DLL d'ucrt fait la mauvaise chose. – rubenvb

Répondre

1

Il s'agit de l'objet Microsoft "import court". Fondamentalement, il se compose d'un en-tête de 20 octets (la même taille qu'un en-tête COFF normal), suivi de deux chaînes terminées par zéro: respectivement le nom du symbole d'importation et le nom de la DLL. L'en-tête "Short import" diffère d'un en-tête COFF normal dans les quatre premiers octets de signature: 0x00 0x00 0xFF 0xFF (aucun COFF régulier ne peut commencer avec ceci, car il se lirait comme "machine inconnue, 65535 sections", ce qui n'a aucun sens).

Le format de l'en-tête "import court" est entièrement décrit ici: MSDN PE Format.

Ainsi, dans l'exemple ci-dessus, nous avons:

0x00 0x00 0xFF 0xFF -> signature "court importation"
0x00 0x00 -> Version 0 (non utilisée)
0x4C 0x01 -> Machine I386
0x39 0x80 0x55 0xE9 -> Heure/Horodatage (17 juin 2015, 06:27:53 UTC)
0x26 0x00 0x00 0x00 -> taille des chaînes suivantes l'en-tête (38 octets)
0x93 0x00 -> ordinal/indice (147)
0x08 0x00 -> b ce champ ("code", importé par "nom")