2

我需要区分两个二进制文件——一个驱动程序和一个通用 dll。据我了解,我需要查看这些文件的各个部分(例如通过 DumpBin)并查看是否有 INIT 部分。这个标准是否完整?

4

2 回答 2

1

您需要解析二进制文件并查看 IMAGE_OPTIONAL_HEADER 的子系统字段,如果它是 NATIVE,那么它就是驱动程序。查看以下链接了解详情:

http://msdn.microsoft.com/en-us/library/ms809762.aspx

于 2012-04-03T17:32:53.877 回答
0

您必须使用启发式方法来确定这一事实并尽可能确定。问题是确实存在本机用户模式程序(例如autochk.exe)和 DLL(坦率地说,没有什么可以想到的,但我已经将它们视为本机程序的一部分,这些程序在winlogon.exe运行之前会做一些事情)以及内核-模式对应物(bootvid.dll以及hal.dll各种形式之一的内核ntoskrnl.exe)。

因此,要确定它是一个驱动程序,您可以尝试以下操作:

  1. IMAGE_OPTIONAL_HEADER::SubSystem,正如所指出的,应该表示它是“本地的”(即没有子系统IMAGE_SUBSYSTEM_NATIVE:)
  2. 验证IMAGE_FILE_HEADER::Characteristics不是DLL(意味着它是内核或用户模式 ​​DLL,请检查IMAGE_FILE_DLL
  3. 确保它导入或导入ntdll.dll另一个用户模式 ​​DLL,或者相反,它导入一个内核模式模块 ( ntoskrnl.exe, hal.dll, bootvid.dll) 以确定它是否会在内核模式或用户模式下运行。

结构和定义都包含在winnt.h.

要点:

  • 建立子系统(仅对IMAGE_SUBSYSTEM_NATIVE您的情况感兴趣)
  • 确定它是否为 DLL
  • 确定它是否链接到用户或内核模式组件
于 2012-04-03T18:01:02.823 回答