// 头文件
// ApiHook.h: interface for the CApiHook class.
//
//////////////////////////////////////////////////////////////////////
#ifndef
API_HOOK_H
#define
API_HOOK_H
class
CApiHook
{
public
:
HANDLE hProc
;
Unlock
();
Lock
();
BOOL Initialize
(
LPCTSTR lpLibFileName
,
LPCTSTR lpProcName
,
FARPROC lpNewFunc
);
void
SetHookOn
(
void
);
void
SetHookOff
(
void
);
CApiHook
();
virtual
~
CApiHook
();
protected
:
BYTE m_OldFunc
[
8
];
BYTE m_NewFunc
[
8
];
FARPROC m_lpHookFunc
;
CRITICAL_SECTION m_cs
;
};
#endif
// 实现文件
// ApiHook.cpp: implementation of the CApiHook class.
//
//////////////////////////////////////////////////////////////////////
#include
"stdafx.h"
#include
"ApiHook.h"
#include
<
stdio
.
h
>
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
#define
OPEN_FLAGS
(
PROCESS_VM_OPERATION
|
PROCESS_VM_READ
|
PROCESS_VM_WRITE
)
CApiHook
::
CApiHook
()
{
InitializeCriticalSection
(&
m_cs
);
}
CApiHook
::~
CApiHook
()
{
CloseHandle
(
hProc
);
DeleteCriticalSection
(&
m_cs
);
}
void
CApiHook
::
SetHookOn
(
void
)
{
DWORD dwOldFlag
;
if
(
WriteProcessMemory
(
hProc
,
m_lpHookFunc
,
m_NewFunc
,
5
,
0
))
{
return
;
}
MessageBox
(
NULL
,
"SetHookOn"
,
"fail"
,
MB_OK
);
return
;
}
void
CApiHook
::
SetHookOff
(
void
)
{
DWORD dwOldFlag
;
if
(
WriteProcessMemory
(
hProc
,
m_lpHookFunc
,
m_OldFunc
,
5
,
0
))
{
return
;
}
MessageBox
(
NULL
,
"SetHookOff"
,
"fail"
,
MB_OK
);
return
;
}
BOOL CApiHook
::
Initialize
(
LPCTSTR lpLibFileName
,
LPCTSTR lpProcName
,
FARPROC lpNewFunc
)
{
HMODULE hModule
;
hModule
=
LoadLibrary
(
lpLibFileName
);
if
(
NULL
==
hModule
)
return
FALSE
;
m_lpHookFunc
=
GetProcAddress
(
hModule
,
lpProcName
);
if
(
NULL
==
m_lpHookFunc
)
return
FALSE
;
DWORD dwProcessID
=
GetCurrentProcessId
();
DWORD dwOldFlag
;
hProc
=
GetCurrentProcess
(
/*OPEN_FLAGS,0,dwProcessID*/
);
if
(
hProc
==
NULL
)
{
MessageBox
(
NULL
,
"Initialize.OpenProcess"
,
"fail"
,
MB_OK
);
return
FALSE
;
}
if
(
ReadProcessMemory
(
hProc
,
m_lpHookFunc
,
m_OldFunc
,
5
,
0
))
{
m_NewFunc
[
0
]=
0xe9
;
DWORD
*
pNewFuncAddress
;
pNewFuncAddress
=(
DWORD
*)&
m_NewFunc
[
1
];
*
pNewFuncAddress
=(
DWORD
)
lpNewFunc
-(
DWORD
)
m_lpHookFunc
-
5
;
return
TRUE
;
}
MessageBox
(
NULL
,
"Initialize"
,
"fail"
,
MB_OK
);
return
FALSE
;
}
CApiHook
::
Lock
()
{
EnterCriticalSection
(&
m_cs
);
}
CApiHook
::
Unlock
()
{
LeaveCriticalSection
(&
m_cs
);
}