2011-06-10 41 views
13

如果你已經弄亂了文件擴展名,你怎麼能告訴除DLL以外的可執行文件?如何判斷文件是EXE還是DLL?

他們都似乎有入口點和一切...

+0

以編程方式? – CharlesB 2011-06-10 16:17:03

+0

@OmerPT,@CharlesB:我的意思是更像是通過他們的功能(例如,他們的PE頭文件,他們的反彙編等) – Mehrdad 2011-06-10 16:17:21

+0

用擴展名'exe'重命名並嘗試在Windows環境中執行它。如果它做了什麼,它是一個exe文件。 :P我其實也很好奇... – bdares 2011-06-10 16:18:02

回答

5

請看this article,以便對windows上的可移植可執行文件有一個很好的解釋。

然後查看有關PE標題的部分。此外,C代碼顯示了使用Win32打開和檢查PE文件的方式。您正在查找的信息存儲在IMAGE_FILE_HEADER中。特別是在Characteristics字段中,如果它是一個dll,那麼將包括標記IMAGE_FILE_DLL 0x2000

這應該給你足夠的信息來創建一個小實用程序,如果這是你正在尋找的一堆文件的決心。

用於參考目的的代碼的最相關位,從上面的文章複製並編輯刪除多餘的細節/錯誤處理。

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

再想一想,我意識到上面的代碼不會起作用(這已經很長時間了)。它不會正確地獲取文件頭。當我得到片刻時,我會嘗試糾正它 – dkackman 2011-06-10 18:08:53

+0

修復了代碼。我認爲它現在實際上會工作 – dkackman 2011-06-10 20:32:04

0

搶OllyDbg中,並打開其中的EXE/DLL。通過點擊頂部的大M按鈕來調出內存映射。向下滾動,直到找到與您的程序相對應的模塊的PE標頭。雙擊在內存轉儲中打開它。向下滾動到您看到PE簽名的位置(可能是圖像庫中的0xF8),如果是DLL,則特徵將具有DLL標誌。特徵應該是PE簽名中的一小部分。

2
dumpbin *.* | grep "File Type" 

爲我工作。如果你沒有安裝grep,我不記得如何使用,但我建議你這樣做。

6

此信息位於PE標題中。要查看它,您可以使用一個PE瀏覽器(如NTCore CFF Explorer)打開它,並打開文件頭的Characterics字段,您可以在其中找到它是DLL還是可執行文件。

enter image description here

+0

+1這真棒。謝謝! – Mehrdad 2011-06-10 16:56:47

5

,如果任何人有興趣在這裏是C#代碼,32位PE文件進行測試。

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; 

      } 
     } 
    } 
相關問題