【winapi】VirtualProtect 函数

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

【winapi】VirtualProtect 函数
https://hodlyounger.github.io/A_OS/Windows/API/【winapi】VirtualProtect/
作者
mingming
发布于
2023年10月27日
许可协议