查找未使用SafeSEH编译的Windows DLL

时间:2009-10-23 00:25:23

标签: windows dll portable-executable

我想知道我安装的各种软件中的哪些DLL是用SafeSEH编译的,哪些没有。有没有一个工具可以提供给我这些信息,否则什么是编码进行验证的代码的最佳解决方案?

提前致谢。

3 个答案:

答案 0 :(得分:1)

您可以通过使用此工具SafeSEH Dump开始并检查输出。对所有DLL的列表进行批处理运行应该不会太难。您需要创建一个登录名来下载它。这里引用了SafeSEH转储的a blog post,但该页面上的下载链接似乎已经死了。

答案 1 :(得分:1)

您还可以使用dumpbin.exe / loadconfig查找是否存在Safe Exception Handler表。更多信息:http://www.jwsecure.com/dan/2007/07/06/the-safe-exception-handler-table/

答案 2 :(得分:0)

我知道这是一个古老的问题,我正在从死里复活,但 是一个程序化的解决方案。

首先,解析PE格式。有各种各样的解决方案,所以我不会介绍它。我只想说这是一个比我能涵盖的更重要的主题。如果您决定自己动手,请注意32位和64位可执行文件之间的差异。

解析完PE文件后,跳过DOS标头,NT签名,文件头(a.k.a.COFF标头),可选标头,最后转到数据目录。这些目录中的每一个都具有RVA和大小。找到配置目录的RVA和大小(列表中的第10个条目)。

这是我们可以开始进行检测的地方。如果RVA或大小为零,则不启用SafeSEH。如果大小不是0x40,那么它是使用一个(可能)容易受MS12-001 SafeSEH bypass bug攻击的编译器构建的。不要相信大小值 - 它不一定匹配达到内部数据的大小,因为Windows XP存在一些怪癖 - 请参阅上一个链接以获取更多详细信息。

如果RVA和尺寸看起来合理,请按照RVA到Load Configuration structure。解析它,然后阅读SEHandlerTableSEHandlerCount值。如果处理程序表指针为空(即为零),则不启用SafeSEH。如果处理程序计数为零,则没有注册处理程序,即使可能已打开SafeSEH。