@Xhayla
Chelovek

Page Guard Hooking на C++, как сделать?

Всем привет.
Имеется приложение для теста Dll`ки, вот ее код.
spoiler
#include "stdafx.h"
#include <windows.h>


int main()
{
	while (true)
	{
		MessageBox(0, L"TEST", 0, 0);
		Sleep(5000);
	}

    return 0;
}


Мне нужно изменить Sleep(5000) - 5 секунд на Speel(1000) к примеру.

Я нашел инструкцию в которой хранится значение "sleep(5000)", Вот скрин из CE
За счет Dll`ки, я хочу перевести код на копию этого участка, где значение будет уже не 5000мс, а к примеру 1000мс.(для того чтобы понять, работает DLL или нет).

Вот код самой DLL
spoiler
DWORD origAddress;
DWORD copyAddress;

LONG WINAPI HookPage(EXCEPTION_POINTERS *pExceptionInfo)
{
	if(pExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_GUARD_PAGE_VIOLATION)
	{
		if (pExceptionInfo->ExceptionRecord->ExceptionAddress == (GetModuleHandle("ForHookMessage.exe") + 0x116F3))
		{
			pExceptionInfo->ContextRecord->Eip = (DWORD)copyAddress;

			return EXCEPTION_CONTINUE_EXECUTION;
		}
	}

	return EXCEPTION_CONTINUE_SEARCH;
}

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
	{

		origAddress = (DWORD)GetModuleHandle("ForHookMessage.exe") + 0x116F3; // 0x116F3 смещение до инструкции где хранится значение задежки Sleep, видно на скриншоте.

		MEMORY_BASIC_INFORMATION system_info = { 0 };
		VirtualQuery((LPCVOID)origAddress, &system_info, sizeof(MEMORY_BASIC_INFORMATION)); // получаю информацию об адрессе.

		copyAddress = (DWORD)malloc(system_info.RegionSize); // выделяю нужное кол-во байт памяти.

		memcpy((void*)copyAddress, reinterpret_cast<void*>(origAddress), system_info.RegionSize); // копирую оригинальную страницу в копию.

		AddVectoredExceptionHandler(1, HookPage); // устанавливаю отлов исключений.
		//SetUnhandledExceptionFilter(HookFunc);
		
		DWORD OldProt = 0;
		VirtualProtect((void*)origAddress, system_info.RegionSize, system_info.Protect | PAGE_GUARD, &OldProt); // изменяю в оригинальной странице защиту на PAGE_GUARD, чтобы вылезло исключение.
		break;
			
	}
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}


Теперь, я делаю инжект этой DLL в процесс, а программа просто зависает. Вот видео на YouTube -https://www.youtube.com/watch?v=DjZc7gn8rhE&featur...
  • Вопрос задан
  • 256 просмотров
Пригласить эксперта
Ответы на вопрос 1
@menkar3
Код не запускал, могу ошибаться.
1. Скорее всего, у вас произошло что-то вроде:
  1. Вся страница памяти защищена PageGuard
  2. Летит исключение STATUS_GUARD_PAGE_VIOLATION не с адреса 0x116F3
  3. VectoredExceptionHandler возвращает EXCEPTION_CONTINUE_SEARCH

2. Саму copyAddress нужно сделать исполняемой через VirtualProtect (а лучше сразу выделить через VirtualAlloc с PAGE_EXECUTE_READWRITE)
3. Вы копируете страницу не с начала, а с инструкции push 1388.
Получаем что-то вроде (1:54 на видео):
="MEMORY PAGE"=
... push 1388
... call ...
... cmp ...
... call ...
EB C7 jmp ...
...
===============
Т.е. все будет хорошо ровно до момента, когда управление доходит до джампа (переход на следующую итерацию цикла while). Смотрим на двухбайтные джампы и ожидаемо видим, что это скачок назад - т.е. куда-то до push 1388, с которой вы начали копировать. Джампы относительные, так что управление было бы передано куда-то в мусорную память.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы