在动态生成某些可执行代码(shellcode)的时候,忘记去执行VirtualProtect(PAGE_EXECUTE)。对于i386这样的处理器来说,这样做并没有什么问题。
因为这些处理器并没有带有一个”可读但不可执行”的工作模式,所以在页面上任何可以读取的东西,都是可以被执行的。
VirtualProtect是一个Win32 API,它会变更调用进程的指定页面的保护层级。
其函数原型如下:
BOOL VirtualProtect(
LPVOID lpAddress,
DWORD dwSize,
DWORD flNewProtect,
PDWORD lpflOldProtect
);
lpAddress: 要改变保护层级的页面(内存)起始地址。
dwSize:页面(内存)大小。
flNewProtect:新的保护层级值。设置为PAGE_EXECUTE_READWRITE(0x40)时该内存页为可读可写可执行。全部可供设置的保护层级,请参考MSDN。
pflOldProtect:原内存保护层级地址。
页面保护层级修改成功时函数返回非0,修改失败则返回0。
以下代码可以将ShellCode所在的内存区的保护层级设置为可执行模式。
BOOL VirtualProtect(
ShellCode所在页面的起始地址,
ShellCode代码大小,
PAGE_EXECUTE_READWRIT