#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;
}
逆向之虚函数
于 2024-01-11 22:52:06 首次发布