winapi:hook
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
다음 판 | 이전 판 | ||
winapi:hook [2012/04/20 19:52] – 바깥 편집 127.0.0.1 | winapi:hook [2024/04/23 22:43] (현재) – 바깥 편집 127.0.0.1 | ||
---|---|---|---|
줄 1: | 줄 1: | ||
+ | < | ||
+ | 이게 아직도 되려나?? | ||
+ | |||
+ | ====== 훅 Hook ====== | ||
+ | |||
+ | * [[http:// | ||
+ | * 메시지, | ||
+ | |||
+ | ====== hook chains ====== | ||
+ | |||
+ | * 훅은 종류별로 나누어져 있다. | ||
+ | * 종류별로 훅체인을 유지 | ||
+ | * 훅 체인은 콜백함수(Hook Procedure)의 포인터 리스트. | ||
+ | * 각 메시지는 훅 체인에 연결된 함수들을 차례대로 거치게 된다. | ||
+ | * 훅에 종류에 따라 모니터링만 가능한 것도 있다. | ||
+ | * 이런 훅은 다음 훅프로시져를 부르지 않아도, 자동으로 시스템이 다음 훅프로시져로를 사용한다. | ||
+ | * 메시지 조작이 가능한 경우, 다음 체인으로 가는 것을 막을 수도 있다. | ||
+ | |||
+ | ====== Hook Procedures ====== | ||
+ | |||
+ | * [[http:// | ||
+ | * HookProc는 아래 형식을 사용해야 함<code cpp> | ||
+ | LRESULT CALLBACK HookProc( | ||
+ | int nCode, | ||
+ | WPARAM wParam, | ||
+ | LPARAM lParam | ||
+ | ) | ||
+ | { | ||
+ | // process event | ||
+ | //... | ||
+ | return CallNextHookEx(NULL, | ||
+ | } | ||
+ | </ | ||
+ | ===== HookProc의 파라미터 ===== | ||
+ | * nCode : 훅코드. 훅코드는 훅 종류에 따라 메시지가 틀려진다 | ||
+ | * wParam / lParam : 뭐 당근 | ||
+ | ===== HookProc의 특성 ===== | ||
+ | * SetWindowsHookEx 로 훅을 설치하면, | ||
+ | * CallNextHookEx 를 호출함으로 다음번 훅 체인의 함수가 실행된다. | ||
+ | * 모니터링만 가능한 훅의 경우, CallNextHookEx를 호출하지 않아도 다음 차례의 훅이 실행된다. | ||
+ | * GlobalHook 은 모든 쓰레드에 훅을 건다. | ||
+ | * 모든 쓰레드에서 임의 호출되도록 dll 타입으로 제작된다. | ||
+ | |||
+ | ====== Hook Types ====== | ||
+ | |||
+ | ===== WH_CALLWNDPROC and WH_CALLWNDPROCRET ===== | ||
+ | * 윈도우즈 프로시져에 넘어가는 메시지를 모니터링할 수 있도록 훅을 건다. | ||
+ | * WH_CALLWNDPROC 는 프로시져가 불리기 전에 호출 | ||
+ | * WH_CALLWNDPROCRET 는 프로시져에서 메시지를 처리한 후에 호출 | ||
+ | * CWPRETSTRUCT 구조체를 파라미터로 넘긴다. 이 구조체는 메시지 사용후 변경된 값이 들어가 있다. | ||
+ | * 참고 | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | ==== WH_CBT ==== | ||
+ | * 시스템 콜에 관련된 메시지 | ||
+ | * 윈도우 활성/ | ||
+ | * 시스템 커맨드가 완료되기 전 | ||
+ | * 마우스, | ||
+ | * 입력 포커스가 가기 전 | ||
+ | * 시스템 메시지가 동기화 되기 전 | ||
+ | * 이 훅의 리턴값은, | ||
+ | ==== WH_DEBUG ==== | ||
+ | * 다른 훅을 부르기 전에 호출된다. 훅 디버깅을 위한 훅 | ||
+ | ==== WH_FOREGROUNDIDLE ==== | ||
+ | * 훅을 설치한 어플리케이션이 idle 상태가 되면 호출한다. | ||
+ | ==== WH_GETMESSAGE ==== | ||
+ | * GetMessage / PeekMessage가 리턴한 메시지를 모니터링한다. | ||
+ | ==== WH_JOURNALPLAYBACK ==== | ||
+ | * 어플리케이션이 시스템 메시지 큐에 임의의 메시지를 입력하도록 합니다. | ||
+ | * WH_JOURNALRECORD 가 저장한 입력 이벤트드를 다시 리플레이. | ||
+ | * global hook 이므로 dll로 제작 필요. 특정 쓰레드만 대상으로는 사용 불가. | ||
+ | ==== WH_JOURNALRECORD ==== | ||
+ | ==== WH_KEYBOARD_LL ==== | ||
+ | * 키보드 입력을 모니터링 | ||
+ | ==== WH_KEYBOARD ==== | ||
+ | * WM_KEYDOWN, WM_KEYUP 메시지를 모니터링. | ||
+ | * GetMessage / PeekMessage 함수의 리턴값 | ||
+ | ==== WH_MOUSE_LL ==== | ||
+ | ==== WH_MOUSE ==== | ||
+ | ==== WH_MSGFILTER , WH_SYSMSGFILTER ==== | ||
+ | * 메뉴, | ||
+ | * alt+tab, | ||
+ | * 키를 누른 시점을 안다는 것인지, 결과를 안다는것인지 모호 | ||
+ | * WH_MSGFILTER : 훅을 설치한 어플리케이션에서 실행된 어플리케이션을 모니터링 | ||
+ | * WH_SYSMSGFILTER : 모든 어플리케이션 모니터링 | ||
+ | ==== WH_SHELL ==== | ||
+ | * 새 윈도우가 생성되거나 삭제되는 경우의 이벤트를 모니터링 | ||
+ | * custom 쉘 어플리케이션은 WH_SHELL 메시지를 받지 않으므로 SystemParametersInfo 를 사용해서 새로운 쉘로 등록하기 전에 WH_SHELL을 처리할 수 있도록 해두어야 한다. | ||
+ | ===== Hook 범위 ===== | ||
+ | | Hook | Scope | | ||
+ | | WH_CALLWNDPROC | Thread or global | | ||
+ | | WH_CALLWNDPROCRET | Thread or global | | ||
+ | | WH_CBT | Thread or global | | ||
+ | | WH_DEBUG | Thread or global | | ||
+ | | WH_FOREGROUNDIDLE | Thread or global | | ||
+ | | WH_GETMESSAGE | Thread or global | | ||
+ | | WH_JOURNALPLAYBACK | Global only | | ||
+ | | WH_JOURNALRECORD | Global only | | ||
+ | | WH_KEYBOARD | Thread or global | | ||
+ | | WH_KEYBOARD_LL | Global only | | ||
+ | | WH_MOUSE | Thread or global | | ||
+ | | WH_MOUSE_LL | Global only | | ||
+ | | WH_MSGFILTER | Thread or global | | ||
+ | | WH_SHELL | Thread or global | | ||
+ | | WH_SYSMSGFILTER | Global only | | ||
+ | |||
+ | ====== Using Hooks ====== | ||
+ | * [[http:// | ||
+ | * 예제가 나와 있으므로 정리하지 않아도 될듯 |