Разбор простого Win32 PE-файла (Exe / DLL) в .NET - PullRequest
9 голосов
/ 23 мая 2010

Мне нужно проанализировать простую Win32 DLL / Exe и получить все импортные и экспортные данные из нее для отображения на консоли или в графическом интерфейсе (т. Е. Win Forms).Можно ли проанализировать Win32 DLL / Exe в C # .NET, читая его таблицы экспорта / импорта и получать из него управляемые типы?Поскольку это неуправляемый PE, .NET не позволяет преобразовывать неуправляемые PE-файлы в управляемые сборки .NET, он генерирует только управляемые COM-сборки.

Как можно проанализировать эти таблицы и использовать все их методы (подписи) в управляемой форме.(например, если char * в качестве аргумента, он должен отображаться как IntPtr).

Ответы [ 3 ]

4 голосов
/ 23 февраля 2016

Посмотрите библиотеку PeNet для .Net.Он может анализировать и перечислять вам все экспорты / импорты DLL.Вы можете получить его из github или напрямую как пакет NuGet.https://github.com/secana/PeNet https://www.nuget.org/packages/PeNet/

(отказ от ответственности: я являюсь автором проекта)

2 голосов
/ 24 мая 2010

Синтаксический анализ PE-файлов возможен с использованием Спецификации документа Microsoft Portable Executable . Однако, как отметил Логан, подписи не включены в PE-файл; включены только имена экспортируемых функций.

ОБНОВЛЕНИЕ: Если ваша dll является DLL-библиотекой C ++, созданной последней версией компилятора Microsoft C ++, вы можете отменить выделение искаженного имени, чтобы получить большую часть подписи, вызвав эту функцию: UnDecorateSymbolName из Средства отладки для Windows . Однако возвращаемое значение не включено в искаженное имя.

2 голосов
/ 23 мая 2010

Что касается второй части вашего вопроса, получение сигнатур метода, как правило, невозможно. Эта информация обычно не хранится в самом PE. Для функций C ++ это возможно, поскольку искаженное имя закодирует эту информацию, но многие библиотеки DLL не предоставляют интерфейсы C ++. Для интерфейсов COM эта информация хранится в библиотеке типов, часто встроенной в качестве ресурса в PE. Чтобы увидеть, возможно ли это для конкретных dll, которые вы имеете в виду, вы можете использовать dumpbin и undec, чтобы увидеть, являются ли функции искаженными именами C ++. Если нет, вам понадобится другой источник информации, такой как заголовочные файлы, для создания правильных сигнатур P / Invoke (в этом случае вам, вероятно, не нужно анализировать PE-файл).

...