刚才在 win10 里试了下,和 win7表现一样。 想起来 Sysinternal组件里的 procexp 程序是可以查看 DEP 状态的,运行了自己的两个模式的程序,发现简易定义模式的是 DEP 状态,而 segment 模式的则是 Disabled 状态,而它们的 DllCharacteristics 都是 0 。 看来真是 DEP 惹出来的祸,只是弯子绕得人头晕啊。
NX_COMPAT就是(data) non-executable compatible的缩写
不是这样的吧,否则无法解释什么也不动,只把 DllCharacteristics 置 0 就可以正常运行。
IMAGE_DLLCHARACTERISTICS_NX_COMPAT,看了 http://www.zyiz.net/tech/detail-129173.html 的介绍,这个是进程 DEP 控制的,除外模式下,进程可以自己调用相应 API 解除 DEP。 楼主的程序是置该标记位的;我的那些个程序包括 NetTransport 都是 0,自己的代码里当然也没有去操作 DEP,但还是出现了不同的 DEP 表现。这个,难道是 win7 这方面不成熟?
我用vs2015里带的ml 12.00.21005.1测试了一下楼主的程序,确实存在这个问题,第一个会导致AV,第二个则正常执行。之前我认为导致异常的是mov eax, 0123h后面的00 00,实际不是,确实是mov eax, 0123h这条指令的位置出现异常。 继续研究了一下,又用非微软汇编器tasm32、jwasm测试,终于发现了问题之所在。这应该是微软masm隐藏很深的一个BUG。在masm的标准段模型下,同类别名的段会被合并。而你的程序没有显式定义数据段,它会建立一个默认数据段,之后由于BUG,它认为这个两个段可以合并。所以最终pe文件中生成的代码和数据section是地址重合的。而从xp开始,默认启用DEP,数据section禁止执行,所以第一条指令mov eax, 0123h就异常了。 而在简化段模型下(最初是Borland Turbo Assembler创造的,称之为IDEAL模型),.code和.data不会合并,所以对应在pe中是两个不重合的section,于是没有数据执行的问题。 经测试,tasm32、jwasm生成的程序没有这个bug,对于ml,只要给codes段一个别名: codes segment public 'code' 也可以避开这个bug
又对比了下我的和楼主的两个 exe,发现 pe 头部的 DllCharacteristics 域有不同,该值资料上说总是 0000,楼主的程序1 是 8540,程序2 是 8140 。从表现来看,代码节正常属性时,似无甚影响;若有异,就必须是 0000 了。再具体的是怎么发神经的,资料和水平有限,无力深究了。
[quote=引用 14 楼 赤勇玄心行天道 的回复:]上传了: https://download.csdn.net/download/cyz7758520/16436554
上传了: https://download.csdn.net/download/cyz7758520/16436554
[quote=引用 10 楼 早打大打打核战争 的回复:]因为x86/x64的异常有三类:faults, traps, aborts windows错误代码0xc0000005(Access Violation)对应处理器异常13(General Protection Fault),属于fault型异常,在指令前边界检测处理,而int n、into、单步之类的异常属于trap型异常,在指令后边界检测处理
那个指令本身不应该有 5 拒绝访问的,发生这个,单步时的堆栈操作上有问题,还是代码所在节不是可执行的,这个好像怎么都不应该的,exe 文件上传来看看?
因为x86/x64的异常有三类:faults, traps, aborts windows错误代码0xc0000005(Access Violation)对应处理器异常13(General Protection Fault),属于fault型异常,在指令前边界检测处理,而int n、into、单步之类的异常属于trap型异常,在指令后边界检测处理
21,497
社区成员
41,618
社区内容
加载中
试试用AI创作助手写篇文章吧