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