逆向之虚函数


#include 
#include

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;
}

你可能感兴趣的:(逆向工程,安全,c++)