Wie kann ich eine Windows-DLL-Datei testen, um zu bestimmen, ob es 32-Bit oder 64-Bit? [Duplikat]

StackOverflow https://stackoverflow.com/questions/495244

  •  20-08-2019
  •  | 
  •  

Frage

    

Diese Frage bereits eine Antwort hier:

         

Ich möchte ein Testskript oder ein Programm schreiben, das behauptet, dass alle DLL-Dateien in einem bestimmten Verzeichnis eines bestimmten Build-Typ sind.

Ich würde auf einem SDK am Ende eines Build-Prozesses dies als eine Plausibilitätsprüfung verwenden, um sicherzustellen, dass die 64-Bit-Version einige 32-Bit-DLL-Dateien in dem nicht irgendwie bekommen hat und umgekehrt.

Gibt es eine einfache Möglichkeit, in einer DLL-Datei zu suchen und seinen Typ bestimmen?

Die Lösung sollte beide arbeiten auf XP32 und XP64.

War es hilfreich?

Lösung

Gory Details

Eine DLL verwendet das PE ausführbare Format, und es ist nicht zu schwierig, dass die Informationen aus der Datei zu lesen.

Sehen Sie dieses MSDN-Artikel auf dem PE-Dateiformat für einen Überblick. Sie müssen die MS-DOS-Header lesen, dann lesen Sie die IMAGE_NT_HEADERS Struktur. Diese enthält die IMAGE_FILE_HEADER Struktur, die die Informationen enthält, die Sie müssen in dem Maschinenelement, das eine der folgenden Werte enthält

  • IMAGE_FILE_MACHINE_I386 (0x014c)
  • IMAGE_FILE_MACHINE_IA64 (0x0200)
  • IMAGE_FILE_MACHINE_AMD64 (0x8664)

sollte diese Information zu einem Offset in der Datei fixiert werden, aber ich würde noch empfehlen die Datei durchlaufen und die Unterschrift des MS-DOS-Header und den IMAGE_NT_HEADERS prüft um sicherzustellen, dass Sie mit allen möglichen zukünftigen Veränderungen zu bewältigen.

Mit ImageHelp die Header lesen ...

Sie können auch die ImageHelp API dies zu tun - laden Sie die DLL mit Loadimage und Sie werden einen LOADED_IMAGE Struktur erhalten, die enthalten ein Zeiger auf eine Struktur IMAGE_NT_HEADERS. Ausplanen die LOADED_IMAGE mit ImageUnload.

... oder passen diesen groben Perl-Skript

Hier ist rau Perl-Skript, das die Arbeit erledigt wird. Es überprüft die Datei einen DOS-Header hat, dann die PE vom IMAGE_DOS_HEADER 60 Bytes in die Datei Offset liest.

Es soll dann zu Beginn des PE Teil liest die Signatur und prüft sie und extrahiert dann den Wert wir interessiert sind.

#!/usr/bin/perl
#
# usage: petype <exefile>
#
$exe = $ARGV[0];

open(EXE, $exe) or die "can't open $exe: $!";
binmode(EXE);
if (read(EXE, $doshdr, 64)) {

   ($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);

Andere Tipps

Eine grobe Art und Weise wäre mit der Header-Option für jedes DLL von Visual Studio-Tool zu nennen dumpbin und sucht die entsprechende Ausgabe:

dumpbin /headers my32bit.dll

PE signature found

File Type: DLL

FILE HEADER VALUES
             14C machine (x86)
               1 number of sections
        45499E0A time date stamp Thu Nov 02 03:28:10 2006
               0 file pointer to symbol table
               0 number of symbols
              E0 size of optional header
            2102 characteristics
                   Executable
                   32 bit word machine
                   DLL

OPTIONAL HEADER VALUES
             10B magic # (PE32)

Sie können ein paar Hinweise in dieser Ausgabe sehen, dass es einen 32-Bit-DLL ist, einschließlich dem 14C-Wert, Paulus erwähnt. Sollte einfach in einem Skript zu suchen.

Wenn Sie Cygwin installiert (was ich stark für eine Vielzahl von Gründen empfehlen ist), könnte die Verwendung " Datei‘Dienstprogramm auf dem DLL

file <filename>

, die eine Ausgabe wie diese geben würde:

icuuc36.dll: MS-DOS executable PE  for MS Windows (DLL) (GUI) Intel 80386 32-bit

Dependency Walker erzählt alle (naja fast). http://www.dependencywalker.com/

Es ist nicht „install“ -Just es zu erhalten, zu extrahieren und die exec auszuführen. Es funktioniert für jede x32 oder x64 Windows-Modul |. Anwendung

Wie ich mich erinnere es ziemlich einfach ist, alle Abhängigkeiten zu sehen, das heißt die DLL-Module, und da die Appl. ist eine Summe der Abhängigkeiten man feststellen kann, wenn er voll x64, x32 (x86) oder ein Bit von jedem ist.

Typ der CPU, die das Modul gebaut wurde in der „CPU“ -Spalte für ist. Die meisten 64-Bit-aps sind immer noch ein Bit jedes 32-Bit aber ap w / b alle x86.

Schönes Programm für Geeks / Programmierer und es ist kostenlos ...

Ich habe ein sehr einfaches Werkzeug geschrieben, das genau funktioniert das. - es PE Deconstructor genannt

Einfach es Feuer und laden Sie Ihre DLL-Datei:

eingeben Bild Beschreibung hier

In dem obigen Beispiel die geladenen DLL ist 32-Bit.

Sie es hier herunterladen können (ich habe nur die 64-Bit-Version kompiliert ATM):
http://files.quickmediasolutions.com/exe/pedeconstructor_0.1_amd64.exe

Eine ältere 32-Bit-Version finden Sie hier:
http://dl.dropbox.com/u/31080052/pedeconstructor.zip

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top