
IDAPython инструмент для автоматического создания виртуальных таблиц C++ в IDA Pro
Virtuailor - это инструмент IDAPython, который восстанавливает vtable для C++ кода, написанного для архитектуры Intel, как 32-битного, так и 64-битного, а также AArch64 (Новинка!). Инструмент состоит из двух частей: статической и динамической.
Первая часть - статическая, содержит следующие возможности:
Вторая часть - динамическая, содержит следующие возможности:
Virtuailor теперь поддерживает версии IDA от 7.0 до новейшей (7.5). Если вы используете версии IDA старше 7.4, вам нужно переключиться на ветку beforeIDA-7.4. Ветка master поддерживает новейшую доступную версию (7.5).
if __name__ == '__main__':
start_addr_range = idc.MinEA() # You can change the virtual calls address range
end_addr_range = idc.MaxEA()
add_bp_to_virtual_calls(start_addr_range, end_addr_range)
Опционально (но крайне рекомендуется) создайте снимок вашей idb. Просто нажмите ctrl+shift+t и создайте снимок.
Нажмите File->Run script..., затем перейдите в папку Virtuailor и выберите запуск Main.py. Вы можете посмотреть следующую гифку для более наглядного объяснения.

Теперь графический интерфейс предложит вам выбрать диапазон для анализа. Если вы хотите проанализировать весь бинарный файл, просто нажмите OK со значениями по умолчанию в начальном и конечном адресах.
После этого точки останова будут размещены в вашем коде, и всё, что вам нужно сделать, - это выполнить код с помощью отладчика IDA, выполнить любые необходимые действия и увидеть, как строятся vtable! Для AArch64 вы можете настроить удалённый gdb-сервер и отлаживать с помощью отладчика IDA.
Если вам больше не нужны точки останова, просто перейдите на вкладку списка точек останова в IDA и удалите их по своему усмотрению.
Также для меня очень важно отметить, что это вторая версия инструмента с поддержкой как 32, так и 64 бит, а также AArch64. Вероятно, в некоторых случаях небольшое количество точек останова будет пропущено. В таких случаях, пожалуйста, создайте issue и свяжитесь со мной, чтобы я смог улучшить код и помочь исправить это. Заранее спасибо за это :)
Структуры, которые Virtuailor создаёт на основе vtable, использованных в сработавших виртуальных вызовах. Функции vtable извлекаются из памяти на основе соответствующего регистра, который использовался в опкоде BP.

Поскольку я хотел создать корреляцию между структурой в IDA и vtable в секции данных, BP изменяет имя адреса vtable в секции данных на имя структуры. Как вы можете видеть на следующем изображении:

Имена виртуальных функций также изменяются, за исключением случаев, когда имена не являются именами IDA по умолчанию (функции с символами или функции, изменённые пользователем). В таких случаях имена функций останутся прежними и также будут добавлены в структуру vtable с их текущими именами.
Выбранные имена строятся по следующему шаблону:
После создания vtable Virtuailor также добавляет связь между созданной структурой и ассемблером, как вы можете видеть на следующих изображениях:

P.S: Смещение структуры, используемое в BP, актуально только для последнего выполненного вызова. Чтобы получить лучшее понимание всех выполненных виртуальных вызовов, была добавлена функция xref, как объяснено в следующем разделе.
При статическом реверс-инжиниринге C++ не тривиально увидеть, кто кого вызвал, потому что большинство вызовов являются косвенными. Однако после запуска Virtuailor каждая функция, которая была вызвана косвенно, теперь имеет xref на эти места.

Инструмент был представлен на RECon Brussels, Troopers и Warcon. Презентацию можно найти по следующей ссылке: https://www.youtube.com/watch?v=Xk75TM7NmtA
Командам RECon Brussels, Troopers, Warcon, а также Nana, @tmr232, @matalaz, @oryandp, @talkain, @shiftreduce
Плагин лицензирован под лицензией GNU GPL v3.