개발환경은 Windows XP 빌더6 패치2 입니다. CPU III 800EB 256MB
호환환경은 Window 기반의 모든 운영체제입니다.
98이상의 운영체제만 호환으로 타겟을 잡았다면.. ㅡ.ㅡ; 이리 어렵진 않으실겁니다.
한번 읽어보시는것도 어떠실런지
오늘은 10월 31일 키후킹은 못했지만 방법은 알아낸듯싶습니다.
그리고 제가 처리한 방법은 키후킹이 아니구요 캬캬
추가 설명좀 드리겠습니다.
WM_KEYBOARD나 WM_MOUSE 는 시스템 큐에서 나온 멧시지입니다.
큐에서 나오면서 SendKey를 통해 운영체제에 이미 전달되어버렸답니다. ㅡ_ㅡ 이런~
그럼 이제 방법은 값을 받은 OS가 헤당 처리를 하기위해서 다시 또 멧시지를 보내게될때 그놈을 잡는거죠 ( 잡아라~ ㅡ_ㅡa )
이게 제가 쓴방법이죵 ㅡ_ㅡa 다른방법은 아마도 이놈들일것같습니다.
1. WH_JOURNALPLAYBACK Hook
2. WH_JOURNALRECORD Hook
CBT 후킹입니다.
모든 멧시지죠. 네트웍에서 전송받았다거나 기타 등등 모든 그 모든 멧시지입니다.
점점 윈도우 내부가 궁금해지는군요 ㅡ0ㅡ; 참고로 윈도우는 모든게 멧시지도 돌아가더군요
ㅡ.ㅡ; 수많은 멧시지들이 있구요 ㅡ.ㅡ;
DLL 코딩 부분입니다.
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
//---------------------------------------------------------------------------
HHOOK KhHook;
extern "C" __declspec(dllexport) LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode < 0)
return(CallNextHookEx(WKhHook, nCode, wParam, lParam));
switch(nCode)
{
case HCBT_SYSCOMMAND :
return (long) true;
}
return (long) true;
}
위 그대로 DLL을 만들어 컴파일하시면 됩니다.
한가지 추가하자면 nCode가 0보다 작으면 반듯이 해당값으로 CallNextHookEx를 호출해줘야된다는겁니다. 반듯이~
위 HCBT_SYSCOMMAND로 전달되는 내용들은 MSDN에서 참고하시기 바랍니다. (많아엽 ㅡ.ㅡ;)
이제 프로그램부분 코딩입니다.
HHOOK hHookKey;
HINSTANCE KhinstDLL;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
KhinstDLL = LoadLibrary((LPCSTR)"..//Keybd.dll");
if(KhinstDLL == NULL)
{
ShowMessage("DLL Load Error");
return;
}
HOOKPROC KeyboardProc =(HOOKPROC) GetProcAddress(KhinstDLL, "CBTProc");
hHookKey = SetWindowsHookEx(WH_CBT, (HOOKPROC) KeyboardProc, KhinstDLL, 0);
}
에공.. 소스 끝입니다. ㅡ0ㅡ;; 하나가 남았네요 보여드리기 전에 설명
SetWindowsHookEx함수를 보시면 다른 것들이랑 틀린것이 하나 있는데요 바로
WH_CBT입니다. 별거 없죠? ㅡ0ㅡ; 다시 말씀드리자면
다시 말씀드리지만 시스템 큐에서 SendKey로 나온녀석들을 처리하기위해 보내지는 멧시지를 가로채는겁니다.
마지막 소스입니다.
void __fastcall TForm1::Button3Click(TObject *Sender)
{
UnhookWindowsHookEx(hHookKey);
FreeLibrary(KhinstDLL);
}
//---------------------------------------------------------------------------
전보다 좀 간단해졌습니다. 중요내용이 좀 포함됬구요 ㅋㅋ
ㅡ.ㅡ; 암튼 인제 후킹은 지겹습니다 ㅡ.ㅡ;;
|