유수입니다.
훅킹함수의 원형은 다음과 같습니다.
HHOOK SetWindowsHookEx(
int idHook, // type of hook to install
HOOKPROC lpfn, // address of hook procedure
HINSTANCE hMod, // handle of application instance
DWORD dwThreadId // identity of thread to install hook for
);
첫번째 인자는 훅킹할 타입을 나타내고,
두번째인자는 후킹 프로시져의 어드레스,
세번재인자는 DLL의 Instance핸들을,
네번째는 훅킹을 하려고 하는 쓰레드를 나타냅니다.
시스템 훅을 설치할 때는 3번째인자는 HInstace, 네번째인자는 0이 된다는
것은 아실겁니다.
질문하신 특정 쓰레드의 훅킹(태스크 훅이란 표현을 쓰겠습니다.) 에서는 이 인자
들이 달라집니다. (왜 그런지는 조금만 생각해 보심 아실 겁니다.^^;)
- 태스크 훅 시 -
1) 세번째 인자는 다음의 함수를 이용해 구해줍니다.
function GetModuleHandleFromInstance: THandle;
var
s: array[0..512] of char;
begin
{ 현재의 DLL인스턴스 값으로 부터 모듈(DLL 또는 EXE)의 화일명을 얻어내는 API }
GetModuleFileName(hInstance, s, sizeof(s)-1);
{ 모듈명으로 부터 모듈 핸들을 얻어 내는 API }
Result := GetModuleHandle(s);
end;
이것으로 DLL의 모듈 핸들을 얻어 낼수 있겠죠..
2) 네번째 인자로는 훅킹하기를 원하는 쓰레드의 쓰레드 ID가 들어가야 합니다.
어떤 프로그램이 자신을 훅킹하기 위해 훅킹 프로시져가 들어있는 DLL을 이용해
훅킹을 설치한다면, 이 네번째 인자로 자신의 쓰레드 ID를 넘겨주면 됩니다.
이 경우 해당 API함수는 GetCurrentThreadId입니다. 이 API함수는 자신의 쓰레드 ID
를 얻을 수 있습니다. 만약 특정한 프로그램의 쓰레드 ID를 얻기 위해선 언급해 주신
GetWindowThreadProcessId(
HWND hWnd, // handle of window
LPDWORD lpdwProcessId // address of variable for process identifier
);
를 이용해서 얻은 뒤 이 쓰레드 ID(+프로세스 ID)를 념겨주면 됩니다. 첫번째 인자는
윈도우 핸들이고, 두번째 인자는 Process ID가 저장될 변수의 주소입니다. 물론 첫번
째 인자의 윈도우 핸들은 FindWindow 등을 이용해서 얻을 수 있을 겁니다. 그리고,
GetWindowThreadProcessId 함수의 리턴값으로 해당 윈도우의 쓰레드 ID를 얻을 수
있습니다. 결국 이 얻어진 쓰레드 ID를 SetWindowsHookEx의 네번째 인자로 넘겨 주면
해당하는 특정한 프로그램의 훅킹을 할 수 있습니다.
저도 훅킹에 익숙하지 않은 터라 정확한 답변이 아닐 수 있습니다. 혹시 본 답변에
대한 의문사항이 있으시면 알려주세요. 좋은 생각님 도움이 되셨기를 바랍니다.
흐르는 물 유수~
|