`
ruilin215
  • 浏览: 1143854 次
  • 性别: Icon_minigender_2
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

转: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”。
分享到:
评论

相关推荐

    Thunk 和 DEP

    DEP有两种模式:硬件DEP和软件DEP。硬件DEP依赖于处理器的支持,如NX(No Execute)位,它能直接在硬件层面禁止对某些内存区域的执行;软件DEP则由操作系统通过软件方式实现,通过监控指令执行来达到类似的效果。 ...

    gocsp-thunk:Thunk 作为 Promise 的兼容替代品

    安装 npm install gocsp-thunk例子 var thunk = require ( 'gocsp-thunk' )// create a thunk functionvar thunkFn = thunk ( function ( cb ) { setTimeout ( function ( ) { cb ( null , 'Hi' ) } , 100 )} )// ...

    thunk-redis, 基于 thunk/promise的redis客户端,支持所有redis特性.zip

    thunk-redis, 基于 thunk/promise的redis客户端,支持所有redis特性 thunk基于 thunk/promise的redis客户端,支持所有redis特性。 插件实现:thunk RateLimiter 最快的抽象速率限制器。定时队列分布式计时作业队列,...

    Thunk v0.4 by intret

    在IT领域,尤其是Windows系统编程中,"Thunk"是一个重要的概念,主要涉及到进程间通信(IPC)和不同线程调用API时的接口转换。Thunk v0.4 by intret 是一个C++实现的Thunk技术实例,它提供了一个简单的类,并包含...

    c++ thunk for 32/64

    call_thunk::thunk<AFX_THREADPROC> thunk; void CMyClass::start() { thunk.bind(*this, &CMyClass::Run); AfxBeginThread((AFX_THREADPROC)thunk, &abc, THREAD_PRIORITY_NORMAL, 0, 0); }

    MinGW对Thunk的实现

    在MinGW中,Thunk的实现涉及到汇编语言和C/C++的混合编程,以确保正确地处理参数传递和返回值。 在给定的资源中,`thunkgcc.cbp`是一个Code::Blocks项目文件,它包含了一个关于如何在MinGW下实现Thunk的示例项目。`...

    Thunk技术

    在Windows API中,32位和64位应用程序之间存在接口不兼容的问题,Thunk技术就解决了这个问题,使得32位代码能够与64位系统中的函数进行交互。这里我们将详细探讨Thunk的原理、作用以及它在实际开发中的应用。 Thunk...

    异步函数的封装thunks.zip

    thunks 是一个虽小但却很有用的软件,它可...callback 的返回值如果是 thunk 函数,则等该 thunk 执行完毕将结果输入新 thunk 函数运行;如果是其它值,则当做正确结果进入新的 thunk 函数运行; 标签:thunks

    thunk_x64.zip_thunk _x64Thunk

    x64实现Thunk的新思路,兼容x86,目前能使用的第一份x64下的thunk代码。

    redux-thunk 例子

    在这个"redux-thunk 例子"中,我们将探讨如何结合React和Redux Thunk实现登录验证功能。 首先,让我们了解什么是中间件。在Redux中,中间件是能够拦截并处理 action 的函数。它们在 action 被 dispatch 到 store ...

    atl thunk

    - STDCALL Thunk:这是为了解决不同编译器或不同平台间的ABI不兼容问题。在不同ABI之间进行函数调用时,thunk会负责调整参数压栈顺序和清理工作。 - CDECL Thunk:主要用于C++的虚函数调用。当一个接口是通过虚...

    thunk2promise:将thunk转换或转换为Bluebird Promise,就像在co @ 4中一样

    thunk2promise 将thunk转换或转换为Bluebird Promise。 安装 npm i thunk2promise --save npm test 用法 有关更多用例,请参见 var thunk2promise = require ( 'thunk2promise' ) function thunk ( a , b ) { ...

    Thunk经典资料全集

    Thunk经典资料全集,收集几乎所有的Thunk资料。

    前端项目-redux-thunk.zip

    通过以上步骤,`redux-thunk`就能让前端项目中的Redux具备处理异步操作的能力,使得状态管理更加灵活和强大。在实际开发中,还可以结合其他中间件如`redux-promise`、`redux-saga`等进一步优化异步流程。同时,要...

    redux-thunk-blog:Redux Thunk博客

    在Redux Thunk中,action creator会接收`dispatch`和`getState`两个参数。`dispatch`是Redux store的核心方法,用于触发状态变更;`getState`则可以获取当前store的状态。通过这两个参数,我们可以实现复杂的业务...

    react redux-thunk 和 router简单使用

    react redux-thunk 和 router简单使用

    typesafe-redux:使用thunk测试Typesafe Redux

    安装`@types/redux`和`@types/redux-thunk`作为开发依赖,它们提供了Redux和Thunk的类型定义。 2. **创建行动常量和行动创建者**: 定义你的行动类型常量(例如,`const ACTION_TYPE = 'ACTION_TYPE'`)并创建类型...

    Thunk 代码

    Thunk,你懂的,这么简单,就没写示例了。

    利用thunk技术改写窗口类回调函数为窗口对象成员函数

    为了解决这个问题,我们可以利用Thunk技术将窗口类的回调函数改写为窗口对象的成员函数,从而更好地封装和管理代码。 首先,让我们理解什么是Thunk。在Windows API中,Thunk是一种用于不同地址空间或不同代码段之间...

    redux-thunk:Redux的Thunk中间件

    Redux Thunk 用于Redux的Thunk。 npm install redux - thunk yarn add redux - thunk 请注意2.x更新 今天的大多数教程都假设您正在使用Redux Thunk1.x。 使用2.x运行他们的代码时,您可能会遇到问题。 如果您在...

Global site tag (gtag.js) - Google Analytics