Détails sanglants
Une DLL utilise le PE format de fichier exécutable, et il n'est pas trop difficile à lire que les informations du fichier.
Voir cet article MSDN sur le PE Format de Fichier pour une vue d'ensemble. Vous avez besoin de lire le MS-DOS en-tête, puis lire le IMAGE_NT_HEADERS structure. Il contient les IMAGE_FILE_HEADER structure qui contient les informations dont vous avez besoin dans la Machine à états qui contient l'une des valeurs suivantes
- IMAGE_FILE_MACHINE_I386 (0x014c)
- IMAGE_FILE_MACHINE_IA64 (0x0200)
- IMAGE_FILE_MACHINE_AMD64 (0x8664)
Cette information doit être fixe à un décalage dans le fichier, mais je voudrais encore vous recommandons de traversant le fichier et la vérification de la signature de la MS-DOS et l'en-tête IMAGE_NT_HEADERS pour être sûr de faire face à tous les changements à venir.
Utilisation ImageHelp de lire les en-têtes...
Vous pouvez également utiliser le ImageHelp API pour ce faire, charger la DLL avec LoadImage et vous obtiendrez un LOADED_IMAGE structure qui contient un pointeur vers un IMAGE_NT_HEADERS structure. Désallouer la LOADED_IMAGE avec ImageUnload.
...ou d'adapter cette rude script Perl
Voici rugueux script Perl qui fait le travail. Il vérifie que le fichier a un DOS en-tête, puis lit le PE décalage à partir de la IMAGE_DOS_HEADER 60 octets dans le fichier.
Il cherche alors le début de la PE partie, se lit la signature et le vérifie, et puis extrait la valeur qui nous intéresse.
#!/usr/bin/perl
#
# usage: petype <exefile>
#
$exe = $ARGV[0];
open(EXE, $exe) or die "can't open $exe: $!";
binmode(EXE);
if (read(EXE, $doshdr, 68)) {
($magic,$skip,$offset)=unpack('a2a58l', $doshdr);
die("Not an executable") if ($magic ne 'MZ');
seek(EXE,$offset,SEEK_SET);
if (read(EXE, $pehdr, 6)){
($sig,$skip,$machine)=unpack('a2a2v', $pehdr);
die("No a PE Executable") if ($sig ne 'PE');
if ($machine == 0x014c){
print "i386\n";
}
elsif ($machine == 0x0200){
print "IA64\n";
}
elsif ($machine == 0x8664){
print "AMD64\n";
}
else{
printf("Unknown machine type 0x%lx\n", $machine);
}
}
}
close(EXE);
7 votes
J'apprécie qu'une fois la réponse à cette question connue et stackoverflow.com/q/197951/5427 partager une solution. Cependant, les questions posées étaient différentes. L'une portait explicitement sur les dlls et l'autre sur les exes. Cette question reçoit un bon nombre de votes positifs et je pense qu'elle correspond bien au problème auquel les gens essaient de trouver une réponse. Des réflexions similaires sur la duplication sont discutées ici meta.stackoverflow.com/q/266244/5427