如何检查PE文件(DLL,EXE)是否是COM组件?

时间:2010-04-21 08:25:58

标签: com winapi portable-executable

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

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

2 个答案:

答案 0 :(得分:0)

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

  1. 的DllGetClassObject
  2. 的DllRegisterServer
  3. DllUnregisterServer的
  4. DllCanUnloadNow
  5. 我不确定EXE COM服务器,因为它们通常使用命令行参数进行注册/取消注册,而对象通常在EXE启动时调用CoRegisterClassObject。

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

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

答案 1 :(得分:0)

我怀疑这是近乎100%准确率很难做到的事情。但有些想法:

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

  • 一个普通的win32 Dll将导出DllMain。您可以使用相同的技术来检查它。如果你发现它很可能是它的win32。

  • 我不知道有没有办法发现exe是否是COM服务器。使用ATL编写的服务器通常在其资源表中嵌入了注册脚本,但它们不必。而且您不需要使用ATL来编写COM服务器。使用“无注册表com”的服务同样具有嵌入式清单。您可以扫描注册表(在HKLM / Classes / Software /下面)以查看exe是否已注册,但可能是exe正在使用无注册表的com或者尚未注册。

希望有所帮助。