C++修改虚函数表

#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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值