2010-05-05 63 views
5

我試圖從安裝在我的計算機上的可執行文件列表中檢測控制檯應用程序。如何從可執行文件中確定應用程序子系統

如何實現它?

每個應用程序都有一個「子系統」(windows應用程序,控制檯應用程序或庫;作爲選項指定給連接器,我認爲)。如何僅使用可執行文件檢測它?

是否有替代方法來檢測應用程序特徵?另外,是否有任何檢測文件的方法是真正的可執行文件?

JAR可執行文件的任何問題?

+0

看到這個答案爲:http://stackoverflow.com/a/26817422/1424244 – IllidanS4 2014-11-08 13:06:03

回答

4

無需任何編程您收到來自

dumpbin.exe /headers filename 

一些信息給你GetBinaryType和功能的SHGetFileInfo這一信息。您需要的所有信息都將在每個可執行文件的標題中找到。請參閱http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx中的Microsoft Portable Executable和Common Object File Format Specification。

你也可以使用調試幫助庫API從DbgHelp.dll(見http://msdn.microsoft.com/en-us/library/ms679309(VS.85).aspx)。 IMAGE_DOS_HEADER,IMAGE_DOS_SIGNATURE和IMAGE_NT_HEADERS32結構爲您提供完整的信息。

已更新(增加一些代碼): 或者您也可以只使用在WinNT.h中定義的結構。相應的代碼就可以開始像下面

// Open source file 
hSrcFile = CreateFile (pszSrcFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); 
if (hSrcFile == INVALID_HANDLE_VALUE) 
    __leave; 

// Map the source file in memory 
hMapSrcFile = CreateFileMapping (hSrcFile, NULL, PAGE_READONLY, 0, 0, NULL); // SEC_IMAGE 
if (!hMapSrcFile || hMapSrcFile == INVALID_HANDLE_VALUE) 
    __leave; 

// Map the entire of the source file is memory 
pSrcFile = (PBYTE) MapViewOfFile (hMapSrcFile, FILE_MAP_READ, 0, 0, 0); 
if (!pSrcFile) 
    __leave; 

pDosHeader = (IMAGE_DOS_HEADER *)pSrcFile; 

if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) { 
    printf ("it is not a EXE file.\n"); 
    return 1; 
} 
printf ("IMAGE_DOS_HEADER size %d (0x%X) bytes\n", sizeof(IMAGE_DOS_HEADER), sizeof(IMAGE_DOS_HEADER)); 

DumpDosHeader (pDosHeader); 
pDosExeStart = (PBYTE)pDosHeader + pDosHeader->e_cparhdr*16; 

if (g_bDump) 
    HexDump (1, pDosExeStart, pDosHeader->e_lfanew - pDosHeader->e_cparhdr*16, (DWORD)pDosExeStart); 

if (pDosHeader->e_lfanew) { 
    IMAGE_NT_HEADERS32 *pNtHeader = (IMAGE_NT_HEADERS32 *)((PBYTE)pDosHeader + pDosHeader->e_lfanew); 
    //IMAGE_NT_HEADERS64 *pNtHeader64 = (IMAGE_NT_HEADERS64 *)((PBYTE)pDosHeader + pDosHeader->e_lfanew); 
    IMAGE_SECTION_HEADER *pFirstSectionHeader = (IMAGE_SECTION_HEADER *)((PBYTE)&pNtHeader->OptionalHeader + 
                      pNtHeader->FileHeader.SizeOfOptionalHeader); 

    if (pNtHeader->Signature == IMAGE_NT_SIGNATURE) { 
     int i; 

     printf ("\nPE signature\n"); 
     printf ("\nIMAGE_FILE_HEADER: size %d (0x%X) bytes, offset from the begin of the file: %d (0x%X)\n", 
       sizeof(IMAGE_FILE_HEADER), sizeof(IMAGE_FILE_HEADER), 
       ((PBYTE)&pNtHeader->FileHeader - (PBYTE)pDosHeader), ((PBYTE)&pNtHeader->FileHeader - (PBYTE)pDosHeader)); 
     DumpFileHeader (1, &pNtHeader->FileHeader); 
     switch (pNtHeader->OptionalHeader.Magic) { 
      case IMAGE_NT_OPTIONAL_HDR32_MAGIC: 
       printf ("\nIMAGE_OPTIONAL_HEADER32: size %d (0x%X) bytes, offset from the begin of the file: %d (0x%X)\n", 
         sizeof(IMAGE_OPTIONAL_HEADER32), sizeof(IMAGE_OPTIONAL_HEADER32), 
         ((PBYTE)&pNtHeader->OptionalHeader - (PBYTE)pDosHeader), ((PBYTE)&pNtHeader->OptionalHeader - (PBYTE)pDosHeader)); 
       DumpOptionalHeader32 (1, &pNtHeader->OptionalHeader); 
       break; 
      case IMAGE_NT_OPTIONAL_HDR64_MAGIC: 
       break; 
      case IMAGE_ROM_OPTIONAL_HDR_MAGIC: 
       break; 
     } 
1

Windows PE可執行文件在頭文件中有一個指定子系統(控制檯,GUI,Posix等)的字段。他們也有一些可用於識別可執行文件的字段。從msdn.com下載PE規範以獲取詳細信息。

1

要確定子系統,您需要讀取可執行文件並解析PE-Header。有關如何做到這一點的詳細文章is found here

一個JAR文件只是一些特定的文件和文件夾結構的ZIP文件,所以你可以像一個普通的zip文件,打開它,並期待爲那些總是在那裏的文件和文件夾。

+0

真的廣闊的文章。我發現了一個很有前途的用於檢查PE頭的代碼庫(http://www.bearcanyon.com/dotnet/#AssemblyParser)。 – Luca 2010-05-05 21:11:26

相關問題