Проблемы при считывании PE- заголовка

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
nazavrik
Сообщения: 11
Зарегистрирован: 29 сен 2009, 13:12

Есть функция, определяющая является ли данный файл исполняемым.

Алгоритм:

Код: Выделить всё

//открываем файл
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-заголовка, находится нечто другое, до чего у меня нет доступа.

Вопрос: можно ли на основании этой ошибки сделать вывод о том, что файл не является исполняемым. Если нет, то что это может быть и как это можно исправить?
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

Дело в том, что структура заголовка РЕ-файла имеет размер в несколько сотен байт. Если проверяемый файл имеет размер меньше структуры заголовка исполняемого файла, то у тебя могут возникать ошибки при чтении данных из этого файла. Поэтому лучше сначала сравнить размер файла с размером структуры заголовка. Если размер файла меньше, то дальше можно и не проверять.
Поумнеть несложно, куда труднее от дури избавиться.
nazavrik
Сообщения: 11
Зарегистрирован: 29 сен 2009, 13:12

Большое спасибо!

Да, об этом я не подумал.
Ответить