Saltar al contenido

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

Emilio, miembro de este staff, nos ha hecho el favor de escribir este enunciado porque conoce perfectamente el tema.

Solución:

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 la utilidad ‘archivo’ en la DLL

file 

lo que daría una salida como esta:

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

detalles sangrientos

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

Consulte este artículo de MSDN sobre el formato de archivo PE para obtener una descripción general. Debe leer el encabezado de MS-DOS, luego leer la estructura IMAGE_NT_HEADERS. Esto contiene la estructura IMAGE_FILE_HEADER que contiene la información que necesita en el miembro de la máquina que contiene uno de los siguientes valores

  • IMAGEN_ARCHIVO_MAQUINA_I386 (0x014c)
  • IMAGEN_ARCHIVO_MAQUINA_IA64 (0x0200)
  • IMAGEN_ARCHIVO_MAQUINA_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 IMAGE_NT_HEADERS para asegurarse de que pueda hacer frente a cualquier cambio futuro.

Utilice ImageHelp para leer los encabezados…

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

…o adaptar este script de Perl en bruto

Aquí hay un script Perl aproximado que hace el trabajo. Verifica que el archivo tenga un encabezado DOS, luego lee el desplazamiento PE de IMAGE_DOS_HEADER 60 bytes 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 
#
$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 "i386n";
       
       elsif ($machine == 0x0200)
            print "IA64n";
       
       elsif ($machine == 0x8664)
            print "AMD64n";
       
       else
            printf("Unknown machine type 0x%lxn", $machine);
       
   


close(EXE);

Recuerda que puedes valorar esta división si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *