И снова про Хуки

  • Автор темы solova
  • Дата начала
S

solova

#1
Ну собсна вот и вопросы:
Что будет с хуком(DLL) если программу за каторой он следил выключили?
На сколько я понимаю DLL должна выгрузится из памяти или нет?
Можно ли тогда в DllMain в одном из(каком точно не знаю) case MessageBox вывести например?<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Для наглядности</div></div><div class="sp-body"><div class="sp-content">
C++:
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID /*lpReserved*/)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:hDll = hModule;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
 
S

solova

#3
Думаю сам хук тут значения не имеет но ладно вот коды<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Hook.cpp</div></div><div class="sp-body"><div class="sp-content">
C++:
#include "stdafx.h"
#include "hook.h"

BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID /*lpReserved*/)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:hDll = hModule;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
HOOK_API BOOL RemoveHook(void){
UnhookWindowsHookEx(hHook);
return TRUE;}
HOOK_API BOOL InstallHook(DWORD dwThrd){
hHook = SetWindowsHookEx(WH_GETMESSAGE,GetMsgProc,(HINSTANCE)hDll,dwThrd);
return TRUE;}
//////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wP,LPARAM lP)
{
if(nCode >= 0) //HC_ACTION
{
LPMSG msg = (LPMSG)lP;
if(wP==PM_REMOVE)
{
if((msg->message==WM_SYSCOMMAND)&&(LOWORD(msg->wParam)==57665))
{
MessageBox(hPwnd,L"WM_SYSCOMMAND",L"От Хука",MB_OK);
}
}
if((msg->message==WM_COMMAND)&&(LOWORD(msg->wParam)==57665))
{
MessageBox(hPwnd,L"WM_BUTTON",L"От Хука",MB_OK);
}
}
return CallNextHookEx(hHook,nCode,wP,lP);
}
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">hook.h</div></div><div class="sp-body"><div class="sp-content">
C++:
#ifdef HOOK_EXPORTS		//Определяем, функция импортируется или экспортируется
#define HOOK_API __declspec(dllexport) //Если экспортируется
#else
#define HOOK_API __declspec(dllimport)//Если импортируется
#endif
static HHOOK hHook = NULL;				//Дескриптор ловушки, глобальный
static HANDLE hDll = NULL;				//Дескриптор DLL
static DWORD dwThread = NULL;			//ID потока, к которому привязывается ловушка
HOOK_API BOOL InstallHook(DWORD dwThrd);
HOOK_API BOOL RemoveHook(void);	
LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam);
если не ошибаюсь как то с Thread-ами можно по издеваться
 
S

solova

#4
кстати я делал так<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Код</div></div><div class="sp-body"><div class="sp-content">
C++:
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID /*lpReserved*/)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:hDll = hModule;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:MessageBox(NULL,L"THREAD_DETACH",L"Target close");
case DLL_PROCESS_DETACH:MessageBox(NULL,L"PROCESS_DETACH",L"Target close");
break;
}
return TRUE;
}
и Мессадж выводился при выключении программы на которую хук(значит длл освобождается, первые два вопроса решены),но DllMain цыклился и постоянно слал эти месаджи.
Я не пробовал ,но если послать sendmessage, цыклится будет?
 

lazybiz

Well-known member
03.11.2010
1 339
0
#5
Так, погоди, давай по порядку. У тебя switch не верно организован. Меняй на этот:
C++:
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID /*lpReserved*/ )
{
switch ( ul_reason_for_call ) {
case DLL_PROCESS_ATTACH:
hDll = hModule;
break;

case DLL_THREAD_ATTACH:
break;

case DLL_THREAD_DETACH:
MessageBox( NULL, L"THREAD_DETACH", L"Target close" );
break;

case DLL_PROCESS_DETACH:
MessageBox( NULL, L"PROCESS_DETACH", L"Target close" );
break;
}
return TRUE;
}
Что теперь выводится при выключении программы? "THREAD_DETACH" или "PROCESS_DETACH" ?

DllMain цыклился и постоянно слал эти месаджи
Какие именно он сейчас шлет если циклится?

В общем суть в том что если Hook повешен глобально, то при завершении программы ничего не произойдет, если же Hook повешен на Thread то в свитче Dll сработает DLL_THREAD_DETACH.
Я себе это так представляю.
 
S

solova

#6
THREAD_DETACH - срабатывает с каким то интервалом сам по себе при этом Target виснет(но хук работает)
После нажатия ОК всё приходит в норму, но потом снова выскакивает окно.
При выключении THREAD_DETACH запускается где то 20 раз(по очереди) , при этом Target долго висит в процессах.
Потом всё таки Target вырубается и вылетает PROCESS_DETACH один раз.
Как я понял THREAD_DETACH не катит чтоб узнать о выключении.
Я убрал мессадж и теперь работает только PROCESS_DETACH (один раз).

попробую в место MessageBox наладить отправку sendmessage окну каторый запустил хук.
(что то sendmessage не работает но работал)