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