2010-05-05 12 views
5

Estoy intentando detectar la aplicación de la consola de la lista de los archivos ejecutables instalados en mi computadora.Cómo determinar el subsistema de la aplicación desde el archivo ejecutable

¿Cómo implementarlo?

Cada aplicación tiene un "subsistema" (aplicación de Windows, aplicación de consola o biblioteca, especificada para el vinculador como opción, creo). ¿Cómo detectarlo usando solo el archivo ejecutable?

¿Hay métodos alternativos para detectar la característica de la aplicación? Además, ¿hay algún método para detectar el archivo que sea realmente ejecutable?

¿Existe algún problema para los ejecutables JAR?

+0

ver esto por respuesta: http://stackoverflow.com/a/26817422/1424244 – IllidanS4

Respuesta

4

Sin ningún tipo de programación que reciben esta información de

dumpbin.exe /headers filename 

Parte de la información que proporciona funciones GetBinaryType y SHGetFileInfo. Toda la información que necesita la encontrará en el encabezado de cada archivo ejecutable. Consulte el documento ejecutable portátil de Microsoft y la especificación de formato de archivo de objeto común en http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx.

También se puede utilizar la API Debug Help Library de DbgHelp.dll (consulte http://msdn.microsoft.com/en-us/library/ms679309(VS.85).aspx). Las estructuras IMAGE_DOS_HEADER, IMAGE_DOS_SIGNATURE e IMAGE_NT_HEADERS32 le brindan información completa.

ACTUALIZADO (agregue un código): O puede usar solo las estructuras definidas en WinNT.h. El código correspondiente puede comenzar como seguir

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

Los ejecutables de Windows PE tienen un campo en el encabezado que especifica el subsistema (Consola, GUI, Posix, etc.). También tienen campos que se pueden usar para identificar ejecutables en general. Descargue la especificación PE de msdn.com para obtener los detalles.

1

Para determinar el subsistema necesita leer el archivo ejecutable y analizar el PE-Header. Un artículo detallado sobre cómo hacer eso is found here.

Un archivo JAR es simplemente un archivo ZIP con algunos archivos específicos y una estructura de carpetas para que pueda abrirlo como un archivo zip normal y buscar los archivos y carpetas que están siempre allí.

+0

Realmente gran artículo. Encontré una base de código prometedor para inspeccionar el encabezado PE (http://www.bearcanyon.com/dotnet/#AssemblyParser). – Luca

Cuestiones relacionadas