Синтаксический анализ простого файла Win32 PE (Exe / DLL) in.NET


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

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

3 9

3 ответа:

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

UPDATE: если ваша библиотека dll является библиотекой c++, созданной последней версией компилятора Microsoft C++, то вы можете удалить искаженное имя, чтобы получить большую часть подписи, вызвав эту функцию: UnDecorateSymbolName из отладки Инструменты для Windows . Однако возвращаемое значение не включается в искаженное имя.

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

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

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