본문으로 바로가기

리버싱 3장 API 정리

category [ IT ]/리버싱 2015. 11. 19. 20:38

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이라면, 데스크톱의 실행중인 모든 존재하는 스레드에 대하여 걸어버림)

리턴 타입은 HHOOK
함수 호출 성공시 hook procedure의 핸들값을 반환
함수 호출 실패시 NULL값을 반환, 에러 정보는 GetLastError를 호출하여 확인 가능

https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms644990(v=vs.85).aspx


procedure ; 프로시저

  1. 프로그래밍에서, 프로시저는 루틴이나, 서브루틴 및 함수와 같은 뜻이다. 하나의 프로시저는 특정 작업을 수행하기 위한 프로그램의 일부이다.
  2. 일반적인 의미의 프로시저란, 어떤 행동을 수행하기 위한 일련의 작업 순서를 말한다.

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