SetWindowsHookEx()
HHOOK SetWindowsHookEx(
int idHook // hook type
HOOKPROC lpfn // hook procedure
HINSTANCE hMod // hook procedure가 속해있는 DLL 핸들
DWORD dwThreadId // hook을 걸고 싶은 thread의 ID
)
SetWindowsHookEx()는 어떤 프로세스에 해당 메시지 발생시 운영체제가 DLL을 해당 프로세스에 강제 인젝션, 등록된 Hook procedure를 호출.
1) idHook는 hook procedure의 타입을 나타냄
2) lpfn은 hook procedure의 주소를 나타냄
3) hMod는 hook procedure를 포함한 DLL의 핸들을 나타냄
4) dwThreadId는 hook을 걸 thread의 ID값 (데스크톱 앱에서 이 값이 0이라면, 데스크톱의 실행중인 모든 존재하는 스레드에 대하여 걸어버림)
procedure ; 프로시저
http://www.terms.co.kr/procedure.htm
훅 프로시저 참고 : http://soen.kr/lecture/win32api/lecnew/11-3-2.htm
KeyboardProc()
LRESULT CALLBACK KeyboardProc(
int code // HC_ACTION(0), HC_NOREMOVE(3)
WPARAM wParam // virtual-key code
LPARAM lParam // extra information
)
keyboardProc()은 SetWindowsHookEx 함수와 같이 사용됨
어플리케이션이 GetMessage나 PeekMessage함수를 호출하거나 키보드 메시지가 있을 때 호출됨
HOOKPROC 형은 이 callback 함수의 포인터로 정의됨
키보드 입력값을 받아서 SetWindowsHookEx()로 반환해주는 역할
1) code는 메시지가 프로세스 되는 방법을 정의하기 위해 쓰임.
0인경우 wParam, lParam은 키스트로크 메시지에 대한 정보를 포함
3인경우 0인경우와 같으나 메시지큐에서 메시지를 지우지 않음
2)wParam은 키스트로크 메시지 생성시 키의 virtual-key code
3)lParam은 repeat count, scan code등 다양한 값을 가짐 (msdn 문서 참조)
리턴타입은 LRESULT (long과 같으나, 반환형임을 강조하기 위해 사용함)
code가 0보다 작다면 hook procedure는 CallNextHookEx에 의해 반환되어져야만 함
code가 0이거나 0보다 크고, hook procedure가 메시지에 프로세스하지 않았다면, CallNextHookEx를 호출하거나, 반환값을 반환하는 것을 추천함
hook procedure가 메시지에 프로세스 했다면 시스템이 훅체인의 나머지나 타겟 윈도우 프로시저로 메시지를 넘기는 것을 막기위해 0이 아닌 값을 반환 할 수도 있음
https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms644984(v=vs.85).aspx
'[ IT ] > 리버싱' 카테고리의 다른 글
API 후킹 - API 코드 패치 동작 원리 (0) | 2015.11.29 |
---|---|
hInstance와 imagebase (0) | 2015.11.28 |
프로세스 핸들과 PID의 차이, getprocaddress() (0) | 2015.11.28 |
리버싱 4장 API 정리 (0) | 2015.11.28 |