История возникновения началась с того, что я сильно расплодил DAL и BLL используемых в разных проектах. И в один прекрасный момент мне стало интересно, используется или не используется специфический метод в дочерних проектах или его можно смело удалять никого не оповещая. Первая версия искала через рефлексию и загрузку через память. Но про ограничения разных методов поиска через рефлексию можно почитать в описании разных провайдеров загрузки плагинов. В результате, пришлось копать в сторону PE и CLI...
Интерфейс доступен в меню: View→Executables→PE/CLI View
Чтение PE файлов
Плагин может читать PE файл 2мя вариантами:
Win32Loader
— Через функцию LoadLibrary
StreamLoader
— Через управляемый класс System.IO.FileStream
Открыть PE файл можно из нескольких источников:
- Файловая система
- Запущенные процессы (Позволяет обойти упаковщики и необходимость подсчёта RVA)
- GAC
Настройки
MaxArrayDisplay
10 — Максимальная визуализация массивов.
ShowAsHexValue
False — Отображать цифры в виде десятичной или щестнадцатеричной системы исчисления.
ShowBaseMetaTables
False — Отображать в динамических структурах басзовые таблицы, вместо строго типизированных (Ближе к бинарному виду файла).
Loader
StreamLoader — Как загружать PE файл.
Win32Loader
— Через функцию LoadLibrary (RVA считать не нужно, но проверяйте файлы на вирусы)
StreamLoader
— Через управляемый класс System.IO.FileStream (Приходится подсчитывать правильные RVA)
MonitorFileChange
False — При обновлении файла на жёстком диске, файл автоматом обновится во всех открытых окнах отображения данных из текущего файла
Внешние методы
Type GetEntityType()
— Получить тип PEFile
Object CreateEntityInstance(Object dataItem)
— Создать экземпляр класса PEFile, передав в качестве аргумента путь к файлу на диске
Object[] GetSearchObjects()
— Получить массив файлов с расширениями *.dll, *.exe из папки, выбираемой в пользовательском интерфейсе.

Отображаемые директории
Интерфейс отображает информацию по следующим директориям и заголовкам
- DOS header (IMAGE_DOS_HEADER)
- PE/PE+ header (IMAGE_NT_HEADERS)
- File header (IMAGE_FILE_HEADER)
- Optional header (IMAGE_OPTIONAL_HEADER)
- COFF header (IMAGE_COFF_SYMBOLS_HEADER)
- Sections header (IMAGE_SECTION_HEADER[])
- Директории:
- Architecture
- Bound import
- Certificate
- CLR runtime header
- Metadata
- #~
- Module
- TypeRef
- TypeDef
- FieldPtr
- Field
- MethodPtr
- MethodDef
- ParamPtr
- Param
- InterfaceImpl
- MemberRef
- Constant
- CustomAttribute
- FieldMarshal
- DeclSecurity
- ClassLayout
- FieldLayout
- StandAloneSig
- EventMap
- EventPtr
- Event
- PropertyMap
- PropertyPtr
- Property
- MethodSemantics
- MethodImpl
- ModuleRef
- TypeSpec
- ImplMap
- FieldRVA
- ENCLog
- ENCMap
- Assembly
- AssemblyProcessor
- AssemblyOS
- AssemblyRef
- AssemblyRefProcessor
- AssemblyRefOS
- File
- ExportedType
- ManifestResource
- NestedClass
- GenericParam
- MethodSpec
- GenericParamConstraint
- #Strings
- #US
- #Guid
- #Blob
- Resource Table (Будет переписано в следующих версиях)
- VTable fixup
- Code Manager Table
- Export Address Table
- Managed Native Header
- Strong Name Signature
- Debug
- CodeView PDB2
- CodeView PDB7
- Misc (IMAGE_DEBUG_MISC)
- Delay Import Descriptor
- Список всех импортируемых библиотек
- Список всех импортируемых функций
- Exception Table
- Export Table
- Список всех экспортируемых функций
- Global Ptr
- IAT
- Import Table
- Список всех импортируемых библиотек
- Список всех импортируемых функций
- Load Config Table
- Base Relocation Table
- Relocation Blocks
- Relocation Sections
- Resource Table. Просмотр ресурсов:
- RT_STRING
- RT_HTML
- RT_MANIFEST
- RT_ACCELERATOR
- RT_MESSAGETABLE
- RT_DIALOG
- RT_MENU
- RT_VERSION
- TLS Table
Поддерживаемые структуры
Наименования структур и перечистлимых типов соответствует наименованиям в стандартном C++ заголовочном файле описывающего PE формат. Ниже, частично, приведены поддерживаемые структуры.
- DOS Headers
- PE/PE+ Headers
- IMAGE_FILE_HEADER
- IMAGE_OPTIONAL_HEADER32
- IMAGE_OPTIONAL_HEADER64
- IMAGE_NT_HEADERS32
- IMAGE_NT_HEADERS64
- IMAGE_SECTION_HEADER
- Unmanaged resources
- IMAGE_RESOURCE_DIRECTORY
- IMAGE_RESOURCE_DIRECTORY_ENTRY
- IMAGE_RESOURCE_DATA_ENTRY
- IMAGE_RESOURCE_DIRECTORY_STRING
- ACCELTABLEENTRY
- DLGTEMPLATE
- DLGITEMTEMPLATE
- DLGTEMPLATEEX
- DLGITEMTEMPLATEEX
- MENUHEADER
- MENUITEM
- MENUITEMPOPUP
- MENUITEMEX
- BITMAPINFOHEADER
- VS_VERSIONINFO
- VS_FIXEDFILEINFO
- VarFileInfo
- StringTable
- V_STRING
- FONTDIRENTRY
- MESSAGE_RESOURCE_BLOCK
- MESSAGE_RESOURCE_ENTRY
- IMAGE_IMPORT_DESCRIPTOR
- IMAGE_THUNK_DATA32
- IMAGE_THUNK_DATA64
- IMAGE_IMPORT_BY_NAME
- IMAGE_RUNTIME_FUNCTION_ENTRY
- IMAGE_DATA_DIRECTORY
- IMAGE_EXPORT_DIRECTORY
- IMAGE_BOUND_IMPORT_DESCRIPTOR
- IMAGE_BOUND_FORWARDER_REF
- WIN_CERTIFICATE
- ImgDelayDescr
- IMAGE_BASE_RELOCATION
- IMAGE_LOAD_CONFIG_DIRECTORY32
- IMAGE_LOAD_CONFIG_DIRECTORY64
- IMAGE_TLS_DIRECTORY32
- IMAGE_TLS_DIRECTORY64
- Debug directory
- IMAGE_DEBUG_DIRECTORY
- CV_INFO_PDB70
- CV_HEADER
- CV_INFO_PDB20
- IMAGE_DEBUG_MISC
- .NET CLI
- IMAGE_COR20_HEADER
- IMAGE_COR20_METADATA
- IMAGE_COR20_VTABLE
- ResourceManagerHeader
- ResourceSetHeader
- ResourceItem
- STREAM_HEADER
- STREAM_TABLE_HEADER