메시지 후킹
- 메시지후킹은 user32.dll의 SetWindowsHookExA()메서드를 이용한다. 윈도우는 키보드, 마우스 등에서 부터 들어오는 메시지를 훅 체인(Hook Chain)을 통해 처리한다.
* 훅체인 : 메시지를 처리하는 일련의 함수 포인터를 모아놓은 리스트
- 메시지 후킹의 대표적인 해킹기법은 키 로커(Key Logger)가 방식을 이용하여, 키보드의 입력 메시지를 중간에 가로채 해커에게 전송하는것.

*메시지 후킹
ctypes을 활용한 메시지 후킹
1.파이썬에서 윈도우 Win32 API활용하기
- 파이썬에서 윈도우 운영체제에서 제공하는 강력한 기능을 활용하려면 Win32 API를 활용해야 한다.

*외부 라이브러리 사용하는 파이썬
2. ctypes모듈의 기본개념
- ctypes는 동적 라이브러리 호출 절차를 단순화 하고, 복잡한 C데이터형을 지원하며, 로우레벨 함수를 제공하는 장점이 있다. ctypes활용해서 함수 호출 규약만 준수 하면 MSDN에서 제공하는 API직접호출 할 수 있다.

*ctypes 모듈
변수형 매핑 테이블
ctypes 형 |
C언어 |
python |
c_char |
char |
1-character string |
c_wchar |
wchar_t |
1-character unicode string |
c_byte |
char |
int / long |
c_ubyte |
unsigned char |
c_short |
short |
c_ushort |
unsigned short |
c_int |
int |
c_uint |
unsigned int |
c_long |
long |
c_ulong |
unsigned long |
c_longlong |
_int64혹은 long long |
c_float |
float |
float |
c_double |
double |
float |
c_char_p |
char * (NULL terminated) |
string 혹은 None |
c_wchar_p |
wchar_t * (NULL terminated) |
unicoe 혹은 None |
c_void_p |
void * |
int / long 혹은 None |
|
|
|
3.키보드 후킹
- user32.dll에서 제공하는 SetWindowsHookExA()함수를 사용하여 훅(Hook)을 설정할수 있다.
*훅(Hook) : 운영체제에서 메시지나 마우스 클릭, 키보드 입력과 같은 이벤트를 중간 가로채는 매커니즘을 제공

① 훅설정 : user32.dll의 SetWindowsHookExA() 함수를 통해 훅을 설정할 수 있고 메시지를 처리할 프로시저(콜백함수)를 등록 할 수 있다.
② 훅체인 등록 : 등록된 후 프로시저는 훅체인으로 관리되며 훅체인 의 맨 앞자리에 훅 프로시저의 포인터가 등록된다. 이제 키보드 입력 타입의 메시지가 해당 스레드 큐에 입력되기를 기다린다.
③ 키보드 입력 : 사용자는 키보드를 사용해서 원하는 메시지를 컴퓨터에 입력한다. 키보드에 컨트롤러가 컴퓨터가 인식할 수 있는 신호로 변환해서 키보드 드라이버로 전달한다.
④ 시스템 큐 : 키보드에서 들어온 메시지는 운영체제에서 관리하는 시스템큐로 입력되고 메시지처리를 담당하는 스레드 큐로 입력되는것을 기다린다.
⑤ 스레드 큐 : 메시지를 처리할 스레드 큐로 입력된 메시지는 해당 윈도우로 보내지 않고 훅 체인에서 관리되는 첫 번째 포인터에 해당하는 훅 프로시저로 보내진다.
⑥ 메시지 후킹 : 스레드 큐로부터 온 메시지는 훅 체인의 첫번째 항목에 있는 포인터로 전달 된다.
⑦ 훅 프로시저 : 훅 프로시저는 메시지를 받아 프로그래머가 지정한 동작을 수행한다. 대부분의 해킹 코드가 훅 프로시저에 기술된다. 작업이 종료되면 메시지를 훅 체인의 다음 포인터로 전달 한다. 콜백 함수라고도 불리기도 함.
⑧ 훅체인 포인터 : 훅 체인에 연결된 포인터에 해당하는 훅 프로시저에 차례대로 메시지를 전달한다. 마지막 훅 프로시저가 메시지를 처리한 후 최종적으로 원래 지정된 윈도우로 메시지를 전달 한다.