101 lines
1.5 KiB
C++
101 lines
1.5 KiB
C++
#pragma once
|
|
#include "pch.h"
|
|
class VTHook
|
|
{
|
|
public:
|
|
VTHook()
|
|
{
|
|
memset( this, 0, sizeof( VTHook) );
|
|
}
|
|
|
|
VTHook( PDWORD64* ppdwClassBase )
|
|
{
|
|
bInitialize( ppdwClassBase );
|
|
}
|
|
|
|
~VTHook()
|
|
{
|
|
UnHook();
|
|
}
|
|
void ClearClassBase()
|
|
{
|
|
m_ClassBase = NULL;
|
|
}
|
|
bool bInitialize( PDWORD64* ppdwClassBase )
|
|
{
|
|
m_ClassBase = ppdwClassBase;
|
|
m_OldVT = *ppdwClassBase;
|
|
m_VTSize = GetVTCount( *ppdwClassBase );
|
|
m_NewVT = new DWORD64[ m_VTSize ];
|
|
memcpy( m_NewVT, m_OldVT, sizeof( DWORD64) * m_VTSize );
|
|
*ppdwClassBase = m_NewVT;
|
|
return true;
|
|
}
|
|
|
|
bool bInitialize( PDWORD64** pppdwClassBase ) // fix for pp
|
|
{
|
|
return bInitialize( *pppdwClassBase );
|
|
}
|
|
|
|
void UnHook()
|
|
{
|
|
if( m_ClassBase )
|
|
{
|
|
*m_ClassBase = m_OldVT;
|
|
}
|
|
}
|
|
|
|
void ReHook()
|
|
{
|
|
if( m_ClassBase )
|
|
{
|
|
*m_ClassBase = m_NewVT;
|
|
}
|
|
}
|
|
|
|
int iGetFuncCount()
|
|
{
|
|
return ( int )m_VTSize;
|
|
}
|
|
|
|
DWORD64 GetFuncAddress( int Index )
|
|
{
|
|
if( Index >= 0 && Index <= ( int )m_VTSize && m_OldVT != NULL )
|
|
{
|
|
return m_OldVT[ Index ];
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
PDWORD64 GetOldVT()
|
|
{
|
|
return m_OldVT;
|
|
}
|
|
|
|
DWORD64 HookFunction( DWORD64 dwNewFunc, unsigned int iIndex )
|
|
{
|
|
if( m_NewVT && m_OldVT && iIndex <= m_VTSize && iIndex >= 0 )
|
|
{
|
|
m_NewVT[ iIndex ] = dwNewFunc;
|
|
return m_OldVT[ iIndex ];
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
private:
|
|
DWORD64 GetVTCount( PDWORD64 pdwVMT )
|
|
{
|
|
DWORD64 dwIndex = 0;
|
|
|
|
while (IsBadCodePtr((FARPROC)pdwVMT[dwIndex]) == false) {
|
|
dwIndex++;
|
|
}
|
|
return dwIndex;
|
|
}
|
|
|
|
PDWORD64* m_ClassBase;
|
|
PDWORD64 m_NewVT, m_OldVT;
|
|
DWORD64 m_VTSize;
|
|
};
|