#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;

 

    // KeyHook.dll 로딩
 hDll = LoadLibraryA(DEF_DLL_NAME);


    if( hDll == NULL )
    {
        printf("LoadLibrary(%s) failed!!! [%d]", DEF_DLL_NAME, GetLastError());
        return;
    }

 

    // export 함수 주소 얻기
 HookStart = (PFN_HOOKSTART)GetProcAddress(hDll, DEF_HOOKSTART);
 HookStop = (PFN_HOOKSTOP)GetProcAddress(hDll, DEF_HOOKSTOP);

 

    // 후킹 시작
 HookStart();

 

    // 사용자가 'q' 를 입력할 때까지 대기
 printf("press 'q' to quit!\n");
 while( _getch() != 'q' ) ;

 

    // 후킹 종료
 HookStop();
 
    // KeyHook.dll 언로딩
 FreeLibrary(hDll);
}

 

 

----------------------------------------------------------------------------------------------------------------

HookMain.exe 파일의 소스코드(HookMain.cpp) 분석

 

1. LoadLibraryA(DEF_DLL_NAME);

- 프로세스에서 Dll을 로드 할때 사용하는 함수

 

HMODULE WINAPI LoadLibrary(

_In_ LPCTSTR lpFileName

);

-> lpFileName : Dll 파일의 이름

 

 

 

2. (PFN_HOOKSTART)GetProcAddress(hDll, DEF_HOOKSTART); 

- 함수의 주소를 얻어 올때 사용하는 함수

 

 

FARPROC GetProcAddress(
    HMODULE hModule,
    LPCSTR lpProcName
);

-> hModule : 찾고자 하는 함수를 가진 모듈의 핸들값 
-> lpProcName : 찾고자 하는 함수 이름

 

3. FreeLibrary(hDll);

 

- 로드되어 있는 DLL 을 언로드(해제)할때 사용하는 함수

(로드된 DLL은 모두 1이상의 값으로 설정된 자신의 사용계수를 가진다. FreeLibrary 함수는 사용계수를 감소시키는 역할만한다. 시스템은 사용계수가 0이 되면 그제서야 실제로 해당 DLL을 해제하게 된다.)

0

 

BOOL FreeLibrary(HMODULE hModule);

-> hModule : 해제할 모듈의 핸들값



 

 

 

+ Recent posts