#include<cstdio>
#include<Windows.h>
class cobj
{
public:
int a = 1;
virtual void show()
{
printf("虚函数\n");
}
void fun1()
{
printf("成员函数\n");
}
};
void show2()
{
printf("外部函数\n");
}
int main()
{
cobj obj;
LPVOID funaddr = 0;
DWORD lpprotect0 = 0;
cobj* pobj = &obj;
_asm
{
mov eax, [pobj]; //首先,pobj是一个指针变量,是变量就会有地址。对这个地址解引用,获得里面所存的内容,也即obj的地址
mov eax, [eax]; //对类的地址再次解引用,因为里面有虚函数,因此这个类所存的第一个内容就是虚函数表
mov funaddr, eax;
push eax;
}
if (funaddr)
{
VirtualProtect(funaddr, 0x4, PAGE_EXECUTE_READWRITE, &lpprotect0);//虚函数表的内存被保护起来了,但没关系,我们强制修改掉
//该函数用法问文心一言
}
_asm
{
pop eax;
mov edx, show2; //show2是内存,因为函数储存在text段
mov[eax], edx; //把show2的地址赋值给虚函数表地址解引用后的第一个内容
}
pobj->show();
}
C++修改虚函数表
最新推荐文章于 2024-09-28 15:28:59 发布