www.pudn.com > 2007071212243513681.rar > ApiHook.cpp
#include "stdafx.h"
#include "ApiHook.h"
CApiHook::CApiHook()
{
m_hProc = NULL;
m_hMod = NULL;
::InitializeCriticalSection(&m_cs);
}
CApiHook::~CApiHook()
{
::CloseHandle(m_hProc);
m_hProc = NULL;
if ( m_hMod )
::FreeLibrary(m_hMod);
::DeleteCriticalSection(&m_cs);
}
void CApiHook::ReHook()
{
DWORD dwOldProtect;
if ( ::VirtualProtectEx(m_hProc, m_lpHookFunc, 5, PAGE_EXECUTE_READWRITE, &dwOldProtect) )
{
::WriteProcessMemory(m_hProc, m_lpHookFunc, m_NewFunc, 5, 0);
::VirtualProtectEx(m_hProc, m_lpHookFunc, 5, dwOldProtect, &dwOldProtect);
}
}
void CApiHook::UnHook()
{
DWORD dwOldProtect;
if ( VirtualProtectEx(m_hProc, m_lpHookFunc, 5, PAGE_EXECUTE_READWRITE, &dwOldProtect) )
{
::WriteProcessMemory(m_hProc, m_lpHookFunc, m_OldFunc, 5, 0);
::VirtualProtectEx(m_hProc, m_lpHookFunc, 5, dwOldProtect, &dwOldProtect);
}
}
BOOL CApiHook::Initialize(LPCWSTR lpLibFileName, LPSTR lpProcName, FARPROC lpNewFunc)
{
DWORD dwOldProtect;
m_hMod = ::LoadLibraryW(lpLibFileName);
if ( !m_hMod )
return FALSE;
m_lpHookFunc = ::GetProcAddress(m_hMod, lpProcName);
if ( !m_lpHookFunc )
return FALSE;
m_hProc = ::GetCurrentProcess();
if ( !m_hProc )
return FALSE;
if ( ::VirtualProtectEx(m_hProc, m_lpHookFunc, 5, PAGE_EXECUTE_READWRITE, &dwOldProtect) )
{
if ( ::ReadProcessMemory(m_hProc, m_lpHookFunc, m_OldFunc, 5, 0) )
{
m_NewFunc[0] = 0xE9;
*(PDWORD)&m_NewFunc[1] = PtrToUlong(lpNewFunc) - PtrToUlong(m_lpHookFunc) - 5;
if ( ::WriteProcessMemory(m_hProc, m_lpHookFunc, m_NewFunc, 5, NULL) )
if ( ::VirtualProtectEx(m_hProc, m_lpHookFunc, 5, dwOldProtect, &dwOldProtect) )
return TRUE;
}
}
return FALSE;
}
void CApiHook::Lock()
{
::EnterCriticalSection(&m_cs);
}
void CApiHook::UnLock()
{
::LeaveCriticalSection(&m_cs);
}