首页
社区
课程
招聘
[求助]数据执行保护与VirtualAlloc函数(我发现了VirtualAlloc函数的一个问题)
发表于: 2014-4-8 15:02 4466

[求助]数据执行保护与VirtualAlloc函数(我发现了VirtualAlloc函数的一个问题)

2014-4-8 15:02
4466
#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有错???   请高手指教

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你的程序开启了DEP么?
2014-4-8 15:31
0
雪    币: 45
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
关闭了。
2014-4-8 15:34
0
游客
登录 | 注册 方可回帖
返回
//