Этот инструмент сканирует исполняемый файл для данных Delphi, включая RTTI и таблицы виртуальных функций. Он выводит файл JSON с информацией об идентифицированных классах и функциях, которые можно использовать для дополнительного анализа, например:
Предусмотрен сценарий IdapyThon, который может загрузить выход в IDA.
Сценарий был написан для дополнения других инструментов для обратной инженерии Delphi.
Выпущен как открытый исходный код от NCC Group PLC - http://www.nccgroup.com/
Разработано Дэвидом Каннингсом (@edeca) [email protected]
http://www.github.com/nccgroup/pythia
Этот проект выпущен по лицензии AGPL. Пожалуйста, смотрите лицензию для получения дополнительной информации.
Поток высокого уровня:
Delphi Vftables хорошо задокументированы. Информация о последней версии доступна от Embarcadero. Неофициальная документация доступна для Delphi 2005 (см. Здесь).
Исходный код для бесплатного Pascal также полезен (зеркало Github).
Первым элементом в VFT является vmtSelfPtr , который указывает на начало таблицы виртуальных функций. Сценарий сканирует каждый сегмент кода в файле PE для любого местоположения, указывающего вперед +0x4C байты. Обратите внимание, что компилятор Delphi выравнивает Vftables по границе 4 байта (для оптимизации).
Например, следующий VA 0x0046E1C8 содержит смещение 0x0046E214 , которое на 0x4C впереди текущего местоположения. Как показано в IDA:
.text:0046E1C8 ; Classes::TComponent *vftable_TDCP_misty1
.text:0046E1C8 14 E2 46 00 vftable_TDCP_misty1 dd offset off_46E214
Этот подход может генерировать ложные срабатывания, поэтому другие поля в VFT, проверенные на наличие разумных значений. Например, vmtInstanceSize проверяется, чтобы убедиться, что он не чрезмерный, а указатели функций подтверждаются, чтобы лежать в исполняемом разделе. Во время тестирования ложная положительная скорость была очень низкой, несмотря на метод поиска грубой силы.
Каждая функция, найденная в VFT, проверяется, чтобы увидеть, унаследован ли она от родителя или перегружена. Delphi не поддерживает множественное наследование, поэтому это может быть достигнуто путем проверки указателя в родительском vftable с одинаковым смещением.
Если оба указателя ссылаются на одну и ту же функцию, она унаследована. Если у ребенка есть другой указатель, он был перегружен.
Основным выводом инструмента является файл JSON, который можно подавать в последующую обработку / инструменты. Тем не менее, несколько других выходных форматов включены.
Используйте опцию --save-tree , чтобы сгенерировать файл, подобный:
TObject (at 0x0040112c)
|-- Exception (at 0x004081f8)
| |-- EAbort (at 0x00408260)
| |-- EAbstractError (at 0x00408ad4)
| |-- EAssertionFailed (at 0x00408a74)
| |-- EBcdException (at 0x004bd110)
| | +-- EBcdOverflowException (at 0x004bd16c)
| |-- EBitsError (at 0x0041ab04)
| |-- EComponentError (at 0x0041abbc)
| |-- EConvertError (at 0x00408850)
| |-- EDCP_cipher (at 0x0046a0ac)
| | +-- EDCP_blockcipher (at 0x0046a29c)
| |-- EDCP_hash (at 0x00469f20)
.. etc ..
PACKAGEINFO или DVCLAL Resource) и настройте сканирование для различных VFT -макетов.call [ecx+3Fh] с методом экземпляра)TComparer<System.Bindings.EvalProtocol.TPair<System.IInterface,System.Pointer>> , которые довольно не подлежат необходимости в IDA.Пожалуйста, пришлите мне примеры двоичных файлов, где этот инструмент не работает, поэтому его можно улучшить.