¿Cómo puedo probar un archivo DLL de Windows para determinar si es de 32 bits o de 64 bits? [duplicar]

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

  •  20-08-2019
  •  | 
  •  

Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

Me gustaría escribir un script o programa de prueba que afirme que todos los archivos DLL en un directorio dado son de un tipo de compilación particular.

Yo usaría esto como una comprobación de cordura al final de un proceso de compilación en un SDK para asegurarme de que la versión de 64 bits no tenga de alguna manera algunos archivos DLL de 32 bits y viceversa.

¿Hay una manera fácil de mirar un archivo DLL y determinar su tipo?

La solución debería funcionar tanto en xp32 como en xp64.

¿Fue útil?

Solución

Detalles sangrientos

Una DLL utiliza el formato ejecutable PE, y no es demasiado complicado leer esa información fuera del archivo.

Vea esto Artículo de MSDN en el formato de archivo PE para una visión general. Debe leer el encabezado de MS-DOS y luego leer el IMAGE_NT_HEADERS estructura. Contiene la estructura IMAGE_FILE_HEADER que contiene la información que usted necesidad en el miembro de la máquina que contiene uno de los siguientes valores

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

Esta información debe estar en un desplazamiento fijo en el archivo, pero aún así recomendaría recorrer el archivo y verificar la firma del encabezado de MS-DOS y los IMAGE_NT_HEADERS para asegurarse de hacer frente a cualquier cambio futuro.

Use ImageHelp para leer los encabezados ...

También puede usar la API ImageHelp para hacer esto: cargue la DLL con LoadImage y obtendrá una LOADED_IMAGE estructura que contendrá un puntero a una estructura IMAGE_NT_HEADERS. Desasignar LOADED_IMAGE con ImageUnload.

... o adapte este script de Perl aproximado

Aquí hay un script de Perl aproximado que hace el trabajo. Comprueba que el archivo tiene un encabezado de DOS, luego lee el desplazamiento PE de los 60 bytes IMAGE_DOS_HEADER en el archivo.

Luego busca el inicio de la parte PE, lee la firma y la verifica, y luego extrae el valor que nos interesa.

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

Otros consejos

Una forma cruda sería llamar a dumpbin con la opción de encabezados de las herramientas de Visual Studio en cada DLL y buscar el resultado apropiado:

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)

Puede ver un par de pistas en esa salida de que es una DLL de 32 bits, incluido el valor 14C que menciona Paul. Debería ser fácil de buscar en un script.

Si tiene Cygwin instalado (que recomiendo encarecidamente por una variedad de razones), puede usar el ' archivo 'utilidad en la DLL

file <filename>

que daría una salida como esta:

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

Dependencia Walker lo dice todo (bueno, casi). http://www.dependencywalker.com/

No " instala " -Solo obténgalo, extráigalo y ejecute el ejecutivo. Funciona para cualquier aplicación de módulo de Windows x32 o x64.

Como recuerdo, es bastante sencillo ver todas las dependencias, es decir, los módulos dll, y desde la aplicación. es una suma de las dependencias que uno puede determinar si está lleno x64, x32 (x86) o un poco de cada uno.

El tipo de CPU para el que se creó el módulo está en " CPU " columna. La mayoría de las AP de 64 bits siguen siendo un poco de cada una, pero las de 32 bits con todas x86.

Hermoso programa para geeks / programadores y es gratis ...

He escrito una herramienta muy simple que hace exactamente eso: se llama PE Deconstructor.

Simplemente enciéndalo y cargue su archivo DLL:

ingrese la descripción de la imagen aquí

En el ejemplo anterior, la DLL cargada es de 32 bits.

Puede descargarlo aquí (solo tengo el cajero automático compilado de la versión de 64 bits):
http://files.quickmediasolutions.com/exe/pedeconstructor_0.1_amd64.exe

Una versión anterior de 32 bits está disponible aquí:
http://dl.dropbox.com/u/31080052/pedeconstructor.zip

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top