Посмотрите на в этой статье для хорошего объяснения переносимого исполняемого файла на windows.
А затем посмотрите на раздел о заголовке PE.Кроме того, код в C показывает способ открытия и проверки PE-файла с помощью Win32.Эта информация, которую вы ищете, хранится в IMAGE_FILE_HEADER .В частности, в поле Characteristics
, которое будет включать флаг IMAGE_FILE_DLL 0x2000
, если это dll.
Это должно дать вам достаточно информации для создания небольшой утилиты, которая определяет кучу файлов, если этото, что вы ищете.
Наиболее важные фрагменты кода для справочных целей, скопированы из статьи выше и отредактированы для удаления посторонних деталей / обработки ошибок.
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);
}