win 7 上可以设置单步陷阱吗?

2023-12-23

我正在做所谓的“seh hooking”。实际上它改变了内存区域的权限并在访问时捕获异常,因此它可以挂钩该函数。

它使用单步陷阱,如下所示:

info->ContextRecord->EFlags |= 0x100;

恢复保护PAGE_NOACCESS.

该应用程序在 win xp 上运行良好,但在 win 7 上则不然。它只是在 win 7 上冻结了。我非常怀疑这是因为“设置单步陷阱”的原因,但我不确定。

到源码包的直接下载链接


简短回答:

是的,单步标志是 x86 架构的一部分,并且仍然通过处理器上下文的 eflags 组件在 Windows 7 中实现。

我已经成功下载了您的项目,在 Windows 8 上关闭 UAC 后,一切正常,无需修改。所以它也应该可以在 Windows 7 上运行。启动时VEH Hooking Test.exe它显示两个消息框,在每个消息框之后我都会收到MessageBoxA控制台输出,所以钩子起作用了。也许尝试在 Windows 7 上以管理员身份启动该程序?


长答案:

SEH代表结构化异常处理,但您所描述的听起来更像VEH- 向量异常处理。

VEH 挂钩是一种非常慢的挂钩方法,因此它不能真正用于性能关键的挂钩,例如图形挂钩,例如挂钩每秒点击多次。它通常用于一次性钩子。 VEH hooking 的目的是真正隐秘。别人的代码中没有写入内存,您也不必使用调试寄存器。


以下是我如何使用 C++ 实现它。

首先,您必须注册一个向量异常处理程序。这是该进程的全局异常处理程序。每个未处理且会传递到操作系统的抛出异常都将被此处理程序捕获。

PVOID pExHandler = AddVectoredExceptionHandler(1, VectoredHandler);

