-
-
[求助]数据执行保护与VirtualAlloc函数(我发现了VirtualAlloc函数的一个问题)
-
-
[求助]数据执行保护与VirtualAlloc函数(我发现了VirtualAlloc函数的一个问题)
#include "stdafx.h"
#include <windows.h>
#include <time.h>
char *pCode = NULL;
void __declspec(naked)InHexOutDec()
{
// mov eax, 123h;
pCode[0] = 0xB8;
pCode[1] = 0x23;
pCode[2] = 0x01;
pCode[3] = 0x00;
pCode[4] = 0x00;
// ret;
pCode[5] = 0xC3;
_asm ret;
}
int _tmain(int argc, _TCHAR* argv[])
{
// 保留并提交内存
pCode = (char*)VirtualAlloc(NULL,6,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
// 更改保护属性为读写执行
DWORD dwOldProtect = 0;
//VirtualProtect(pCode,4,PAGE_EXECUTE_WRITECOPY,&dwOldProtect);
//pCode = (char*)malloc(6);
if (NULL == pCode)
{
return -1;
}
int iData = 0;
InHexOutDec();
// 一下两句给堆栈中压入FLAG处的地址,供mov eax,123; ret; 中的ret用
_asm mov eax, offset FLAG;
_asm push eax;
_asm jmp pCode; // F11进去,问题出现在 mov eax,123处
FLAG:
_asm mov iData, eax
printf("iData = %d\n",iData);
// free(pCode);
VirtualFree(pCode,0,MEM_RELEASE);
return 0;
}
-------------> 可是问题来了,我给VirtualAlloc传递的参数(PAGE_READWRITE)并不具有可执行的权限,但是我在内存堆空间中申请的代码居然可以执行,
这个是为何???????????难道msdn有错??? 请高手指教
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)