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