回答
請看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);
}
搶OllyDbg中,並打開其中的EXE/DLL。通過點擊頂部的大M按鈕來調出內存映射。向下滾動,直到找到與您的程序相對應的模塊的PE標頭。雙擊在內存轉儲中打開它。向下滾動到您看到PE簽名的位置(可能是圖像庫中的0xF8),如果是DLL,則特徵將具有DLL標誌。特徵應該是PE簽名中的一小部分。
dumpbin *.* | grep "File Type"
爲我工作。如果你沒有安裝grep,我不記得如何使用,但我建議你這樣做。
此信息位於PE標題中。要查看它,您可以使用一個PE瀏覽器(如NTCore CFF Explorer)打開它,並打開文件頭的Characterics字段,您可以在其中找到它是DLL還是可執行文件。
+1這真棒。謝謝! – Mehrdad 2011-06-10 16:56:47
,如果任何人有興趣在這裏是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;
}
}
}
- 1. 如何判斷CmisObject是代表文件還是文件夾?
- 2. 如何判斷SPListItem是文檔還是文件夾
- 3. 如何判斷庫是COM還是DCOM?
- 4. 如何判斷DLL函數是否從VB6 exe被調用?
- 5. 使用JNotify庫,如何判斷刪除的文件是文件還是目錄?
- 6. 如何判斷URL是本地文件路徑還是遠程文件路徑
- 7. 如何判斷給定路徑是目錄還是文件? (C/C++)
- 8. 如何判斷文件是否是nv12格式的文件?
- 9. 如何判斷一個DLL是否是ComVisible?
- 10. 如何判斷用戶是新訪客還是返回? analytics.js
- 11. 如何判斷bonjour服務是無線還是藍牙?
- 12. 如何判斷我寫的程序是32位還是64位?
- 13. 如何判斷跳轉是絕對還是相對?
- 14. 如何在PHP中判斷它是數組還是散列?
- 15. 如何判斷它是對象還是數組?
- 16. 如何判斷obj是jquery還是普通javascript
- 17. 如何判斷EntityObject的屬性是主鍵還是外鍵?
- 18. 如何通過opencv判斷輪廓是線還是曲線?
- 19. 如何判斷交易是成功還是失敗?
- 20. 如何判斷我的對象的值是float還是int?
- 21. 如何判斷SQL Server是本地還是遠程?
- 22. 如何判斷字符串在元值中是空還是空?
- 23. 如何判斷資源/實體是類還是實例
- 24. 如何判斷DOM元素是HTML還是SVG?
- 25. 如何判斷鼠標是單擊還是鍵盤按
- 26. 如何判斷我的YEN符號是反斜槓還是YEN?
- 27. 如何判斷javascript對象是圖片還是畫布?
- 28. 如何判斷一個標籤是網站還是圖片?
- 29. 如何判斷Android設備是手機還是手機?
- 30. 如何判斷名詞是人,地點還是事物?
以編程方式? – CharlesB 2011-06-10 16:17:03
@OmerPT,@CharlesB:我的意思是更像是通過他們的功能(例如,他們的PE頭文件,他們的反彙編等) – Mehrdad 2011-06-10 16:17:21
用擴展名'exe'重命名並嘗試在Windows環境中執行它。如果它做了什麼,它是一個exe文件。 :P我其實也很好奇... – bdares 2011-06-10 16:18:02