【问题标题】:How to check whether a PE file (DLL,EXE) is a COM component?如何检查PE文件(DLL,EXE)是否为COM组件?
【发布时间】:2010-04-21 08:25:57
【问题描述】:

我需要编写一个存根模块,当给定一个 PE (DLL/EXE) 作为输入时,它将确定它是普通的 Win32 DLL/EXE 还是 COM DLL/EXE。我需要以编程方式确定这一点。

是否有任何用于此目的的 Windows API?

【问题讨论】:

    标签: com winapi portable-executable


    【解决方案1】:

    我怀疑这很难达到接近 100% 的准确率。不过有一些想法:

    • COM DLL 将导出 DllRegisterServer 和 DllUnregisterServer 等函数。您可以使用 LoadLibrary() 加载 Dll,然后使用 GetProcAddress() 检查这些函数是否存在。如果它们在那里,那么它很可能是一个 COM dll。

    • 普通的 win32 Dll 将导出 DllMain。您可以使用相同的技术进行检查。如果你找到它,那么它很可能是它的 win32。

    • 我不知道有一种方法可以发现 exe 是否是 COM 服务器。使用 ATL 编写的服务器通常会在其资源表中嵌入一个注册脚本,但并非必须如此。而且你不需要使用 ATL 来编写 COM 服务器。使用“registry-less com”的服务同样会有一个嵌入式清单。您可以扫描注册表(在 HKLM/Classes/Software/ 下方)以查看 exe 是否已注册,但可能是该 exe 正在使用无注册表 com 或尚未注册。

      李>

    希望对您有所帮助。

    【讨论】:

    • GetClassObject 不是更好的选择吗?它是创建对象所必需的,但 DllRegisterServer 的工作可以由安装程序完成。
    • 请注意,COM dll 绝对可以拥有 DllMain。请记住,COM dll 只是 Win32 dll 的一种特殊类型,但它仍然是 Win32 dll,因此可以执行 Win32 dll 可以做的任何事情。在任何情况下,DllMain 都不是一个导出,所以无论如何你都不会用 GetProcAddress 找到它;它确实是一个加载程序入口点。检查是否存在 DllGetClassObject 可能是您最好的选择。
    • 另外,对于它的价值,如果安全是一个问题,你应该避免在一个不受信任的 DLL 上使用 LoadLibrary,因为它会在你的进程中执行 DLL 的 DllMain 代码 - presto,你现在刚刚执行了不受信任的代码。这可能是也可能不是问题,具体取决于您的应用程序的使用方式,但无论如何都值得关注这个问题。 (可以使用 LoadLibraryEx(LOAD_LIBRARY_AS_DATAFILE) 代替,但我不知道 GetProcAddress 是否可以工作,您最终可能不得不手动解析导出表)。
    【解决方案2】:

    对于传统的 COM DLL,您可以查找众所周知的导出方法(在 msdn 上搜索这些方法)

    1. DllGetClassObject
    2. DllRegisterServer
    3. DllUnregisterServer
    4. DllCanUnloadNow

    我不确定 EXE COM 服务器,因为它们通常使用命令行参数进行注册/注销,并且类对象通常在 EXE 启动时调用 CoRegisterClassObject。

    大多数 COM 服务器传统上也在注册表中注册,但您现在可以创建免注册服务器。

    您是否还在寻找带有一些 COM 可见类的 .NET 程序集?

    【讨论】:

    • 我有一些 PE(COM EXE、COM DLL、Win32 EXE、Win32 DLL),我需要从中提取所有导出的函数和公开的接口方法(如果是 COM)。现在这需要检查它是WIN32 DLL/EXE 还是COM DLL/EXE。因此,如果它的 COM EXE 我们可以遍历它的 vtable 以获取所有公开的方法或接口,如果它是 WIN 32 DLL/EXE,我们需要读取它的导出表以提取导出的符号。
    • Usman,COM 服务器只是遵循 COM 规范作为实现的一部分的 Win32 二进制文件。 PE 格式不存储有关 PE 是 COM 还是普通 Win32 的信息。您始终可以解析 PE 文件(我认为 msdn 上有一个示例),但没有特殊的“COM”签名。对于您的功能,我建议您阅读有关 COM 规范以及 DLL 或 EXE 作为 COM 服务器的最低要求。正如我之前提到的,COM DLL 服务器的最低要求是按照 COM 规范导出已知函数。
    猜你喜欢
    • 1970-01-01
    • 2011-03-10
    • 2023-03-28
    • 1970-01-01
    • 2010-11-12
    • 2019-07-07
    • 2021-08-10
    • 1970-01-01
    • 2011-03-13
    相关资源
    最近更新 更多