2010-05-05 8 views
5

Sto provando a rilevare l'applicazione della console dall'elenco dei file eseguibili installati sul mio computer.Come determinare il sottosistema dell'applicazione dal file eseguibile

Come implementarlo?

Ogni applicazione ha un "sottosistema" (applicazione Windows, applicazione console o libreria, specificato per il linker come opzione, penso). Come rilevarlo usando solo il file eseguibile?

Esistono metodi alternativi per rilevare le caratteristiche dell'applicazione? Inoltre, c'è qualche metodo per rilevare il file è un file veramente eseguibile?

Qualche problema per gli eseguibili JAR?

+0

Vedere questo per risposta: http://stackoverflow.com/a/26817422/1424244 – IllidanS4

risposta

4

senza alcuna programmazione si riceve queste informazioni da

dumpbin.exe /headers filename 

Alcune informazioni ti dà le funzioni GetBinaryType e SHGetFileInfo. Tutte le informazioni di cui hai bisogno si trovano nell'intestazione di ogni file eseguibile. Vedere Specifica portatile per file eseguibili eseguibili e comuni di Microsoft Object in http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx.

Si può utilizzare anche l'API Debug Help Library da DbgHelp.dll (vedere http://msdn.microsoft.com/en-us/library/ms679309(VS.85).aspx). Le strutture IMAGE_DOS_HEADER, IMAGE_DOS_SIGNATURE e IMAGE_NT_HEADERS32 ti forniscono informazioni complete.

AGGIORNATO (aggiungere un codice): Oppure è possibile utilizzare solo le strutture definite in WinNT.h. Il codice corrispondente può iniziare come seguire

// 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

Gli eseguibili di Windows PE hanno un campo nell'intestazione che specifica il sottosistema (Console, GUI, Posix e così via). Hanno anche campi che possono essere utilizzati per identificare gli eseguibili in generale. Scarica la specifica PE da msdn.com per ottenere i dettagli.

1

Per determinare il sottosistema è necessario leggere il file eseguibile e analizzare l'intestazione PE. Un articolo dettagliato su come farlo is found here.

Un file JAR è solo un file ZIP con alcuni file e struttura di cartelle specifici in modo da poterlo aprire come un normale file zip e cercare quei file e cartelle sempre presenti.

+0

Davvero vasto articolo. Ho trovato una base di codice promettente per l'ispezione dell'intestazione PE (http://www.bearcanyon.com/dotnet/#AssemblyParser). – Luca

Problemi correlati