Windows ๋ฉ์์ง ํํน
Hookmain.cpp
//HookMain.cpp
#include "stdio.h"
#include "conio.h"
#include "windows.h"
#define DEF_DLL_NAME "KeyHook.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);
}
01) Preprocessor - ์ ์ฒ๋ฆฌ
#include "stdio.h"
#include "conio.h"
#include "windows.h"
#define DEF_DLL_NAME "KeyHook.dll"
#define DEF_HOOKSTART "HookStart"
#define DEF_HOOKSTOP "HookStop"
[#include "HeaderName"]
HookMain.cpp์์ ์ฌ์ฉ๋๋ ํจ์๋ค๊ณผ ๊ทธ ํจ์๊ฐ ์ ์๋ ํค๋ํ์ผ์
๋๋ค.
stdio.h: printf()
conio.h: _getch()
windows.h: LoadLibraryA(), GetProcAddress(), FreeLibrary()
#define DEF_DLL_NAME "KeyHook.dll"
#define DEF_HOOKSTART "HookStart"
#define DEF_HOOKSTOP "HookStop"
[#define identifier token-string]
#define ์ง์๋ฌธ์ ํตํด ์ปดํ์ผ๋ฌ๋ ๋ชจ๋ identifier๋ฅผ token-string์ผ๋ก ๋์ฒดํฉ๋๋ค.
์์ ์ฝ๋์ฒ๋ผ, #define DEF_DLL_NAME "KeyHook.dll" ์ด๋ผ๋ ์ ์ฒ๋ฆฌ ์ง์๋ฌธ์ ์๋ก ๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
์ปดํ์ผ ํ ์ฝ๋ ๋ด ๋ชจ๋ DEF_DLL_NAME์ "KeyHook.dll" ์ด๋ผ๋ ๋ฌธ์์ด๋ก ๋์ฒด๋์ด ๋์ค๊ธฐ ๋๋ฌธ์, hDll = LoadLibraryA(DEF_DLL_NAME); ์ด๋ผ๋ ๊ตฌ๋ฌธ์ ํ์ hDll = LoadLibraryA("KeyHook.dll"); ๋ก ๋ฐ๋๊ฒ ๋๋ ๊ฒ์
๋๋ค.
[ํ์ค์์ฝ]
#include "ํค๋ํ์ผ" => ํค๋ํ์ผ ๋งํฌ
#define A B => ์ฝ๋ ๋ด ๋ชจ๋ A๋ ์ปดํ์ผ ์ B๋ก ๋ฐ๋
02) typedef - ํ์ ์ ์
typedef void(*PFN_HOOKSTART)();
typedef void(*PFN_HOOKSTOP)();
[typedef type-specifier identifier;]
typedef๋ ๊ธฐ์กด ํ์์ ๋์์ด๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ง์ ํ ์ ์๋ ํ์์ ์ด๋ฆ์ ๋ง๋ญ๋๋ค.
๋ง์ด ์ข ์ด๋ ค์ด๋ฐ, type-specifier์๊ฒ identifier๋ผ๋ ๋ณ์นญ์ ๋ถ์ฌ์ฃผ๋ ๊ฒ๋๋ค.
// ↓ ๋ฐํ๊ฐ ์๋ฃํ
typedef void (*PFN_HOOKSTART)(); // PFN_HOOKSTART๋ฅผ ํจ์ ํฌ์ธํฐ ๋ณ์นญ์ผ๋ก ์ ์
// ↑ ํจ์ ํฌ์ธํฐ ๋ณ์นญ
์ ์ฝ๋์์๋ ๋ฐํ๊ฐ ์๋ฃํ์ด void์ธ (๋ฐํ ์๋ฃํ์ด ์๋) ํจ์ ํฌ์ธํฐ์๊ฒ PFN_HOOKSTART๋ผ๋ ๋ณ์นญ์ ๋ถ์ฌ์คฌ์ต๋๋ค. ์ด๋ฌํ ๋ฐฉ์์ void (*PFN_HOOKSTART)();๋ผ ์ผ์ผ์ด ์๋ฃํ์ ๋ช
์ํด์ผ ํ๋ full pointer type ์ ์ฌ์ฉ์ ์ค์ด๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค. ์งฑ์งฑ.
[ํ์ค์์ฝ]
typedef ์๋ฃํ (*๋ณ์นญ)(์ธ์ ํ์
, ์ธ์ ํ์
...); => ํจ์ ๋ณ์นญ์ผ๋ก ํจ์ ํฌ์ธํฐ ์ ์ธ ๊ฐ๋ฅ(ํธํจ)
03-0) main - ๋ณ์ ์ ์
HMODULE hDll = NULL;
PFN_HOOKSTART HookStart = NULL;
PFN_HOOKSTOP HookStop = NULL;
char ch = 0;
HMODULE: dll์ ์ธ์คํด์ค ํธ๋ค์
๋๋ค. dll ํ์ผ ์ด๋ฏธ์ง๊ฐ ๋งคํ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ์
๋๋ค.
(์ถ์ฒ: ์๊น๋ฝ์ ํ๋ก๊ทธ๋๋ฐ ์ด์ผ๊ธฐ)
์ด ํ์
์ ๋ณ์๋ ํ์ GetProcAddress()์ ์ฒซ๋ฒ์งธ ์ธ์๋ก ๋ค์ด๊ฐ๋๋ค.
PFN_HOOKSTART์ PFN_HOOKSTOP ์๋ฃํ์ ๋ณ์๊ฐ ๊ฐ๊ฐ ์ ์ธ๋ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ, ์์ typedef ๊ตฌ๋ฌธ์ผ๋ก ๋ฏธ๋ฃจ์ด๋ณด์ ์ด๋ ๊ทธ๋ฅ voidํ ํจ์ ํฌ์ธํฐ๋ฅผ ์ ์ธํ๋ค๊ณ ๋ณด์๋ ๋ฌด๊ดํฉ๋๋ค.
๊ฐ ๋ณ์์ ์ฐ์์ ๋ํด ์ ๋ฆฌํ์๋ฉด..
hDll: LoadLibraryA()๋ฅผ ํตํด "KeyHook.dll"์ ํธ๋ค ๊ฐ์ ๊ฐ๊ฒ ๋จ, GetProcAddress() ์ ์ฒซ ์ธ์๋ก ์ฐ์
HookStart: KeyHook.dll ๋ด์ HookStart() ํจ์๋ฅผ ๊ฐ๋ฆฌํค๋ ํจ์ ํฌ์ธํฐ
HookStop: KeyHook.dll ๋ด์ HookStop() ํจ์๋ฅผ ๊ฐ๋ฆฌํค๋ ํจ์ ํฌ์ธํฐ
ch: ??
03-1) main - LoadLibraryA()
hDll = LoadLibraryA(DEF_DLL_NAME);
DEF_DLL_NAME (์ปดํ์ผ์ ๊ฑฐ์น๋ฉฐ "KeyHook.dll"๋ก ๋ณ๊ฒฝ) ์ด๋ผ๋ DLL์ ๋ก๋ํ๊ณ , hDll์ "KeyHook.dll"์ ๋ํ ํธ๋ค ๊ฐ์ ์ค๋๋ค.
03-2) main - GetProcAddress
HookStart = (PFN_HOOKSTART)GetProcAddress(hDll, DEF_HOOKSTART);
HookStop = (PFN_HOOKSTOP)GetProcAddress(hDll, DEF_HOOKSTOP);
๋จผ์ GetProcAddress๋ผ๋ ํจ์๋ฅผ ์ดํด๋ณด๋๋ก ํฉ์๋ค. (msdn์ ์ฌ๊ธฐ)
FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName);
์ํ์ ์ด๋ ๊ฒ ์๊ฒผ์ต๋๋ค.
์ฒซ ์ธ์ hModule์๋ LoadLibraryA()์ ๋ฐํ ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
๋ ๋ฒ์งธ ์ธ์ lpProcName๋ ์ฐพ์ ํจ์ ์ด๋ฆ ์ ๋๋ก ์๊ฐํฉ์๋ค.
์ด ํจ์๋ export ํจ์ ์ฃผ์๋ฅผ ์ป๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
GetProcAddress()๋ก ํจ์ ์ฃผ์๋ฅผ ์ป์ด์ค๊ธฐ ์ํด์๋ ์ ์ ํ ํ ๋ณํ์ ๊ฑฐ์ณ์ผ ํฉ๋๋ค.
์์์๋ PFN_HOOKSTART/PFN_HOOKSTOP ํ์
์ผ๋ก ํํ๋ฅผ ๋ณํํฉ๋๋ค.
(์ด๋ ์๊น typedef์์ ๋ช
์๋์๋ฏ voidํ ํจ์ํฌ์ธํฐ๋ก ์๊ฐํ์
๋ ๋ฌด๊ดํฉ๋๋ค.)
dll์ ๋ก๋ํ๊ณ , ๋ก๋๋ dll ๋ด์์ ์ฌ์ฉํ ํจ์์ ์ฃผ์๋ฅผ ๊ตฌํ์ผ๋ ์ด์ ํจ์๋ฅผ ์ฌ์ฉํ ์ผ๋ง ๋จ์์ต๋๋ค.
03-2) main - export ํจ์ ์ฌ์ฉ
HookStart();
printf("press 'q' to quit!\n");
while(_getch() != 'q');
HookStop();
FreeLibrary(hDll);
PFN_HOOKSTART ํ์ ํจ์ ํฌ์ธํฐ HookStart()๋ ์์ ๊ณผ์ ์ ๊ฑฐ์ณ ๊ตฌํ KeyHook.dll์ HookStart ํจ์๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
HookStart()๋ฅผ ํธ์ถํด ํํน์ ์์ํฉ๋๋ค.
while(_getch() != 'q'); ๋ถ๋ถ์ ๋ด
์๋ค.
๊ฐ๋จํ๊ฒ, q๋ฅผ ์
๋ ฅํ์ง ์์ผ๋ฉด HookStart() ํจ์๊ฐ ๋๋์ง ์๋๋ค๋ ์๋ฏธ์
๋๋ค.
('q'๋ฅผ ์
๋ ฅํ๋ฉด while๋ฌธ ์๋์ HookStop() ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.)
๋ง์ฐฌ๊ฐ์ง๋ก KeyHook.dll ๋ด HookStop() ํจ์์ ์ฃผ์๋ฅผ ๋ด๊ณ ์๋ PFN_HOOKSTOP ํ์ ํจ์ ํฌ์ธํฐ HookStop()์ ํธ์ถํฉ๋๋ค. (์ด ํจ์๋ ํํน์ ์ค๋จํ๋ ์ญํ ์ ํฉ๋๋ค.)
ํํน์ ์ข
๋ฃํ ํ, ๋ก๋ํ KeyHook.dll์ ์ธ๋ก๋ ํ๊ธฐ ์ํด FreeLibrary() ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
FreeLibrary()์ ์ธ์๋ก๋ ์ธ๋ก๋ ํ dll์ ํธ๋ค ๊ฐ์ ๋๊ฒจ์ฃผ๋ฉด ๋ฉ๋๋ค.
(LoadLibrary() ํธ์ถ๋ก ์ป์ ๋ฐํ ๊ฐ์ FreeLibrary() ์ธ์๋ก ๋ฃ์ด์ฃผ๋ฉด ํด์ ํ ์ ์์ต๋๋ค.)
๋ค์์ผ๋ก๋ KeyHook.dll (KeyHook.cpp) ์ ์ฝ๋๋ฅผ ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฒ์์๋ ๋ค์ ๋ณต์กํ๋ค๊ณ ๋๋ ์ ์์ผ๋, ์ฐจ๊ทผ์ฐจ๊ทผ ํด์ํด๋ณธ๋ค๋ฉด ์ ํ ์ด๋ ต์ง ์์ต๋๋ค.
KeyHook.cpp (KeyHook.dll)
//KeyHook.cpp
#include "stdio.h"
#include "windows.h"
#define DEF_PROCESS_NAME "notepad.exe"
HINSTANCE g_hInstance = NULL;
HHOOK g_hHook = NULL;
HWND g_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 ) { //bit 31: 0 = key press, 1 = key release
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
dll์ด ๋ก๋๋๋ฉด ๊ฐ์ฅ ๋จผ์ DllMain()์ด ํธ์ถ๋๋ฏ๋ก dll injection์ด ๊ฐ๋ฅํด์ง๋๋ค.
01) Preprocessor - ์ ์ฒ๋ฆฌ
#include "stdio.h"
#include "windows.h"
#define DEF_PROCESS_NAME "notepad.exe"
[#include "HeaderName"]
stdio.h ์ windows.h ํค๋ํ์ผ์ ํฌํจํด์ค๋๋ค.
[#define identifier token-string]
์ปดํ์ผ์ ๊ฑฐ์น๋ฉฐ ์ฝ๋ ๋ด ๋ชจ๋ DEF_PROCESS_NAME์ "notepad.exe"๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค.
02) ๋ณ์ ์ ์
HINSTANCE g_hInstance = NULL;
HHOOK g_hHook = NULL;
HWND g_hWnd = NULL;
์์ํ ์๋ฃํ์ด ๊ฝค๋ ๋ณด์
๋๋ค.
HINSTANCE(Handle Instance): ํ๋ก๊ทธ๋จ์ ์ธ์คํด์ค ์๋ณ์(ํธ๋ค)
HHOOK: Hook ํธ๋ค, ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด Hook Chain์ ์ฒซ ํ
ํธ๋ค์๊ฒ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ๊ณ , ๊ฐ ํ
์ ๋ค์ ํ
์ ํธ์ถํ์ฌ Chain์ ์๋ ๋ชจ๋ ํ
ํ๋ก์์ ๋ฅผ ํธ์ถํจ
HWND: (Handle Windows): ์๋์ฐ์ ํธ๋ค ๋ฒํธ, HINSTANCE๋ ์ธ์คํด์ค(์คํ์ค์ธ ์ฐฝ)์ ํธ๋ค์ ๊ฐ์ง๋ง HWND๋ ์๋์ฐ ์์ฒด์ ํธ๋ค์ ๊ฐ๋๋ค๋ ์ฐจ์ด๊ฐ ์์
๋ณ์์ ์ฐ์์ ์ถ๋ ค๋ณธ๋ค๋ฉด
g_hInstance: ํ
ํ๋ก์์ ๊ฐ ์ํด ์๋ dll ํธ๋ค์ ๊ฐ๊ฒ ๋๋ฉฐ, ํ์ SetWindowsHookEx()์ ์ธ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌ๋จ
g_hHook: SetWindowsHookEx() ํจ์์ ๋ฆฌํด ๊ฐ(์ฒ๋ฆฌ ์ค์ธ ํ
ํธ๋ค)์ ๊ฐ๊ณ CallNextHookEx()์ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌ๋จ
g_hWnd: ??
03) DllMain()
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; }
DllMain ํจ์์ ์ธ์๋ถํฐ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
hinstDLL: dll์ด ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๋งคํ๋์์ ๋์ ํธ๋ค(dll์ ์ธ์คํด์ค ํธ๋ค)
dwReason: dll์ด ํธ์ถ๋ ์ด์ (ํ์ด๋ฐ)
ex) DLL_PROCESS_ATTACH: dll์ด ํ๋ก์ธ์ค์ ์ฃผ์ ๊ณต๊ฐ์ ๋งคํ๋์์ ๋
DLL_PROCESS_DETACH: dll์ด ํ๋ก์ธ์ค์ ์ฃผ์ ๊ณต๊ฐ์์ ํด์ ๋์์ ๋
์ด ์ธ์๋ DLL_THREAD_ATTACH, DLL_THREAD_DETACH๊ฐ ์์
lpvReserved: ํจ์๊ฐ ์ด๋ dll์ ์ํด์๋์ง ๋ฐํ์ง ์๊ณ ์ฌ์ฉํ ์ TRUE, ๋ฐํ๊ณ ์ฌ์ฉํ ์ FALSE
DllMain ํจ์์ ์ฝ๋๋ฅผ ๊ฐ๋ตํ๊ฒ ์ค๋ช
ํ์๋ฉด
dll์ด ํ๋ก์ธ์ค์ ์ฃผ์ ๊ณต๊ฐ์ ๋งคํ๋์์ ๋๋ g_hInstance์๊ฒ dll์ ์ธ์คํด์ค ํธ๋ค์ ๋๊ฒจ์ฃผ๊ณ , dll์ด ํ๋ก์ธ์ค์ ์ฃผ์ ๊ณต๊ฐ์์ ํด์ ๋์์ ๋๋ ๊ทธ๋ฅ switch๋ฌธ์ ๋น ์ ธ๋์ TRUE ๊ฐ์ ๋ฐํํ๋ ๊ฒ์
๋๋ค.
03) LRESULT CALLBACK KeyboardProc()
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { char szPath[MAX_PATH] = {0, }; char *p = NULL; if( nCode >= 0 ) { //bit 31: 0 = key press, 1 = key release 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); }
ํค๋ณด๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์์ ๋ ์ฒ๋ฆฌ ๋ฐฉ์์ ๊ฒฐ์ ํ๋ ํจ์์
๋๋ค.
CALLBACK์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ฏธ๋ฃจ์ด๋ณด์, ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ๋ค์ด๊ฐ๋ค๋ ๊ฑธ ์ ์ ์์ต๋๋ค.
nCode: ํ
ํ๋ก์์ ๊ฐ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ๋ ๋ฐ ์ฌ์ฉํ๋ ์ฝ๋, ์ด ๊ฐ์ด 0๋ณด๋ค ์์ผ๋ฉด CallNextHookEx()๋ก ๋ค์ ํ
์ ๋ฉ์์ง๋ฅผ ์ ๋ฌํจ
wParam: ์ด ์ฝ๋์์๋ virtual-key code๋ก ์ฌ์ฉ๋จ
lParam: ์ถ๊ฐ ์ ๋ณด, ์ฌ๊ธฐ์๋ ํค press ์ฌ๋ถ๋ฅผ ํ๋จํ๊ธฐ ์ํด ์ฌ์ฉ๋จ
szPath: ํ์ฌ ์คํ์ค์ธ ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ๋ด์
p: strrchr()์ ๋ฆฌํด ๊ฐ, szPath์ ๋ชจ๋ ์ด๋ฆ์์ '\\'์ ๋ท ๋ถ๋ถ๋ง์ ๋ด์
์ฝ๋๋ฅผ ๊ฐ๋จํ๊ฒ ํด์คํ์๋ฉด...
nCode๊ฐ 0๋ณด๋ค ์์ผ๋ฉด CallNextHookEx()๋ก ๋ฉ์์ง๋ฅผ ํ
์ฒด์ธ์ ๋ค์ ํ
์ผ๋ก ์ ๋ฌํฉ๋๋ค.
nCode๊ฐ 0๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๋ค๋ฉด, ๊ทธ๋ฆฌ๊ณ ํค๊ฐ ๋๋ ค ์์ ๋ (lParam์ 31๋ฒ์งธ ๋นํธ์ ์ด์ ๊ดํ ์ ๋ณด๊ฐ ์๋๋ฐ, ์ด๋ฅผ 0x80000000์ AND ์ฐ์ฐ์ ๊ฑฐ์ณ ์์๋ผ ์ ์์, 0 = pressed, 1 = released) GetModuleFileNameA()๋ก szPath ๋ณ์์ ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ๋ด์์ค๋๋ค. ํ์ strrchr ํจ์๋ฅผ ํตํด ํฌ์ธํฐ p์ '\ํ์ผ์ด๋ฆ'์ด๋ผ๋ ๋ฌธ์์ด์ด ๋ค์ด๊ฐ๋๋ค. ์๋๋ ๊ฒฝ๋ก ์ฒ๋ฆฌ ๊ณผ์ ์ ์ดํด๋ฅผ ๋๊ธฐ ์ํ ์์ ์
๋๋ค.
๋ณด์๋ค์ํผ, strrchr ํจ์๋ก ๊ฒฝ๋ก๋ฅผ ๊ฐ๊ณตํ์์๋ ํ์ผ ์ด๋ฆ ์์ \์ด ๋ถ์ด ๋์ค๋ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
๋ญ ๊ทธ๋์, ๋ค์ ์ค์ p+1์ ํฌ์ธํฐ ์ฐ์ฐ์ ํตํด \ ๋ฌธ์๋ฅผ ์ ๊ฑฐํ ์์ ํ์ผ ์ด๋ฆ๋ง ๋จ๊ฒผ๋๋ฐ.. ์ด๊ฒ DEF_PROCESS_NAME("notepad.exe")์ ๊ฐ๋ค๋ฉด 1์ ๋ฆฌํดํฉ๋๋ค. if๋ฌธ์ ์กฐ๊ฑด์ ํ๋๋ผ๋ ๋ถํฉํ์ง ์๋๋ค๋ฉด, CallNextHookEx()๋ก ๋ฉ์์ง๋ฅผ ๋ค์ ํ
์๊ฒ ๋๊น๋๋ค.
04) HookStart(), HookStop()
#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
#ifdef __cplusplus
extern "C" {
#endif
.
.
.
#ifdef __cplusplus
}
#endif
์ ์ฝ๋๋ C++ ์ปดํ์ผ๋ฌ์๊ฒ ์ด๋ฌํ ํ์ ์ฌ์ด์ ๊ตฌ๋ฌธ์ C ๋ฌธ๋ฒ์ ์ ์ฉํด ์ปดํ์ผ ํ๋ผ๊ณ ์๋ ค์ฃผ๋ ์ญํ ์ ํฉ๋๋ค. ๊ทธ๋์ ์ด๊ฒ ์ ํ์ํ๊ฐ? C++์ ์ถ์ํ ๊ฐ๋
๋๋ฌธ์ ๊ทธ๋ ๋ค๊ณ ํฉ๋๋ค.
KeyHook.cpp์ C++๋ก ์์ฑ๋ ๊ฒ์ด์ง๋ง ์ด ๋ถ๋ถ๋ง์ C์ ๋ฌธ๋ฒ์ ์ ์ฉํด ์ปดํ์ผ ๋ฉ๋๋ค.
HookStart()๋ถํฐ ๋ด
์๋ค.
__declspec์ ํจ์์ ๋ํ ์ ๋ณด๋ฅผ ๋ํ๋ด๋ ์ ์ธ๋ฌธ์
๋๋ค.
__declspec(dllexport)๋ ์ ์๋ ํจ์๊ฐ dll์์ export ๋๋ ํจ์๋ผ๋ ๋ป์
๋๋ค.
๊ธฐ์ตํ์ค์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์์ HHOOK ํ์
์ g_hHook ๋ณ์๋ SetWindowsHookEx()์ ๋ฆฌํด ๊ฐ(ํ
ํธ๋ค)์ ๊ฐ๋๋ค๊ณ ๋ง์๋๋ ธ์ต๋๋ค. ์ํผ ๊ทธ๋์ g_hHook์ ํ
ํธ๋ค์ ๊ฐ๊ฒ ๋ฉ๋๋ค.
HHOOK SetWindowsHookExA( int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId );
์ํ์ ์ด๋ ๊ฒ ์๊ฒผ์ต๋๋ค.
idHook: ํํนํ ํ์
, ์ ์ฝ๋์ WH_KEYBOARD๋ฅผ idHook์ผ๋ก ์ฃผ์์ผ๋ฏ๋ก ํค๋ณด๋๋ฅผ ํํนํ ๊ฒ์
lpfn: ํ
ํ๋ก์์ ์ ํจ์ ํฌ์ธํฐ. ์๊น ์ดํด๋ณธ KeyboardProc์ lpfn์ผ๋ก ๋๊ฒจ์ ์
hmod: lpfn์ ํํน ํจ์๊ฐ ๋ค์ด์๋ ๋ชจ๋์ ์ฃผ์. ์ธ์๋ก g_hInstance๊ฐ ๋์ด๊ฐ๋๋ฐ, ์ด g_hInstance๋ DllMain()์ด DLL_PROCESS_ATTACH๋ก ์คํ๋์์ ๋ hinstDLL ๊ฐ์ ๊ฐ์ง
dwThreadId: ํํนํ ๋์์ ์ค๋ ๋ id, ์ด ๊ฐ์ด 0์ด๋ผ๋ฉด ๋ฐ์คํฌํ์ ๋ชจ๋ ์ค๋ ๋๋ฅผ ํฌํจํ๋ ์ ์ญ ํํน์ด ์ด๋ฃจ์ด์ง๋ค.
์ด๋ ๊ฒ ํด์ notepad.exe์ ๋ฉ์์ง ํํน์ด ์ด๋ฃจ์ด์ง๋๋ค.
๊ธ์ ์ถํ์ ๋ ์ ๋ฆฌํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
'reverse engineering' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[PE ํ๋กํ ํฐ ์ ์] PE ํ์ฑํ๊ธฐ (0) | 2023.12.17 |
---|---|
[Anti-Reversing] Anti Disassembly ๊ตฌํ (0) | 2022.08.15 |
[Anti-Reversing] IsDebuggerPresent() ๊ตฌํ (4) | 2022.08.09 |
[RCE] PE file format (1) (0) | 2021.05.02 |
Bank Robbery ๋ฌธ์ ํ์ด ๋ณด๊ณ ์ (2) | 2021.01.23 |