概述:VirtualProtect 函数的说明和使用
说明
VirtualProtect 函数主要用于改变内存地址所在页的页属性。
BOOL VirtualProtect(
LPVOID lpAddress,
DWORD dwSize,
DWORD flNewProtect,
PDWORD lpflOldProtect
); 各参数的意义为:
lpAddress,要改变属性的内存起始地址。
dwSize,要改变属性的内存区域大小。
flNewProtect,内存新的属性类型,设置为PAGE_EXECUTE_READWRITE(0x40)时该内存页为可读可写可执行。
pfLOLdProtect,内存原始属性类型保存地址。
修改内存属性成功时函数返回非0,修改失败时返回0。
如果我们能够按照如下参数布置好栈帧的话就可以将shellcode所在内存区域设置为可执行模式。
示例
如下所示为 Hook 虚函数,并使其调用自己的函数。在改写调用之前使用了 VirtualProtect 函数对相关内存区域的属性进行了修改。
#include <iostream>
#include <windows.h>
class Base {
public:
virtual void Print() {
printf("gyarmy.com\n");
}
};
void hookPrint() {
printf("hook_gyarmy\n");
}
int main(int argc, char* argv[])
{
Base* pb = new Base();
//关键定位虚表的位置
DWORD* pVtAddr = (DWORD*)*(DWORD*)pb;
DWORD dwOldProtect = 0;
VirtualProtect(pVtAddr, 4, PAGE_EXECUTE_READWRITE, &dwOldProtect);
*pVtAddr = (DWORD)hookPrint;
pb->Print();
delete pb;
return 0;
}