Как проверить, является ли PE-файл (DLL,EXE) компонентом COM?

Мне нужно написать модуль-заглушку, который при вводе PE (DLL/EXE) в качестве входных данных будет определять, является ли это обычная Win32 DLL/EXE или COM DLL/EXE. Мне нужно определить это программно.

Существуют ли какие-либо API-интерфейсы Windows для этой цели?

2 ответа

Решение

Я подозреваю, что это что-то, что было бы очень трудно сделать с почти 100% точностью. Некоторые мысли, хотя:

  • COM DLL будет экспортировать такие функции, как DllRegisterServer и DllUnregisterServer. Вы можете использовать LoadLibrary() для загрузки Dll, а затем GetProcAddress(), чтобы проверить наличие этих функций. Если они там, то весьма вероятно, что это COM DLL.

  • Простой win32 Dll будет экспортировать DllMain. Вы можете использовать ту же технику, чтобы проверить это. Если вы найдете его, то вполне вероятно, что это win32.

  • Я не знаю, как определить, является ли exe-сервер COM-сервером. Серверы, написанные с использованием ATL, часто имеют сценарий регистрации, встроенный в их таблицу ресурсов, но это не обязательно. И вам не нужно использовать ATL для написания COM-сервера. Сервисы, использующие "com-less-com", также будут иметь встроенный манифест. Вы можете отсканировать реестр (ниже HKLM/Classes/Software/), чтобы увидеть, зарегистрирован ли exe-файл, но может быть, что exe использует com без регистрации или просто еще не зарегистрирован.

Надеюсь, это поможет.

Для традиционной COM DLL вы можете найти известные экспортированные методы (поиск по msdn для этих методов)

  1. DllGetClassObject
  2. DllRegisterServer
  3. DllUnregisterServer
  4. DllCanUnloadNow

Я не уверен насчет EXE COM-серверов, потому что они обычно используют параметры командной строки для регистрации / отмены регистрации и для объекта класса обычно вызывает CoRegisterClassObject при запуске EXE.

Большинство COM-серверов традиционно также зарегистрированы в Реестре, но теперь вы можете создавать бесплатные серверы регистрации.

Вы также ищете сборку.NET с некоторыми видимыми классами COM?

Другие вопросы по тегам