之后,您应该设置您所在页面的内存保护HOOK_LOCATION(要挂钩的地址)在。我使用的新保护是PAGE_EXECUTE_READ|PAGE_GUARD。受保护的页面会导致访问异常,并会自动解除保护。此异常不会由任何人处理,因此它将落入我们的向量处理程序。抛出异常后,页面可以再次访问。 (看创建保护页 http://msdn.microsoft.com/en-us/library/windows/desktop/aa366549(v=vs.85).aspx)

内存只能以页的形式进行保护(通常为 0x1000 字节长)。这就是为什么我们不仅不能保护钩子位置,而且会产生巨大的性能开销。

DWORD orgProt;
VirtualProtect(HOOK_LOCATION, 1, PAGE_EXECUTE_READ|PAGE_GUARD, &orgProt);

现在我们的异常处理程序。它可能是这样的:

LONG CALLBACK VectoredHandler(PEXCEPTION_POINTERS exc)
{
    if (exc->ExceptionRecord->ExceptionCode == STATUS_GUARD_PAGE_VIOLATION)
    {
        // guard page exeption occured. guard page protection is gone now

        if (HOOK_LOCATION == reinterpret_cast<long*>(exc->ContextRecord->Eip)) {
            // hook location was hit! call any hook callbacks here
        } else {
            // hook was not hit and has to be refreshed. set single-step flag
            exc->ContextRecord->EFlags |= 0x100;
        }

        return EXCEPTION_CONTINUE_EXECUTION;
    }

    if (exc->ExceptionRecord->ExceptionCode == STATUS_SINGLE_STEP)
    {
        // single-step exeption occured. single-step flag is cleared now

        // set guard page protection
        DWORD oldProt;
        VirtualProtect(HOOK_LOCATION, 1, PAGE_EXECUTE_READ|PAGE_GUARD, &oldProt);

        return EXCEPTION_CONTINUE_EXECUTION;
    }

    return EXCEPTION_CONTINUE_SEARCH;
}

如果代码运行到受保护的内存页,它将引发保护页违规。我们检查是否处于挂钩位置。如果一切正常,我们可以调用钩子回调。如果我们不在正确的位置,我们需要以某种方式重新保护代码,但如果我们现在就这样做,我们就无法前进,并且总是在同一位置出现异常并使应用程序死锁。所以我们设置处理器单步标志。

现在,当收到单步异常时,我们可以再次设置防护保护,因为我们前进了一条指令。这样我们就可以始终保护目标页面并且不会错过任何钩子命中。

成本是在目标页面中执行的每条指令有两个异常和一个页面保护。不要尝试在附加调试器的情况下执行此操作。它会发疯的。

对于实际的实现,您可能需要同步对象来摆脱钩子而不会使程序崩溃,并需要更好的钩子管理。

我真的很喜欢这个聪明的机制,并希望有人能了解一些。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

win 7 上可以设置单步陷阱吗? 的相关文章

随机推荐

  • cloudfront 私人限时 url

    我有一个客户想要在线销售教程视频 我已经从 CF 中预览了他的教程 这是公开的 现在我想使用c sdk生成私有的 限时的URL 以允许购买教程的客户在有限的时间内下载它们 确认付款后 我想生成一个 URL 并通过电子邮件将其发送给客户 CF
  • Django:何时使用 QuerySet none()

    刚刚在Django 文档 https docs djangoproject com en dev ref models querysets none 调用 none 将创建一个永远不会返回任何对象的查询集 访问结果时不会执行任何查询 一个
  • 用于匹配 URL 后两部分的正则表达式

    我正在努力找出最好的regex仅匹配 url 中的最后两个字符串 例如与www stackoverflow com我只想匹配stackoverflow com 我遇到的问题是某些字符串可能有大量句点 例如 a abcnewsplus i a
  • 如何实现上个月/下个月按钮并显示当月的日期?

    设想 我有一个费用跟踪 iOS 应用程序 我将费用详细信息视图控制器中的费用存储到表视图 带有获取的结果控制器 中 该表视图显示费用列表以及类别 金额和日期 我的实体 金钱 中确实有一个日期属性 它是支出或收入的父实体 问题 我想要的是基本
  • 为什么数据库复制时从机读取速度比主机快

    在主 从数据库复制中 所有写入都转到主机 所有读取都转到从机 主机将数据复制到从机 当主机将数据复制到从机时 从机必须执行写入操作以锁定该行 从从机读取速度更快 但为什么呢 奴隶should be a lot更快 因为 它写入的数据量与ma
  • 使用 x-www-form-urlencoded 的 HttpClient POST 请求

    我正在尝试发出 POST 请求x www form urlencoded内容类型标头如下 login username password Observable
  • 取消转义 Ruby 字符串中的特殊字符序列

    我正在从包含如下序列的文件加载文本 abc ndef tghi 我想 转义 所有特殊字符 例如来治疗 n作为换行符和 t作为选项卡等 而不是自动以例如 n or t在字符串中 是否有捷径可寻 文本将按照文件中的原样加载 如果文件具有文字文本
  • 403 错误代码 Google Drive Python 已超出此文件的下载配额

    我使用 Google Drive Python 库https developers google com drive v3 web quickstart python step 1 turn on the api name https de
  • WCF REST 请求拦截器身份验证

    我正在尝试在 WCF RequestInterceptor 中进行一些基本身份验证 我在用本文 http msdn microsoft com en us library ee391967 aspx作为一个开始 我遇到的问题是拦截器和服务之
  • 在 Flask 中返回 Excel 文件

    我正在 python 3 中构建一个 Flask 应用程序 我正在尝试写入输出并响应下载 我所做的就是将 sqlite3 db 内容写入 Excel 文件 尝试发送到客户端进行下载 一切似乎都工作正常 直到创建 Excel 文件 我无法发送
  • std::变换和移动语义

    我正在使用 Boost Filesystem 在目录中创建文件列表 我用boost filesystem recursive directory iterator and std copy将每个路径放入 std vector 作为boost
  • 使用一个 UIViewController 和两个 XIB 处理 iPad 上的方向变化

    我想用一个 UIViewController 和两个 XIB 例如 MenuView 和 MenuViewLandscape 来处理 iPad 应用程序上的方向更改 那么 在 MenuViewController 的 willRotateT
  • 使用 Prism 和 IsNavigationTarget 处理嵌套视图,可能返回 false

    I m trying to find solution for the following problem I have a WPF app I used mvvm and prism most recent version 7 to bu
  • 如何在 C++ 中退出时运行函数

    我有一个函数 我想在程序退出时运行 void foo std cout lt lt Exiting lt lt std endl 如何将其注册为在程序存在时运行 无论程序何时以及为何退出 由于信号 exit 调用等 您可以使用适当命名的st
  • 如何避免内存泄漏? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • __doPostBack 在 Firefox 中不起作用

    doPostBack 在 firefox 3 中不起作用 尚未检查 2 一切在 IE 6 和 7 中都运行良好 甚至在 Chrome 中也能运行 这是一个带有 OnClick 事件的简单 asp LinkBut ton
  • 让子弹朝玩家面对的方向发射

    当我意识到他们只会走时 我刚刚得到一些帮助来弄清楚如何让我的玩家发射子弹 有点预料到这一点 但因为只有 y 的移动值 我不知道如何让子弹朝玩家面对的方向发射 我知道该怎么做 但我只是不知道该怎么做 我想我可以以某种方式使用这个游戏中的光标和
  • React-native fbsdk 构建错误

    我在运行命令react native run android 或 gradlew build 时收到以下错误 react native fbsdk generateReleaseResValues UP TO DATE react nati
  • 等待用户在 Node.js 中输入内容

    我了解 Node js 中异步事件的基本原理 并且正在学习如何以这种方式编写代码 但是 我遇到了以下情况 我想编写偶尔会暂停以供用户输入的代码 该程序并非旨在用作服务器 尽管目前它用于命令行 我意识到这是 Node 的非典型用法 我的目标是
  • win 7 上可以设置单步陷阱吗?

    我正在做所谓的 seh hooking 实际上它改变了内存区域的权限并在访问时捕获异常 因此它可以挂钩该函数 它使用单步陷阱 如下所示 info gt ContextRecord gt EFlags 0x100 恢复保护PAGE NOACC