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