//?頭文件
//?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
);
}