VMT
Code:
class VMT
{
public:
VMT(PDWORD* ppdwClassBase)
{
this->m_ClassBase = ppdwClassBase;
for (int i = 0; i < 400; i++)
if (reinterpret_cast<signed int*>(ppdwClassBase)[i])
method_count++;
m_OldVT = new DWORD[method_count];
memcpy(m_OldVT, ppdwClassBase, sizeof(DWORD) * method_count);
m_NewVT = new DWORD[method_count];
memcpy(m_NewVT, ppdwClassBase, sizeof(DWORD) * method_count);
}
void HookVTBL(DWORD dwNewFunc, size_t iIndex)
{
m_NewVT[iIndex] = dwNewFunc;
this->AddToArray(iIndex);
}
template<typename Fn>
Fn GetOriginalFunction(size_t methodIndex)
{
return reinterpret_cast<Fn>(m_OldVT[methodIndex]);
}
void UnHook()
{
for (int i = 0; i < this->patchcount; i++)
{
DWORD dwAddress = (DWORD)this->m_ClassBase + (sizeof(DWORD) * vtblindexes[i]);
*(DWORD*)dwAddress = this->m_OldVT[vtblindexes[i]];
}
}
void Hook()
{
for (int i = 0; i < this->patchcount; i++)
{
DWORD dwAddress = (DWORD)this->m_ClassBase + (sizeof(DWORD) * vtblindexes[i]);
*(DWORD*)dwAddress = this->m_NewVT[vtblindexes[i]];
}
}
protected:
int patchcount = 0;
int vtblindexes[100];
void AddToArray(int iIndex)
{
vtblindexes[patchcount] = iIndex;
patchcount += 1;
}
private:
PDWORD* m_ClassBase;
PDWORD m_NewVT, m_OldVT;
size_t method_count = 0;
};
Declare
Code:
VMT* ILTCSBase;
using End3DFn = unsigned int(__cdecl*)(unsigned int);
using FlipScreenFn = unsigned int(__cdecl*)(unsigned int);
using IntersectSegment = bool(__cdecl*)(CIntersectQuery& rQuery, CIntersectInfo *rInfo);
Class
Code:
class ILTCSBase : public ICLTClient
{
public:
ICLTClient*, GetICLTClient
public:
static ILTCSBase* Instance()
{
return (ILTCSBase*)0x11B3890;
}
};
Hook
Code:
ILTCSBase = new VMT((DWORD**)ILTCSBase::Instance());
ILTCSBase->HookVTBL((DWORD)MyRemoteKill, 31);
ILTCSBase->HookVTBL((DWORD)MyFlipScreen, 45);
ILTCSBase->HookVTBL((DWORD)MyEnd3D, 56);
ILTCSBase->Hook();
Code:
bool MyRemoteKill(CIntersectQuery *iQuery, CIntersectInfo *qInfo)
{
// do your job
return ILTCSBase->GetOriginalFunction<IntersectSegment>(31)(*iQuery, qInfo);
}
unsigned int __cdecl MyFlipScreen(unsigned int flags)
{
// draw your stuff
return ILTCSBase->GetOriginalFunction<FlipScreenFn>(45)(flags);
}
unsigned int __cdecl MyEnd3D(unsigned int flags)
{
// draw your stuff
return ILTCSBase->GetOriginalFunction<End3DFn>(56)(flags);
}
END
HIT THANKS