Синтаксический анализ простого файла Win32 PE (Exe / DLL) in.NET
Мне нужно разобрать обычный Win32 DLL/Exe и получить все импорт и экспорт из него, чтобы показать на консоли или GUI (т. е. Win формы). Можно ли разобрать Win32 DLL / Exe в C#.NET читая его таблицы экспорта / импорта и получая из него управляемые типы? Поскольку это неуправляемый PE, .NET не позволяет конвертировать неуправляемые PE-файлы в управляемые сборки .NET, он только создает управляемые сборки COM.
Как я могу проанализировать эти таблицы и принять все свои методы (сигнатуры) в управляемой форме. (например, если char* как аргумент, он должен отображаться как IntPtr).
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-файл).