2011-06-10 14 views
13

Se le estensioni dei file sono state incasinate, come si può distinguere un eseguibile da una DLL?Come sapere se un file è un EXE o una DLL?

Entrambi sembrano avere punti di ingresso e tutto ...

+0

a livello di programmazione? – CharlesB

+0

@OmerPT, @CharlesB: Intendo più simile alle loro caratteristiche (ad esempio le intestazioni PE, il loro smontaggio, ecc.) – Mehrdad

+0

Rinominarlo con estensione 'exe' e provare ad eseguirlo in un ambiente Windows. Se fa qualcosa, è un exe. : P Sono davvero curioso anche di questo ... – bdares

risposta

5

Vedere this article per una buona spiegazione di un eseguibile portatile su Windows.

E poi guarda la sezione sull'intestazione PE. Anche il codice there-in mostra in C il modo di aprire ed esaminare un file PE usando Win32. Questa informazione che stai cercando è memorizzata nello IMAGE_FILE_HEADER. Nello specifico nel campo Characteristics che includerebbe la bandiera IMAGE_FILE_DLL 0x2000 se è una dll.

Questo dovrebbe fornire informazioni sufficienti per creare una piccola utility che rende la determinazione di un gruppo di file, se questo è ciò che stai cercando.

I bit di codice più rilevanti a scopo di riferimento, copiati dall'articolo precedente e modificati per rimuovere dettagli estranei/gestione degli errori.

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

Pensandoci un po 'di più mi rendo conto che il codice sopra non funzionerà (è passato molto tempo). Non otterrà correttamente l'intestazione del file. Quando avrò un momento proverò a correggerlo. – dkackman

+0

Risolto il problema. Penso che funzionerà ora ora – dkackman

0

Grab OllyDbg e aprire il file EXE/DLL in esso. Apri la mappa della memoria facendo clic sul grande pulsante M in alto. Scorri verso il basso fino a trovare l'intestazione PE del modulo che corrisponde al tuo programma. Fare doppio clic per aprirlo nel dump della memoria. Scorri verso il basso fino a dove vedi la firma PE (probabilmente 0xF8 dalla base immagine) e se è una DLL, le caratteristiche avranno la bandiera DLL su di essa. Le caratteristiche dovrebbero essere un po 'scadute dalla firma PE.

2
dumpbin *.* | grep "File Type" 

funziona per me. Non ricordo esattamente cosa usare se non hai installato grep, ma ti suggerisco di farlo.

6

Queste informazioni si trovano nell'intestazione PE. Per visualizzarlo, è possibile aprirlo con un programma di esplorazione PE come NTCore CFF Explorer e aprire il campo Characterics dell'intestazione del file, in cui è possibile verificare se si tratta di una DLL o di un file eseguibile.

enter image description here

+0

+1 questo è fantastico. Grazie! – Mehrdad

5

se chiunque sia interessato ecco il codice in C#, testati per file PE 32 bit.

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; 

      } 
     } 
    } 
Problemi correlati