Posted March 10, 200718 yr since sx started posting tutorials around this sector i decided to slap some of my tuts over here :wavey: its prettymuch finished i guess, you can: Hook vtable Unhook vtable ( on the fly! ) here is the code in full: #include "stdafx.h" #include <windows.h> class CVTableHook{ public: void UnprotectPage( void* addr ); void RestorePage( ); DWORD Create( DWORD* dwClass, int iMember, DWORD dwHook ); bool Destroy( bool bRemoveHook ); bool Unhook( void ); bool ReHook( void ); ///////////////////////////////////////////////////////// int iClassMember; DWORD* dwClassPointer; DWORD dwHookFunction; DWORD dwOriginal; MEMORY_BASIC_INFORMATION mbi; bool bIsHooked; }; #include "stdafx.h" #include <windows.h> #include <string.h> #include <stdio.h> #include "vtable.h" #include "LTFXMenu.h" void CVTableHook::UnprotectPage( void* addr ) { VirtualQueryEx( GetCurrentProcess( ), addr, &mbi, sizeof( mbi ) ); VirtualProtectEx( GetCurrentProcess( ), mbi.BaseAddress, mbi.RegionSize, PAGE_EXECUTE_READWRITE, &mbi.Protect ); } void CVTableHook::RestorePage( ) { VirtualProtectEx( GetCurrentProcess( ), mbi.BaseAddress, mbi.RegionSize, mbi.Protect, &mbi.Protect ); } DWORD CVTableHook::Create( DWORD* dwClass, int iMember, DWORD dwHook ) { if( bIsHooked )return dwOriginal; UnprotectPage( ( void* )&dwClass[iMember] ); dwOriginal = *( DWORD* )&dwClass[iMember]; *( DWORD* )&dwClass[iMember] = dwHook; if( *( DWORD* )&dwClass[iMember] == ( DWORD )dwHook ) { dwHookFunction = dwHook; iClassMember = iMember; dwClassPointer = dwClass; bIsHooked = true; } RestorePage( ); return dwOriginal; } bool CVTableHook::Unhook( void ) { if( !bIsHooked )return false; bool bRet = false; UnprotectPage( ( void* )&dwClassPointer[iClassMember] ); *( DWORD* )&dwClassPointer[iClassMember] = dwOriginal; if( *( DWORD* )&dwClassPointer[iClassMember] == ( DWORD )dwOriginal )bRet = true; RestorePage( ); if( bRet )bIsHooked = false; return bRet; } bool CVTableHook::ReHook( void ) { if( bIsHooked )return false; bool bRet = false; UnprotectPage( ( void* )&dwClassPointer[iClassMember] ); *( DWORD* )&dwClassPointer[iClassMember] = ( DWORD )dwHookFunction; if( *( DWORD* )&dwClassPointer[iClassMember] == ( DWORD )dwHookFunction )bRet = true; RestorePage( ); if( bRet )bIsHooked = true; return bRet; } bool CVTableHook::Destroy( bool bRemoveHook ) { if( !bIsHooked )return false; bool bRet = false; if( bRemoveHook ) { UnprotectPage( ( void* )&dwClassPointer[iClassMember] ); *( DWORD* )&dwClassPointer[iClassMember] = dwOriginal; if( bRemoveHook == true && *( DWORD* )&dwClassPointer[iClassMember] == dwOriginal ) { bRet = true; } RestorePage( ); if( bRet && bRemoveHook )bIsHooked = false; return bRet; } return bRet; } i have not tested it but if something is messed up ( i dont think so ) you can fix it using my tutorial on vtable hooks in the tutorials section. you may not post this elsewhere but may be linked to, and if you use it credit me.