我想知道我安装的各种软件中的哪些 DLL 已经用 SafeSEH 编译,哪些没有。是否有一种工具可以为我提供该信息,否则编写进行该验证的代码的最佳解决方案是什么?
提前致谢。
我想知道我安装的各种软件中的哪些 DLL 已经用 SafeSEH 编译,哪些没有。是否有一种工具可以为我提供该信息,否则编写进行该验证的代码的最佳解决方案是什么?
提前致谢。
您还可以使用 dumpbin.exe /loadconfig 来查找安全异常处理程序表是否存在。更多信息在这里:http ://www.jwsecure.com/dan/2007/07/06/the-safe-exception-handler-table/
You could start out by taking this tool, SafeSEH Dump and examine the output. It shouldn't be too hard to run it batch-like against a list of all your DLLs. You need to create a login to download it. Here's a blog post that references SafeSEH Dump too, but the download link at that page seems dead.
我知道这是一个古老的问题,我正在从死里挖掘出来,但有一个程序化的解决方案。
首先,解析PE格式。有各种各样的解决方案,所以我不会深入。我只想说这是一个比我在这里能涵盖的更大的话题。如果您决定自行开发,请注意 32 位和 64 位可执行文件之间的差异。
解析完 PE 文件后,跳过 DOS 标头、NT 签名、文件标头(又名 COFF 标头)、可选标头,最后进入数据目录。这些目录中的每一个都有一个 RVA 和一个大小。查找配置目录的 RVA 和大小(列表中的第 10 个条目)。
这是我们可以开始进行检测的地方。如果 RVA 或大小为零,则未启用 SafeSEH。如果大小不是 0x40,则它是使用(可能)容易受到MS12-001 SafeSEH 绕过错误的编译器构建的。但是不要相信大小值 - 它不一定与其中的数据大小匹配,因为 Windows XP 的一些怪癖 - 请参阅上一个链接了解更多详细信息。
如果 RVA 和大小看起来合理,请按照 RVA 到负载配置结构。解析它,然后读取SEHandlerTable
andSEHandlerCount
值。如果处理程序表指针为空(即零),则不启用 SafeSEH。如果处理程序计数为零,即使 SafeSEH 可能已打开,也没有注册处理程序。