2011-06-10 12 views
13

Si ha desordenado las extensiones de archivo, ¿cómo puede distinguir un ejecutable de un archivo DLL?¿Cómo saber si un archivo es un EXE o un DLL?

Ambos parecen tener puntos de entrada y todo ...

+0

programmatically? – CharlesB

+0

@OmerPT, @CharlesB: me refiero más a través de sus características (por ejemplo, sus encabezados PE, su desensamblaje, etc.) – Mehrdad

+0

Cambie el nombre con la extensión 'exe' e intente ejecutarlo en un entorno Windows. Si hace algo, es un exe. : P Tengo curiosidad sobre esto también ... – bdares

Respuesta

5

Mire this article para una buena explicación de un ejecutable portátil en Windows.

Y luego mira la sección sobre el encabezado PE. Además, el código de allí muestra en C la forma de abrir y examinar un archivo PE utilizando Win32. Esta información que busca se almacena en el IMAGE_FILE_HEADER. Específicamente en el campo Characteristics que incluiría la bandera IMAGE_FILE_DLL 0x2000 si es una dll.

Eso debería darle suficiente información para crear una pequeña utilidad que hace la determinación de un grupo de archivos si eso es lo que está buscando.

Los bits de código más relevantes para fines de referencia, copiados del artículo anterior y editados para eliminar detalles extraños/manejo de errores.

void DumpFile(LPWSTR filename) 
{ 
    HANDLE hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); 

    HANDLE hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL); 

    LPVOID lpFileBase = MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);  

    PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)lpFileBase; 

    PIMAGE_NT_HEADERS pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)pDosHeader + (DWORD)pDosHeader->e_lfanew); 

    if ((pNTHeader->FileHeader.Characteristics & IMAGE_FILE_DLL)) 
     printf("dll"); 
    if ((pNTHeader->FileHeader.Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE)) 
     printf("exe"); 
    else 
     printf("????"); 

    UnmapViewOfFile(lpFileBase); 
    CloseHandle(hFileMapping); 
    CloseHandle(hFile); 
} 
+0

Al pensar un poco más, me doy cuenta de que el código anterior no va a funcionar (ha pasado mucho tiempo). No llegará correctamente al encabezado del archivo. Cuando tenga un momento, intentaré corregirlo – dkackman

+0

Se corrigió el código. Creo que realmente funcionará ahora – dkackman

0

Grab OllyDbg y abrir el archivo EXE/DLL en el mismo. Abra el mapa de la memoria haciendo clic en el gran botón M en la parte superior. Desplácese hacia abajo hasta encontrar el encabezado PE del módulo que corresponde a su programa. Haga doble clic para abrirlo en el volcado de memoria. Desplácese hasta donde vea la firma PE (probablemente 0xF8 desde la base de la imagen) y si es una DLL, entonces Characteristics tendrá la bandera DLL en ella. Las características deben ser algunas abajo de la firma PE.

2
dumpbin *.* | grep "File Type" 

funciona para mí. No recuerdo exactamente qué usar si no tiene grep instalado, pero le sugiero que lo haga.

6

Esta información se encuentra en el encabezado PE. Para verlo, puede abrirlo con un explorador PE como el NTCore CFF Explorer y abrir el campo Characterics del encabezado del archivo, donde puede encontrar si es un archivo DLL o ejecutable.

enter image description here

+0

+1 esto es increíble. ¡Gracias! – Mehrdad

5

si cualquier persona interesada aquí está el código en C#, la prueba de los archivos PE de 32 bits.

public static class PECheck 
    { 

     public static bool IsDll(Stream stream) 
     { 

      using (BinaryReader reader = new BinaryReader(stream)) 
      { 

       byte[] header = reader.ReadBytes(2); //Read MZ 
       if (header[0] != (byte)'M' && header[1] != (byte)'Z') 
        throw new Exception("Invalid PE file"); 

       stream.Seek(64 - 4, SeekOrigin.Begin);//read elf_new this is the offset where the IMAGE_NT_HEADER begins 
       int offset = reader.ReadInt32(); 
       stream.Seek(offset, SeekOrigin.Begin); 
       header = reader.ReadBytes(2); 
       if (header[0] != (byte)'P' && header[1] != (byte)'E') 
        throw new Exception("Invalid PE file"); 

       stream.Seek(20, SeekOrigin.Current); //point to last word of IMAGE_FILE_HEADER 
       short readInt16 = reader.ReadInt16(); 
       return (readInt16 & 0x2000) == 0x2000; 

      } 
     } 
    } 
Cuestiones relacionadas