概述: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;
}