본문 바로가기

High Level Technique/Reversing

Windows Massage Hooking

Hook 이라는 단어는 고리, 걸이, 바늘 등의 뜻을 가지고 있습니다.


Hook 이라는 말은 리버싱을 하면서 어떤 뜻으로 사용되나면 중간에 정보를 가로채는 것으로 사용됩니다.



간단히 설명하자면 키보드가 눌릴때 WM_KEYDOWN 메시지가 말생합니다. 이 메세지에 의해서 프로그램에서 키보드가 눌렸다라는 것을 알려주죠.

이러한 메세지를 중간에 가로채는것을 Hooking이라고 합니다.


Win32 API나 MFC를 해보셨다면 Window Massage에 대해서 조금은 아실 겁니다.




Massage Hooking은 SetWindowsHookEx()라는 API를 이용해 간단히 구현할 수 있습니다.


SetWindowsHookEx()의 원형은 다음과 같습니다.




msdn에서 각 인자 값에 대한 설명은 다음과 같습니다.


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


간단히 설명하자면,


idHook: 훅의 타입을 설정합니다.

lpfn: 훅 프로시져, 운영체제가 호출해주는 콜백 함수. DLL 내부에 존재해야 하며, 그 DLL의 인스턴스 핸들이 hMod.

hMod: 훅 프로시져가 속해있는 DLL 핸들

dwThreadId: 훅을 걸고 싶은 thread의 ID 입니다.




소스 코드


Hooker.cpp




GetProcAddress의 반환형이 FARPROC 입니다. FARPROC으로 반환되는 값이 함수 포인터인데, DLL이 없거나 해당 DLL에서 기능을 제공하지 않는 경우가 있기 때문에

함수 포인터로 받습니다.






InputKeyHook.cpp





hinstDll: DLL의 인스턴스 핸들. 파일 이미지가 매핑된 가상 메모리 주소 값.


fdwReason: DLL_PROCESS_ATTACH, DLL_PROCESS_DETACH, DLL_THREAD_ATTACH, DLL_THREAD_DETACH 값 중 하나를 갖는다.


lpvReserved: fdwReason이 DLL_PROCESS_ATTACH인 경우 DLL이 명시적 런타임 링크 방식 로드면 NULL, 암시적 로드타임 링크 방식 로드면 NULL이 아님.

             DLL_PROCESS_DETACH인 경우 FreeLibrary가 호출되었거나 DLL로드가 실패하면 NULL, 프로세스가 종료 중이면 NULL이 아님.



extern "C" : C++ 방식의 링크과정을 사용하지 않고 C 방식의 링크를 사용한다고 컴파일러에게 알려준다.



__declspec(dllexport): 정의된 함수를 외부에서 사용할 수 있는 형태로 만들겠다는 말.


※ Hooking이 제대로 동작하지 않았던 이유가 있었습니다. 이것 때문에 하루종일 삽질만 했네요;;


빌드 할 때 빌드 설정을 바꿔줘야 합니다. 기본적인 빌드 설정은 win32 방식으로 컴파일 하는데, 64비트 운영체제에서는 64bit 프로그램이 작동하므로 컴파일 또한 64비트로 해주어야 합니다.


.exe 파일과 .dll 파일 모두 x64로 컴파일 해주어야 합니다.


프로젝트 선택 - 오른쪽 마우스 - 속성 - 구성관리자 - 플랫폼 - x64 로 변경하면 정상적으로 작동합니다.








디버깅


※ OllyDBG는 64bit 디버깅 하지 못하기 때문에 X64DBG를 이용합니다.


X64DBG.7z.001


X64DBG.7z.002



7z로 압축푸신 후 사용하시면 됩니다.

'High Level Technique > Reversing' 카테고리의 다른 글

DLL Ejection  (0) 2016.07.08
DLL Injection  (0) 2016.07.06
.reloc section 제거  (1) 2015.12.21
PE 재배치 (PE Relocation)  (0) 2015.12.21
EAT (Export Address Table)  (0) 2015.12.21