Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2009, 20:33   #1
nazavrik
Форумчанин
 
Аватар для nazavrik
 
Регистрация: 01.09.2008
Сообщений: 178
По умолчанию Проблемы при считывании PE- заголовка

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

Алгоритм:

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

Вопрос: можно ли на основании этой ошибки сделать вывод о том, что файл не является исполняемым. Если нет, то что это может быть и как это можно исправить?
Быть радикальным - значит понять вещь в её корне. К.Маркс
nazavrik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CURL проблемы при компиляции... XAOC-forever Общие вопросы C/C++ 5 23.07.2009 13:10
проблемы при загрузке компа kot21 Помощь студентам 1 16.05.2009 15:44
Проблема при считывании каталога Devochka PHP 2 01.12.2008 10:44
Проблемы при удалении файлов Pavel55 Общие вопросы Delphi 7 10.01.2008 00:45
Помогите разобраться, ошибка при считывании из ini файла XATAB Помощь студентам 4 13.02.2007 05:57