#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 : 해제할 모듈의 핸들값
'Reversing(리버싱 핵심 원리) > 소스코드 분석' 카테고리의 다른 글
Windows 메시지 후킹_keyHook.cpp(p295) (0) | 2018.06.25 |
---|