2010-04-21 4 views
4

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

Есть ли какие-либо Windows API для этой цели?

ответ

0

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

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

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

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

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

+2

Не лучше ли GetClassObject лучше? Это необходимо для создания объекта, но работа DllRegisterServer могла быть выполнена программой установки. – ixe013

+1

Обратите внимание, что COM-файлы DLL абсолютно могут иметь DllMain. Имейте в виду, что DLL COM - это всего лишь особый тип DLL Win32, но он все еще является dll Win32, поэтому он может делать все, что может использовать DLL Win32. В любом случае DllMain не является экспортом, поэтому вы не найдете его с GetProcAddress; это действительно точка входа загрузчика. Проверка наличия/отсутствия DllGetClassObject, скорее всего, будет лучшим выбором. – BrendanMcK

+1

Кроме того, для чего стоит, если безопасность является проблемой, вам следует избегать использования LoadLibrary в ненадежной DLL, поскольку в результате будет выполняться DLL-код DllMain в вашем процессе - presto, вы только что выполнили ненадежный код. Это может быть или не быть проблемой в зависимости от того, как ваше приложение используется, но в любом случае стоит осознавать проблему. (Вместо этого можно использовать LoadLibraryEx (LOAD_LIBRARY_AS_DATAFILE), но я не знаю, будет ли GetProcAddress работать тогда, вам может понадобиться вручную разобрать таблицу экспорта). – BrendanMcK

0

Для традиционного COM DLL, вы можете посмотреть на хорошо известных экспортированных методов (поиск по MSDN для этих методов)

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

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

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

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

+0

У меня есть некоторые PE (COM EXE, COM DLL, Win32 EXE, Win32 DLL), из которых мне нужно извлечь все экспортированные функции и разоблаченные интерфейсные методы (в случае COM). Теперь для этого требуется проверить, есть ли его WIN32 DLL/EXE или COM DLL/EXE. Таким образом, если его COM EXE мы можем пересечь его vtable, чтобы получить все открытые методы или интерфейсы, и если его WIN 32 DLL/EXE, нам нужно прочитать его таблицу экспорта для извлечения экспортированных символов. – Usman

+0

Usman, COM-серверы - это просто исполняемые файлы Win32, которые соответствуют спецификации COM как часть реализации. Формат PE не хранит информацию о том, является ли PE COM или простой Win32. Вы всегда можете разобрать PE-файл (я думаю, что был образец в msdn), но нет специальной подписи «COM». Для вашей функциональности я бы рекомендовал вам ознакомиться со спецификацией COM и минимальными требованиями к тому, чтобы DLL или EXE были COM-сервером. Как я упоминал ранее, минимальные требования к COM-DLL-серверам - это экспорт известных функций в соответствии со спецификацией COM. – byte

Смежные вопросы