首页
社区
课程
招聘
[求助]VS2008堆栈不可执行的问题
发表于: 2010-12-28 18:01 7999

[求助]VS2008堆栈不可执行的问题

2010-12-28 18:01
7999
今天看到别人提了个问题:windows中内存如果是RW的话,是否就是RWE?刚好我也有同样的疑问,所以上来问问。

早些时候,我在VS08里面测试过类似代码:
(注:我的是win7系统)

void main()
{
    char s[]="\x90\x90\x90\xc3";
    ((void (__stdcall*)())&s[0])();
}
VS08中编译成功,运行失败,原因是xx内存不能执行。

加上
DWORD a;
VirtualProtect(s,6,PAGE_EXECUTE_READWRITE,&a);
后运行成功。

这说明VS08中,堆栈必须要指定RWE才能执行

    OK,换VC6.0的编译器
VirtualProtect(s,6,PAGE_EXECUTE_READWRITE,&a);

执行成功。

VirtualProtect(s,6,PAGE_READWRITE,&a);

依然执行成功。

这下我郁闷了,OD中alt+M,均为 RW 保护。RW我明白,“保护”何意?
还有为何同样的代码,VS08中堆栈不可执行,VC6就可以?什么标志位不同?求解!

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

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 257
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
听说VS2003后就加入堆栈保护开关,但这到底是什么原理?

学的比较粗糙,对页面保护之类没有研究,莫笑啊
2010-12-28 18:07
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
VS2008默认DEP是打开的,具体参见MSDN中的关于链接器/NXCOMPAT参数的描述,可以修改你VS2008工程中linker/advanced/Data Execution Prevention (DEP)项的设置来关掉DEP。
2010-12-31 19:08
0
雪    币: 1491
活跃值: (985)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
4
VC6编译的程序没有默认加载DEP
2011-1-1 09:39
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
严格说VC6根本不知道DEP为何物
2011-1-1 11:16
0
雪    币: 345
活跃值: (122)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
6
嗯,堆栈不可执行。s[]在栈上分配的。
2011-1-5 08:42
0
雪    币: 233
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
VS2008默认DEP是打开的,具体参见MSDN中的关于链接器/NXCOMPAT参数的描述,可以修改你VS2008工程中linker/advanced/Data Execution Prevention (DEP)项的设置来关掉DEP。 严格说VC6根本不知道DEP为何物
2011-1-5 09:04
0
游客
登录 | 注册 方可回帖
返回
//