HOOK
HOOK是用来获取,更改程序执行时的某些数据,或者用于更改程序执行流程的一种技术
INLINE HOOK
直接修改函数的代码
虚函数表的HOOK
在c++中虚函数的继承会生成一个虚函数表,来确定父类指针指向子类对象时所需要调用的具体的方法,用以实现多态。那么可不可以像静态方法一样直接调用类中的虚函数呢,答案是可行的
虚函数表在内存中的分布
大致原理如下:
实验
这里我用的是vs2017,new出来的读了虚函数表可以hook,局部变量的对象时硬编码没有用虚函数表不能hook
class CTest
{
public:
virtual void myPrint();
};
void CTest::myPrint()
{
std::cout << "my print" << std::endl;
}
void hookPrint()
{
std::cout << "hook print" << std::endl;
}
int main()
{
CTest* pTest = new CTest;
unsigned int* pVTable = (unsigned int*)pTest;
pVTable = (unsigned int*)(*pVTable);
DWORD dwOldProct = 0;
BOOL bRet = ::VirtualProtect(pVTable, 4, PAGE_READWRITE, &dwOldProct);
pVTable[0] = (unsigned int)hookPrint;
pTest->myPrint();
delete pTest;
}