3. SetWindowsHookEx
- 후킹
: 다른 프로세스에 걸려서(hooked) 해당 정보를 얻어오거나, 변경
- setWindowsHookEx()
: setWindowsHookEx()은 프로세스에 훅을 설치하는 API로 프로세스에 dll을 삽입해 hook procedure를 호출한다. 이를 이용해 원하는 dll 삽입이 가능하다.
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
'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 |