Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
pythia — Инструмент для извлечения информации RTTI из исполняемых файлов Delphi, написанный на чистом Python | Kitploit
Инструменты/GitHubGitHub/nccgroup/pythia
Обратная инженерияАнализ вредоносных программАнализ Бинарных Файлов
GitHubnccgroup/pythia

pythia

Инструмент для извлечения информации RTTI из исполняемых файлов Delphi, написанный на чистом Python

Репозиторий
2476 лет назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Введение / tl;dr

Этот инструмент сканирует исполняемый файл на наличие данных Delphi, включая RTTI и виртуальные таблицы методов. Он выводит JSON-файл с информацией об обнаруженных классах и функциях, который можно использовать для дополнительного анализа, например:

  • Построить дерево классов.
  • Сгенерировать имена и комментарии для IDA.
  • Передать в дальнейшую обработку, например, в автоматическую декомпиляцию.

Также предоставляется скрипт IDAPython, который может загружать результат в IDA.

Скрипт был написан в дополнение к другим инструментам для реверс-инжиниринга Delphi.

Автор и лицензия

Выпущено как открытое ПО компанией NCC Group Plc - http://www.nccgroup.com/

Разработано Дэвидом Каннингсом (@edeca) [email protected]

http://www.github.com/nccgroup/pythia

Этот проект выпущен под лицензией AGPL. Дополнительную информацию см. в файле LICENSE.

Как это работает

Общий поток выполнения выглядит так:

  • Загрузить PE-файл и найти секции кода
  • Просканировать каждую секцию кода по 4 байта за раз
  • Определить потенциальные vftable и проверить их
  • Извлечь имя класса и связи с родителем
  • Определить наследование функций

Определение потенциальных vftable

vftable в Delphi хорошо документированы. Информация для последней версии доступна у Embarcadero. Неофициальная документация доступна для Delphi 2005 (см. здесь).

Исходный код Free Pascal также полезен (зеркало на Github).

Первый элемент vftable — vmtSelfPtr, который указывает на начало виртуальной таблицы методов. Скрипт сканирует каждый сегмент кода в PE-файле на предмет любого места, указывающего вперёд на +0x4C байт. Обратите внимание, что компилятор Delphi выравнивает vftable по границе 4 байта (для оптимизации).

Например, следующий виртуальный адрес 0x0046E1C8 содержит смещение 0x0046E214, которое находится на 0x4C байт впереди текущего местоположения. Как показано в IDA:

root@kitploit:~
.text:0046E1C8                   ; Classes::TComponent *vftable_TDCP_misty1
.text:0046E1C8 14 E2 46 00       vftable_TDCP_misty1 dd offset off_46E214

Такой подход может давать ложные срабатывания, поэтому другие поля vftable проверяются на правдоподобные значения. Например, vmtInstanceSize проверяется на чрезмерность, а указатели на функции должны находиться в исполняемой секции. Во время тестирования частота ложных срабатываний была очень низкой, несмотря на метод полного перебора.

Наследование

Каждая функция, найденная в vftable, проверяется на то, унаследована ли она от родителя или переопределена. Delphi не поддерживает множественное наследование, поэтому это можно определить, сравнив указатель в родительской vftable с тем же смещением.

Если оба указателя ссылаются на одну и ту же функцию, то она унаследована. Если у дочернего класса другой указатель, значит функция переопределена.

Пример вывода

Основной результат работы инструмента — JSON-файл, который можно передавать в последующую обработку / другие инструменты. Однако включено несколько дополнительных форматов вывода.

Дерево

Используйте опцию --save-tree, чтобы сгенерировать файл следующего вида:

root@kitploit:~
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 ..

Планы на будущее

  • Определять версию Delphi (например, по ресурсу PACKAGEINFO или DVCLAL) и настраивать сканирование для разных раскладок vftable.
  • Разбирать больше информации о классах, например, свойства (специфичный для Delphi элемент) и таблицы методов.
  • Разбирать информацию RTTI Delphi (vmtTypeInfo в vftable).
  • Дизассемблировать код с помощью Capstone и определять виртуальные вызовы (например, сопоставлять call [ecx+3Fh] с методом экземпляра).

Ограничения

  • Пока протестировано только для 32-битного кода. Пожалуйста, присылайте 64-битные примеры.
  • Поддерживаются только Windows PE-файлы (Delphi компилируется и в другие форматы).
  • Не является полноценным декомпилятором Delphi. Используйте DeDe / IDR / Hex-Rays.
  • Полезен только для Delphi-бинарей, использующих объекты (не все их используют).
  • Современный Delphi использует имена вида TComparer<System.Bindings.EvalProtocol.TPair<System.IInterface,System.Pointer>>, которые в IDA выглядят практически нечитаемыми.

Пожалуйста, присылайте примеры бинарей, на которых этот инструмент не работает, чтобы его можно было улучшить.

Скачать инструмент