Come posso testare un file DLL di Windows per determinare se è a 32 bit o 64 bit? [duplicare]

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

  •  20-08-2019
  •  | 
  •  

Domanda

    

Questa domanda ha già una risposta qui:

         

Vorrei scrivere uno script o un programma di prova che asserisca che tutti i file DLL in una determinata directory sono di un particolare tipo di build.

Lo userei come controllo di integrità alla fine di un processo di compilazione su un SDK per assicurarmi che la versione a 64 bit non abbia in qualche modo dei file DLL a 32 bit in esso e viceversa.

Esiste un modo semplice per esaminare un file DLL e determinarne il tipo?

La soluzione dovrebbe funzionare sia su xp32 che xp64.

È stato utile?

Soluzione

Dettagli gory

Una DLL utilizza il formato eseguibile PE e non è troppo complicato leggere tali informazioni dal file.

Vedi questo articolo MSDN sul formato file PE per una panoramica. Devi leggere l'intestazione MS-DOS, quindi leggere IMAGE_NT_HEADERS struttura. Questo contiene la IMAGE_FILE_HEADER che contiene le informazioni necessario nel membro Machine che contiene uno dei seguenti valori

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

Queste informazioni dovrebbero avere un offset fisso nel file, ma consiglierei comunque di attraversare il file e controllare la firma dell'intestazione MS-DOS e IMAGE_NT_HEADERS per essere sicuro di far fronte a eventuali cambiamenti futuri.

Usa ImageHelp per leggere le intestazioni ...

Puoi anche utilizzare API ImageHelp per fare ciò - caricare la DLL con LoadImage e otterrai una LOADED_IMAGE che conterrà un puntatore a una struttura IMAGE_NT_HEADERS. Deallocate LOADED_IMAGE con ImageUnload.

... o adatta questo ruvido script Perl

Ecco uno script Perl approssimativo che porta a termine il lavoro. Verifica che il file abbia un'intestazione DOS, quindi legge l'offset PE da 60 byte IMAGE_DOS_HEADER nel file.

Cerca quindi l'inizio della parte PE, legge la firma e la controlla, quindi estrae il valore che ci interessa.

#!/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);

Altri suggerimenti

Un modo rozzo sarebbe chiamare dumpbin con l'opzione headers dagli strumenti di Visual Studio su ciascuna DLL e cercare l'output appropriato:

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)

Puoi vedere un paio di indizi in quell'output che si tratta di una DLL a 32 bit, incluso il valore 14C menzionato da Paul. Dovrebbe essere facile da cercare in uno script.

Se hai Cygwin installato (che consiglio vivamente per una serie di motivi), puoi utilizzare " file "utility sulla DLL

file <filename>

che darebbe un output come questo:

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

Dipendenza Walker racconta tutto (beh quasi). http://www.dependencywalker.com/

Non " installa " -semplicemente prenderlo, estrarlo ed eseguire il exec. Funziona con qualsiasi modulo windows x32 o x64 |

Come ricordo, è abbastanza semplice vedere tutte le dipendenze, vale a dire i moduli DLL, e poiché l'APP. è una somma delle dipendenze che si possono verificare se è pieno x64, x32 (x86) o un po 'di ciascuno.

Il tipo di CPU per cui è stato costruito il modulo è tra " CPU " colonna. La maggior parte degli aps a 64 bit sono ancora un po 'ciascuno ma a 32 bit ap w / b tutti x86.

Bellissimo programma per geek / programmatori ed è gratuito ...

Ho scritto uno strumento molto semplice che fa esattamente questo: si chiama PE Deconstructor.

Basta accenderlo e caricare il file DLL:

inserisci qui la descrizione dell'immagine

Nell'esempio sopra, la DLL caricata è a 32 bit.

Puoi scaricarlo qui (ho solo ATM compilato versione a 64 bit):
http://files.quickmediasolutions.com/exe/pedeconstructor_0.1_amd64.exe

Una versione precedente a 32 bit è disponibile qui:
http://dl.dropbox.com/u/31080052/pedeconstructor.zip

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top