Windows2003的数据执行保护

ringphone 2008-09-19 11:04:43
发现这个问题是发布了RingSDK界面库,windblood告诉我在WIN2003下程序无法运行,于是装了个2003试了一下,发现是数据执行保护功能阻止了程序的执行。
关于RingSDK界面库请看下面两个链接:
http://topic.csdn.net/u/20080911/16/db5a5642-087a-4c31-a9dd-32ebc9862475.html
http://topic.csdn.net/u/20080911/09/e79a9555-9a77-4fc2-bfba-d78f8bc0fcff.html
数据执行主要是界面库利用了thunk技术进行封装,即在数据区执行代码,原理及实现请见我BLOG的文章:
http://blog.csdn.net/ringphone/archive/2004/09/28/118883.aspx

因为thunk是在数据区执行代码,因此数据执行保护会阻止,但是ATL使用了相同的技术,为什么ATL的程序却能执行呢?于是对比了一下我的和ATL的代码,写了几个测试程序进行调试测试,发现2003下,thunk代码不能用CALL指令,一旦执行CALL,就会报非法内存访问。不用CALL,那只好改用JMP,但是用JMP之后,发现thunk不能在堆上,必须是在栈上。thunk结构不能是通过new产生,否则程序就没有响应,跟踪发现是在USER32.DLL里面,到某个地方执行了int 0Bh,然后就不响应了。但是thunk是作为类成员数据,而类对象是通过new产生的,搞不懂了,就是这种情况:

class a
{
Thunk m_thunk;
...
}
运行正常

class a
{
Thunk* m_thunk; //m_thunk通过new Thunk产生对象
...
}
到某处执行int 0Bh,无响应

但是class a的对象是通过new a产生的,比较困惑,不知道怎么回事。

最后问题是解决了,但是迷迷糊糊的,主要是知其然而不知其所以然,没搞懂这个数据执行保护。
...全文
1175 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ringphone 2008-09-28
  • 打赏
  • 举报
回复
早就知道这个问题不会有满意答案,因此移到非技术区结帖,权当散分了,免得有人说我大地主抠门:P
cnf 2008-09-19
  • 打赏
  • 举报
回复
放个凳子看大地主和中农
jameshooo 2008-09-19
  • 打赏
  • 举报
回复
不会,UP一下总可以吧
yagebu1983 2008-09-19
  • 打赏
  • 举报
回复
不会!!
关注!!
zhoujianhei 2008-09-19
  • 打赏
  • 举报
回复
虽说CPU支持该特性,但是操作系统也是可以关闭不用的,就像段寻址MS不也是没用吗。这个完全取决于MS。
ringphone 2008-09-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhoujianhei 的回复:]
Thunk* thunk = new Thunk;
无论是在栈还是堆中分配,都是不可取的,因为那些内存是不可执行的。虽然CPU没有禁止这些行为,但有些操作系统已从软件层上禁止了,以防止缓冲区溢出攻击。下一代的CPU也很有可能全面禁止,据说AMD已经做到啦。
[/Quote]

禁止的话,那ATL写的程序,那么多ActiveX都无法运行,看MS怎么收拾这个局面。
ToperRay 2008-09-19
  • 打赏
  • 举报
回复
学习一下。
zhoujianhei 2008-09-19
  • 打赏
  • 举报
回复
Thunk* thunk = new Thunk;
无论是在栈还是堆中分配,都是不可取的,因为那些内存是不可执行的。虽然CPU没有禁止这些行为,但有些操作系统已从软件层上禁止了,以防止缓冲区溢出攻击。下一代的CPU也很有可能全面禁止,据说AMD已经做到啦。

可以使用VirtualAlloc分配一块带有执行权限的内存来解决。

1,649

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 非技术类
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