我需要编写一个存根模块,当给定PE(DLL / EXE)作为输入时,将确定它是否是正常的Win32 DLL / EXE或COM DLL / EXE。我需要以编程方式确定这个。
是否有用于此目的的Windows API?
答案 0 :(得分:0)
对于传统的COM DLL,您可以查找已知的导出方法(在msdn上搜索这些方法)
我不确定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或者尚未注册。
希望有所帮助。