概述:VirtualProtect 函数的说明和使用
说明
VirtualProtect 函数主要用于改变内存地址所在页的页属性。
1 2 3 4 5 6
| BOOL VirtualProtect( LPVOID lpAddress, DWORD dwSize, DWORD flNewProtect, PDWORD lpflOldProtect );
|
各参数的意义为:
lpAddress,要改变属性的内存起始地址。
dwSize,要改变属性的内存区域大小。
flNewProtect,内存新的属性类型,设置为PAGE_EXECUTE_READWRITE(0x40)时该内存页为可读可写可执行。
pflOldProtect,内存原始属性类型保存地址。
修改内存属性成功时函数返回非0,修改失败时返回0。
如果我们能够按照如下参数布置好栈帧的话就可以将shellcode所在内存区域设置为可执行模式。
示例
如下所示为 Hook 虚函数,并使其调用自己的函数。在改写调用之前使用了 VirtualProtect 函数对相关内存区域的属性进行了修改。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| #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; }
|