【发布时间】:2010-04-21 08:25:57
【问题描述】:
我需要编写一个存根模块,当给定一个 PE (DLL/EXE) 作为输入时,它将确定它是普通的 Win32 DLL/EXE 还是 COM DLL/EXE。我需要以编程方式确定这一点。
是否有任何用于此目的的 Windows API?
【问题讨论】:
标签: com winapi portable-executable
我需要编写一个存根模块,当给定一个 PE (DLL/EXE) 作为输入时,它将确定它是普通的 Win32 DLL/EXE 还是 COM DLL/EXE。我需要以编程方式确定这一点。
是否有任何用于此目的的 Windows API?
【问题讨论】:
标签: com winapi portable-executable
我怀疑这很难达到接近 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 或尚未注册。
李>希望对您有所帮助。
【讨论】:
对于传统的 COM DLL,您可以查找众所周知的导出方法(在 msdn 上搜索这些方法)
我不确定 EXE COM 服务器,因为它们通常使用命令行参数进行注册/注销,并且类对象通常在 EXE 启动时调用 CoRegisterClassObject。
大多数 COM 服务器传统上也在注册表中注册,但您现在可以创建免注册服务器。
您是否还在寻找带有一些 COM 可见类的 .NET 程序集?
【讨论】: