逆向之虚函数


#include <iostream>
#include<Windows.h>

class CObj
{
public:
	virtual void show()
	{
		printf("CObj::show()\n");
	}
	virtual void show2()
	{
		printf("CObj::show2()\n");
	}
};

void show2()
{
	printf("outSideShow2()\n");
}

int main()
{
	CObj obj;
	CObj* pobj = &obj;

	LPVOID funAddr = 0;
	DWORD lpf101Protect = 0;

	_asm
	{
		mov eax, [pobj]; //	obj的首地址-->虚函数表的地址
		mov eax, [eax];  // 再解引用一次-->得到第一个虚函数的地址
		add eax, 0x4;
		mov funAddr, eax; //将虚函数的地址赋值给变量以便下面进行代码区权限更改
		push eax; //下面调用VirtualProtect肯定会更改eax寄存器的值
	}

	if (funAddr)
	{
		VirtualProtect(funAddr, 0x4, PAGE_EXECUTE_READWRITE, &lpf101Protect); //改代码区的权限
	}

	_asm
	{
		pop eax; //还原eax寄存器的值
		mov edx, show2;
		mov[eax], edx;
	}

	if (funAddr)
	{
		VirtualProtect(funAddr, 0x4, lpf101Protect, &lpf101Protect); //还原代码区的权限
	}

	pobj->show2();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值