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); 
}