Windows2003的数据执行保护
发现这个问题是发布了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产生的,比较困惑,不知道怎么回事。
最后问题是解决了,但是迷迷糊糊的,主要是知其然而不知其所以然,没搞懂这个数据执行保护。