我需要区分两个二进制文件——一个驱动程序和一个通用 dll。据我了解,我需要查看这些文件的各个部分(例如通过 DumpBin)并查看是否有 INIT 部分。这个标准是否完整?
问问题
1579 次
2 回答
1
您需要解析二进制文件并查看 IMAGE_OPTIONAL_HEADER 的子系统字段,如果它是 NATIVE,那么它就是驱动程序。查看以下链接了解详情:
于 2012-04-03T17:32:53.877 回答
0
您必须使用启发式方法来确定这一事实并尽可能确定。问题是确实存在本机用户模式程序(例如autochk.exe
)和 DLL(坦率地说,没有什么可以想到的,但我已经将它们视为本机程序的一部分,这些程序在winlogon.exe
运行之前会做一些事情)以及内核-模式对应物(bootvid.dll
以及hal.dll
各种形式之一的内核ntoskrnl.exe
)。
因此,要确定它是一个驱动程序,您可以尝试以下操作:
IMAGE_OPTIONAL_HEADER::SubSystem
,正如所指出的,应该表示它是“本地的”(即没有子系统IMAGE_SUBSYSTEM_NATIVE
:)- 验证
IMAGE_FILE_HEADER::Characteristics
不是DLL(这意味着它是内核或用户模式 DLL,请检查IMAGE_FILE_DLL
) - 确保它导入或不导入
ntdll.dll
另一个用户模式 DLL,或者相反,它导入一个内核模式模块 (ntoskrnl.exe
,hal.dll
,bootvid.dll
) 以确定它是否会在内核模式或用户模式下运行。
结构和定义都包含在winnt.h
.
要点:
- 建立子系统(仅对
IMAGE_SUBSYSTEM_NATIVE
您的情况感兴趣) - 确定它是否为 DLL
- 确定它是否链接到用户或内核模式组件
于 2012-04-03T18:01:02.823 回答