2010-05-05 3 views
5

Я пытаюсь обнаружить консольное приложение из списка файлов исполняемых файлов, установленных на моем компьютере.Как определить подсистему приложения из исполняемого файла

Как его реализовать?

Каждое приложение имеет «подсистему» ​​(приложение для Windows, консольное приложение или библиотеку, которое, как мне кажется, указано в компоновщике). Как его обнаружить, используя только исполняемый файл?

Существуют ли альтернативные методы для определения характеристики приложения? Кроме того, существует ли какой-либо метод для обнаружения файла - действительно исполняемый файл?

Любая проблема для исполняемых файлов JAR?

+0

Смотрите это для ответа: http://stackoverflow.com/a/26817422/1424244 – IllidanS4

ответ

4

без какого-либо программирования вы получите эту информацию от

dumpbin.exe /headers filename 

Некоторая информация дает вам функции GetBinaryType и SHGetFileInfo. Вся информация, которая вам нужна, вы найдете в заголовке каждого исполняемого файла. См. Спецификацию формата файлов Microsoft Executable и Common Object File в http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx.

Также можно использовать 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 и т. Д.). У них также есть поля, которые могут использоваться для идентификации исполняемых файлов в целом. Загрузите спецификацию PE из msdn.com, чтобы получить подробную информацию.

1

Для определения подсистемы вам необходимо прочитать исполняемый файл и проанализировать PE-заголовок. Подробная статья о том, как это сделать is found here.

Файл JAR - это всего лишь ZIP-файл с определенными файлами и структурой папок, поэтому вы можете открыть его, как обычный zip-файл, и искать те файлы и папки, которые всегда есть.

+0

Действительно обширная статья. Я нашел многообещающую базу кода для проверки заголовка PE (http://www.bearcanyon.com/dotnet/#AssemblyParser). – Luca

Смежные вопросы