BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
address_hook = (DWORD)hook;
DWORD old_prot = 0;
VirtualProtect((void*)address_two,6,PAGE_EXECUTE_R EADWRITE,&old_prot);
memcpy((void*)address_two,(PBYTE)SetHook,6);
VirtualProtect((void*)address_two,6,old_prot,&old_prot);
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
}
в данном примере я пытался хукнуть FindWindowW внутри функции ...
но при попытке вызова функции выдаёт ошибку:omg:
пытался восстонавливать регистры через простое копиривание их в переменные и при выполнении функции восстонавливать но там уже чуточку другая ошибка(leave я потом добавил) :nono:
Yukikaze
27.04.2013, 15:31
Это вы так сплайсингом хукаете?
Начнем с начала.
1. Нам нужно получить адрес оригинальной функции, где это у вас?
#include <Windows.h>
DWORD WINAPI Inject_Thread (LPVOID);
DWORD APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
CreateThread(NULL, NULL, Inject_Thread, NULL, NULL, NULL);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
default:
break;
}
return true;
}
DWORD WINAPI Inject_Thread (LPVOID)
{
DWORD dwFindWindow = GetProcAddress(GetModuleHandle("User32.dll"), "FindWindowW"); //получаем адрес оригинальной функции
ExitThread(0);
}
2. Трамплин и место приземления
#include <Windows.h>
DWORD WINAPI Inject_Thread (LPVOID);
DWORD APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
CreateThread(NULL, NULL, Inject_Thread, NULL, NULL, NULL);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
default:
break;
}
Пример: [Ссылки могут видеть только зарегистрированные и активированные пользователи]
Прошлый раз писал без IDE и не компилировал, поэтому допустил пару глупых ошибок, например
DWORD addr = (DWORD)hookFindWindow - (jmpAddr + 5);
а нужно было
DWORD addr = (DWORD)hookFindWindow - (dwFindWindow + 5);
В общем, работает
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Добавлено через 32 минуты
Можно сделать более элегантно, так сказать по C++'ному
detour.h
#ifndef DETOUR_H
#define DETOUR_H
class Detour
{
public:
Detour(void* lpTarget, void* lpHook);
~Detour();
void Apply();
void Remove();
bool IsApplied;
private:
char* bOriginal;
char* bHook;
void* lpTarget;
};
#endif // DETOUR_H