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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.03.2012, 23:48   #1
nls
Пользователь
 
Регистрация: 25.12.2011
Сообщений: 20
По умолчанию Простой хук

В общем, пытаюсь сделать что-то вроде простого хука.

Вот полный исходный код dll:

Код:
#include <Windows.h>

class Hook
{
public:
	void NOP(DWORD* dwaddress, DWORD dwlen);
	void JMP(DWORD* dwaddress, DWORD* dwyouraddress, DWORD dwlen);
	
};

void Hook::NOP(DWORD* dwaddress, DWORD dwlen)
{
		DWORD dwOldProtect;
		VirtualProtect((void*)dwaddress, dwlen, PAGE_EXECUTE_READWRITE, &dwOldProtect);
		BYTE *pAddie = (BYTE*)dwaddress;
		*pAddie = 0x90;
		
		for(DWORD i = 0x1; i < dwlen; i++)
				*(pAddie + i) = 0x90;
			
		VirtualProtect((void*)dwaddress, dwlen, dwOldProtect, NULL);
}

void Hook::JMP(DWORD* dwaddress, DWORD* dwyouraddress, DWORD dwlen)
{
	DWORD dwOldProtect;
	DWORD dwRealAddie = (DWORD)dwyouraddress - (DWORD)dwaddress  - 5;
	VirtualProtect((void*)dwaddress, dwlen, PAGE_EXECUTE_READWRITE, &dwOldProtect);
	
	BYTE* pAddie = (BYTE*)dwaddress;
	*pAddie = 0xE9;
	pAddie++;
	dwaddress = (DWORD*)pAddie;
	*dwaddress = dwRealAddie;
	
	for(DWORD i = 0x4; i < dwlen; i++)
		*(pAddie + i) = 0x90;
	
	VirtualProtect((void*)dwaddress, dwlen, dwOldProtect, NULL);
}


// Вот эту функцию надо прохукать
DWORD WINAPI Hacks(LPVOID)
{
        MessageBox(0,0,0,0);

	return 0;
}


bool R2H()
{
    if ( GetModuleHandleA("CShell.dll") != NULL && GetModuleHandleA("ClientFx.fxd") != NULL )
        return TRUE;

    return FALSE;
}


DWORD WINAPI Wait(LPVOID)
{
    while ( ! R2H() )Sleep(200);

    CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Hacks, 0, 0, 0);

    return 0;
}

// Dll main
BOOL WINAPI DllMain ( HMODULE hModule, DWORD dwReason, LPVOID lpReserved )
{
	if ( dwReason == DLL_PROCESS_ATTACH )
	{
		DisableThreadLibraryCalls(hModule);

		CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Wait, 0, 0, 0);
	}
	
	return TRUE;
}
Комментарий автора кода:
To implement it you simply declare a variable of type Hook and then use the functions like so:

Код:
Hook hook;
hook.NOP((DWORD*)(address), (how_many_bytes_to_nop));
hook.JMP((DWORD*)(address), (DWORD*)(your function), (how many bytes));
Note that in order to use the JMP method you need to do it in a spot with atleast 5 bytes because the JMP is 0xE9 (1-byte) then the address of your function which is 4 bytes.

Не совсем понятно что нужно указывать вместо adress, но, как я понял сама идея хука сводится к
- Нахождению оригинальной точки входа функции
- Сохранением начальных байт
- Записью кода, передающего управление на другую функцию
- Выполнению кода функции
- Восстановлению начальных байт

Мб не совсем правильное понимание, но пофиг. Видел примеры перехвата api-функций, где для нахождения адреса функции использовалась функция GetProcAdress(), но к моей задаче такое, видимо, не подойдет.

Говоря конкретней, мне нужно "прохукать" вот этот поток (функцию):

DWORD WINAPI Hacks(LPVOID)
{
MessageBox(0,0,0,0);

return 0;
}

Не пойму как использовать hook.NOP и hook.JMP. Ну с your function понятно, а что делать с address?

В общем, у кого есть время гляньте на вышеприведенный код.
nls вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
хук на GetOpenFileName shadow_shaman Win Api 5 23.01.2011 15:21
Хук Умед Общие вопросы Delphi 3 23.07.2010 13:49
Хук и потоки Murzilka153 Общие вопросы C/C++ 0 16.10.2009 11:59
Сервис и хук francyz26rus Win Api 0 19.08.2009 13:51
хук rpy3uH Win Api 0 30.10.2006 20:47