4

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

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

4

2 回答 2

0

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

  1. DllGetClassObject
  2. DLL注册服务器
  3. DllUnregisterServer
  4. DLLCanUnloadNow

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

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

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

于 2010-04-21T08:54:01.507 回答
0

我怀疑这很难以接近 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 或尚未注册。

希望有帮助。

于 2010-04-21T08:54:39.413 回答