Если у вас возникли проблемы с расширением файла, как вы можете указать исполняемый файл отдельно от DLL?
У них обоих есть точки входа и все...
Если у вас возникли проблемы с расширением файла, как вы можете указать исполняемый файл отдельно от DLL?
У них обоих есть точки входа и все...
Посмотрите эту статью для хорошего объяснения переносимого исполняемого файла в окнах.
И затем посмотрите раздел о 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);
}
Эта информация находится в заголовке PE. Чтобы просмотреть его, вы можете открыть его с помощью PE-проводника, такого как NTCore CFF Explorer и открыть поле Characterics в заголовке файла, где вы можете найти, является ли это DLL или исполняемым файлом.
если кому-то интересен код С#, протестирован на 32-битные файлы PE.
public static class PECheck
{
public static bool IsDll(Stream stream)
{
using (BinaryReader reader = new BinaryReader(stream))
{
byte[] header = reader.ReadBytes(2); //Read MZ
if (header[0] != (byte)'M' && header[1] != (byte)'Z')
throw new Exception("Invalid PE file");
stream.Seek(64 - 4, SeekOrigin.Begin);//read elf_new this is the offset where the IMAGE_NT_HEADER begins
int offset = reader.ReadInt32();
stream.Seek(offset, SeekOrigin.Begin);
header = reader.ReadBytes(2);
if (header[0] != (byte)'P' && header[1] != (byte)'E')
throw new Exception("Invalid PE file");
stream.Seek(20, SeekOrigin.Current); //point to last word of IMAGE_FILE_HEADER
short readInt16 = reader.ReadInt16();
return (readInt16 & 0x2000) == 0x2000;
}
}
}
dumpbin *.* | grep "File Type"
Работает для меня. Я точно не помню, что использовать, если у вас нет grep, но я предлагаю вам это сделать.
Возьмите OllyDbg и откройте в нем EXE/DLL. Поднимите карту памяти, нажав большую кнопку М вверху. Прокрутите вниз, пока не найдете PE-заголовок модуля, который соответствует вашей программе. Дважды щелкните, чтобы открыть его в дампе памяти. Прокрутите вниз до места, где вы видите подпись PE (возможно, 0xF8 из базы изображений), и если это DLL, то характеристики будут иметь на ней флаг DLL. Характеристики должны быть немного ниже от подписи PE.