Алгоритм:
Код: Выделить всё
//открываем файл
pFile = CreateFile(name, GENERIC_READ, FILE_SHARE_READ,0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0);
if(!(hMap = CreateFileMapping(pFile, 0, PAGE_READONLY | SEC_COMMIT, 0, 0, 0)))
return false;
base = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
CloseHandle(hMap);
CloseHandle(pFile);
//считываем DOS-заголовок
hDosHead =(PIMAGE_DOS_HEADER)base;
//если DOS-сигнатуры совпадают
if(hDosHead->e_magic!=IMAGE_DOS_SIGNATURE)
{
UnmapViewOfFile(base);
return false;
}
//продолжаем проверку
//смещаемся до PE-заголовка
header = (DWORD)base + hDosHead->e_lfanew;
//копируем его в IMAGE_NT_HEADERS32 hNtHead
memcpy(&hNtHead, (void *)header, sizeof(IMAGE_NT_HEADERS32));
//сравниваем
if(hNtHead.Signature!=IMAGE_NT_SIGNATURE)
{
UnmapViewOfFile(base);
return false;
}
//если все прошло, значит файл исполняемый
Код: Выделить всё
memcpy(&hNtHead, (void *)header, sizeof(IMAGE_NT_HEADERS32));
Access violation reading location
Как я понимаю, это из-за того, что у файла после смещения в том месте, где должно было быть начало PE-заголовка, находится нечто другое, до чего у меня нет доступа.
Вопрос: можно ли на основании этой ошибки сделать вывод о том, что файл не является исполняемым. Если нет, то что это может быть и как это можно исправить?