转:Thunk 和DEP

转自:http://blog.csdn.net/yaosan/archive/2008/06/10/2533545.aspx


前几天博客中说ATL用thunk进行消息分发。当时觉得很别扭:堆栈,堆上的内存能执行?不是代码段也能执行吗?保护位什么时候设置的?后来没深究,以后得改改这毛病了,不能把疑问留一边,一定得正视了!

早上起来看双杯献酒给我的评论提示我一个上述网址有答案,先谢谢他了!



Thunk 和DEP

什么是 Thunk

Thunk 技术就是将一段机器码对应的字节保存在一个连续内存结构里,然后把其指针强制转换成函数, 即用作函数来执行。


什么是 DEP

数据执行保护 (DEP) 是一套软硬件技术,能够在内存上执行额外检查以帮助防止在系统上运行恶意代码。在 Microsoft Windows XP Service Pack 2 、 Microsoft Windows Server 2003 Service Pack 1 、Microsoft Windows XP Tablet PC Edition 2005 和 Microsoft Windows Vista 中,由硬件和软件一起强制实施 DEP 。


DEP 的主要优点是可以帮助防止数据页执行代码。通常情况下,不从默认堆和堆栈执行代码。硬件实施 DEP 检测从这些位置运行的代码,并在发现执行情况时引发异常。软件实施 DEP 可帮助阻止恶意代码利用 Windows 中的异常处理机制进行破坏。


硬件实施 DEP 是某些 DEP 兼容处理器的功能,可以防止在已标记为数据存储区的内存区域中执行代码。此功能也称为非执行和执行保护。 Windows XP SP2 还包括软件实施 DEP ,其目的在于减少利用 Windows 中的例外处理机制的情况。


我在使用 Thunk 过程

前些天看VCKBAE 上有好多Thunk 的代码, 就用在项目上了, 程序在我电脑上测试一切正常, 放在服务器上(Microsoft Windows Server 2003 Service Pack 2) 一打开, 就挂了, 百思不得解, 在服务器上装上VC, 开始调试, 问题找到了Thunk 出了问题,


找找找, 找了2 天的资料才发现了问题, 在windows xp sp2 上默认是” 仅为基本 Windows 程序和服务启用 DEP “ 在Microsoft Windows Server 2003 Service Pack2 上默认是”为除下列选定程序之外的所有程序和服务启用 DEP “


在哪里查看DEP 设置呢?


我的电脑-> 属性-> 高级-> 性能-> 设置-> 数据执行保护( 见下图)

, 如果 看到” 您的计算机的处理器不支持基于硬件的 DEP 。但是,Windows 可以使用 DEP 软件帮助保护免受某些类型的攻击。” 就是勾上 ”为除下列选定程序之外的所有程序和服务启用 DEP “ Thunk 程序也能跑的好好的, 不过, 新的CPU 都是支持硬件DEP 的.

转回上面, 我在 Microsoft Windows Server 2003 Service Pack2 以 改成”仅为基本 Windows 程序和服务启用 DEP ”,Thunk 程序运行正常.


问题解决了吗 ?


当然还没有解决, 我知道WTL 也用了Thunk 技术, 于是, 用WTl 生成一个Dialog 程序, 在Microsoft Windows Server 2003 Service Pack2 上, 把DEP 设置成回默认的, 运行一下Wtl 的 Dialog, 可以跑起来, 同样是用Thunk, 这是什么原因呢, 看ATL 代码, 原来在这里


result = IsProcessorFeaturePresent( 12 /*PF_NX_ENABLED*/ );

  确定处理器的特性

  如果result 返回True

   thunkPage = (PATL_THUNK_ENTRY)VirtualAlloc(NULL,

   PAGE_SIZE,

   MEM_COMMIT,

   PAGE_EXECUTE_READWRITE);


  用VirtualAlloc[PAGE_EXECUTE_READWRITE] 来分配Thunk 代码的内存,

  到这里问题解决了.

  附件代码 Tunk 代码在 CallBackTemplate.h 和 CallBackTemplate.cpp 文件里


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yaosan/archive/2008/06/10/2533545.aspx

下面补充一下:

上述伪代码的真实代码上一下:(Allocate a new page of executablememory !!!)

XP帮助文档里面关于DEP有如下描述:

了解数据执行保护

数据执行保护可帮助保护您的计算机免受病毒和其他安全威胁的破坏。这些病毒和威胁尝试从受保护的内存位置运行(执行)恶意代码来发起攻击,而只有 Windows 和其他程序才应使用这些位置。这种威胁通过接管程序正在使用的一个或多个内存位置来执行破坏操作。之后,它会进行传播,从而破坏其他程序、文件乃至您的电子邮件联系人。

与防火墙或防病毒程序不同,DEP 无法帮助防止有害的程序安装在计算机中,而是对您的程序进行监视,确定它们是否能够安全地使用系统内存。要执行监视操作,DEP 软件既可以独立运行,也可以与兼容微处理器协作,将某些内存位置标记为“不可执行”。如果程序尝试从受保护的内存位置运行代码(无论是否为恶意代码),DEP 均将关闭程序并向您发送通知。

DEP 可以利用软件和硬件支持。要使用 DEP,您的计算机必须运行 Microsoft Windows XP Service Pack 2 (SP2) 或更高版本,或者 Windows Server2003 Service Pack1 或更高版本。DEP 软件独立运行时可帮助防御某些类型的恶意代码攻击,但要充分利用 DEP 可以提供的保护功能,您的处理器必须支持“执行保护”功能。执行保护是一种基于硬件的技术,用于将内存位置标记为“不可执行”。如果您的处理器不支持基于硬件的 DEP,则最好将其升级为能够提供执行保护功能的处理器。

再次运行被 DEP 关闭的程序是否安全?

安全,但前提是您要针对该程序启用 DEP。Windows 可继续检测企图从受保护内存位置执行代码的尝试,并能够帮助防止攻击。如果启用 DEP 后程序无法正常运行,您可从软件发行商处获取与 DEP 兼容的程序版本,从而降低安全风险。有关 DEP 关闭程序后应如何操作的详细信息,请单击“相关主题”。

如何确定我的计算机上是否启用了 DEP?

  1. 要打开“系统属性”,请依次单击“开始”、“控制面板”,然后双击“系统”。
  2. 单击“高级”选项卡,之后单击“性能”下的“设置”。
  3. 单击“数据执行保护”选项卡。

注意

  • 默认情况下,DEP 只针对基本 Windows 操作系统程序和服务启用。要使用 DEP 帮助保护其他程序,请选择“为下列程序之外的所有程序启用 DEP”。

你可能感兴趣的:(windows,Microsoft,软件测试,XP,vc++)