본문 바로가기
Reversing

Dll Injection 03

by wlgpdnjs 2020. 5. 20.

3. SetWindowsHookEx

 

  • 후킹

     : 다른 프로세스에 걸려서(hooked) 해당 정보를 얻어오거나, 변경

 

메시지 훅

 

  • setWindowsHookEx()

      : setWindowsHookEx()은 프로세스에 훅을 설치하는 API로 프로세스에 dll을 삽입해 hook procedure를 호출한다. 이를 이용해 원하는 dll 삽입이 가능하다.

 

setWindowsHookEx()

 

1)  idHook

   : 설치될 hook 종류

 

2)  lpfn

   :  hook procedure(callback function)의 함수 포인터)

 

3)  hMod

   :  lpfm의 hook procedure이 포함된 DLL 인스턴스 핸들

 

4)  dwThreadId

   :  Thread ID, hook procedure 설치할 윈도우 값, 0일 때 전역 hook

 

 

 

HookMain.cpp

 

Injection01.exe

Keyboardhook.dll를 loadlibrary()를 이용하여 로딩한 후 GetProcAddress로  HookStart, HookStop의 주소를 얻어 1를 얻기 전까지 실행한다.

#include<stdio.h>
#include<conio.h>
#include<Windows.h>
#define DEF_DLL_NAME "keyHook_01.dll"
#define DEF_HOOKSTART "HookStart"
#define DEF_HOOKSTOP "HookStop"

typedef void(*PFN_HOOKSTART)();
typedef void(*PFN_HOOKSTOP)();

void main() {
	HMODULE hDll = NULL;
	PFN_HOOKSTART HookStart = NULL;
	PFN_HOOKSTOP HookStop= NULL;
	char ch = 0;

	hDll = LoadLibraryA(DEF_DLL_NAME);

	HookStart = (PFN_HOOKSTART)GetProcAddress(hDll, DEF_HOOKSTART);
	HookStop = (PFN_HOOKSTOP)GetProcAddress(hDll, DEF_HOOKSTOP);
	
	HookStart();

	printf("press 'q' to quit!\n");
	while (_getch() != 'q');

	HookStop();

	FreeLibrary(hDll);
}

 

 

 

 

KeyHook.cpp

 

HookStart를 보면 SetWindowsHookEx()를 이용해 원하는 dll을 삽입한다.

#include<stdio.h>
#include<Windows.h>

#define DEF_PROCESS_NAME "notepad.exe"

HINSTANCE g_hInstance = NULL;
HHOOK     g_hHook = NULL;
HWND  h_hWnd = NULL;

BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD dwReason, LPVOID lpvReserved) {
	switch (dwReason) {
	case DLL_PROCESS_ATTACH:
		g_hInstance = hinstDll;
		break;
		
	case DLL_PROCESS_DETACH:
		break;
	}
	return  TRUE;
}

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM    lParam) {
	char szPath[MAX_PATH] = { 0, };
	char *p = NULL;

	if (nCode = 0) {
		if (!(lParam & 0x80000000)) {
			GetModuleFileNameA(NULL, szPath, MAX_PATH);
			p = strrchr(szPath, '\\');

			if (!_stricmp(p + 1, DEF_PROCESS_NAME))
				return 1;
		}
	}
		return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}


#ifdef __cplusplus
extern "C" {
#endif
	__declspec(dllexport)void HookStart() {
		g_hHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, g_hInstance, 0);
	}
	__declspec(dllexport)void HookStop() {
		if (g_hHook) {
			UnhookWindowsHookEx(g_hHook);
			g_hHook = NULL;
		}
	}
#ifdef __cplusplus
}
#endif

 

HookMain.exe 실행화면

 

notepad.exe에 keyook_01.dll 로딩

 

notepad.exe 에서 후킹되서 사용자 키보드 입력 무시

 

'Reversing' 카테고리의 다른 글

Dll Injection 02  (0) 2020.05.18
Dll Injection 01  (0) 2020.05.18
[python] base64 모듈을 이용한 custom base64  (0) 2018.11.23
닷지 게임 패치  (0) 2018.01.21
피카츄배구  (0) 2018.01.21