
фреймворк Ghidra для реверс-инжиниринга kernelcache iOS
Этот фреймворк является конечным продуктом моего опыта в реверс-инжиниринге Kernelcache. Обычно я ищу уязвимости путем ручного аудита ядра и его расширений и автоматизировал большинство вещей, которые действительно хотел видеть в Ghidra, чтобы ускорить процесс реверсинга, и это оказалось эффективным и экономит много времени. Фреймворк работает на iOS 12/13/14/15 и на macOS 11/12 (как kernelcache, так и одиночные KEXT) и был опубликован с намерением помочь людям начать исследования ядра iOS без необходимости готовить собственное окружение. Как я считаю, этот фреймворк (включая набор инструментов, которые он предоставляет, и некоторые базовые знания IOKit) достаточен для начала взлома Kernelcache.
Фреймворк полностью написан на Python и может быть расширен для создания других инструментов. Он предоставляет несколько базовых API, которые можно использовать практически в любом проекте, экономя время на чтение многословной документации. Вы можете ознакомиться с основными функциями в каталоге utils/.
Ghidra хорош при анализе Kernelcache, но, как и другие инструменты RE, требует некоторой ручной работы. ghidra_kernelcache предоставляет хорошую отправную точку для исправления проблем как в начале, так и в процессе реверс-инжиниринга, обеспечивая качественный вывод декомпилятора.
Существует похожий проект, созданный @_bazad в IDAPro под названием ida_kernelcache, который предоставляет хорошую отправную точку для исследователей, желающих работать с образом ядра в IDA. Мой фреймворк немного похож на работу Брэндона, но выходит за ее рамки, предлагая гораздо больше возможностей, чтобы сделать процесс работы с kernelcache менее болезненным.
::externalMethod(), так и для ::getTargetAndMethodForIndex().Эти возможности реализованы в виде отдельных инструментов, которые можно запускать либо с помощью горячих клавиш, либо щелчком по их значкам на панели инструментов.
Клонируйте репозиторий:```sh git clone https://github.com/0x36/ghidra_kernelcache.git
**Важное примечание**: Проект протестирован на Ghidra 10.1_PUBLIC и 10.2_DEV и не является обратно совместимым.
Перейдите в *`Windows → Script Manager`*, нажмите на *`script Directory`*, затем добавьте *`ghidra_kernelcache`* в список путей к каталогам.
Перейдите в *`Windows → Script Manager`*, в списке *scripts* перейдите в категорию *`iOS→kernel`* и отметьте плагины, которые там видны, они появятся на панели инструментов GHIDRA.
В каталоге [logos/](https://github.com/0x36/ghidra_kernelcache/tree/master/logos) вы можете разместить свои собственные логотипы для каждого инструмента.
## Символизация iOS kernelcache
`ghidra_kernelcache` на первом этапе требует [iometa](https://github.com/Siguza/iometa/) (создан [@s1guza](https://twitter.com/s1guza)), мощный инструмент, предоставляющий информацию о классах C++ в двоичном файле ядра. Замечательно то, что он работает как отдельный бинарный файл, поэтому вывод можно импортировать в вашу любимую среду обратной разработки, просто проанализировав его. Моя среда берет вывод iometa и анализирует его для символизации и исправления виртуальных таблиц.
### Использование
После распаковки ядра выполните следующие команды:```sh
$ iometa -n -A /tmp/kernel A10-legacy.txt > /tmp/kernel.txt
# if you want also to symbolicate using jtool2
$ jtool2 --analyze /tmp/kernel
Загрузите kernelcache в Ghidra, НЕ ИСПОЛЬЗУЙТЕ BATCH import, загрузите его как образ Mach‑O.
После загрузки и автоматического анализа Kernelcache нажмите на иконку на панели инструментов или просто нажмите Meta‑Shift‑K, затем укажите полный путь к выводу iometa, который в нашем случае — /tmp/kernel.txt.
Если вы хотите использовать символы jtool2, вы также можете использовать jsymbol.py, расположенный в категории iOS→kernel.
Полные примеры API находятся в ghidra_kernelcache/kc.py
→ Вот несколько примеров манипуляции объектами классов:```py from utils.helpers import * from utils.class import * from utils.iometa import ParseIOMeta
ff = "/Users/mg/ghidra_ios/kernel.txt" iom = ParseIOMeta(ff) Obj = iom.getObjects() kc = kernelCache(Obj)
kc.process_all_classes()
kc.process_classes_for_bundle("com.apple.iokit.IOSurface")
kc.process_classes_for_bundle("kernel")
kc.process_class("IOGraphicsAccelerator2")
kc.clear_class_structures()
kc.update_classes_vtable()
kc.explore_pac()
Как видите, вы можете полностью или частично символизировать kernelcache, если была выбрана частичная символизация, `ghidra_kernelcache` автоматически построит все зависимости классов перед продолжением.
Если запустить скрипт для всего kernelcache (полная символизация), `ghidra_kernelcache` потратит несколько минут на анализ образа ядра.
После завершения Ghidra предоставит следующее:
→ В фильтр закладок добавлена новая категория под названием «iOS»:
<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image1.png" alt="изображение1" width="200"/>
→ Виртуальные таблицы классов IOKit добавлены в закладку «iOS» для лучшего и более быстрого поиска виртуальных таблиц; вы можете просто искать kext или класс, вводя буквы, слова или пакет kext в строке поиска.
<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image2.png" alt="изображение2"/>
→ Исправление виртуальной таблицы: дизассемблирует/компилирует неизвестный код, исправляет пространства имён, повторно символизирует методы класса и применяет определение функции к каждому методу:
<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image3.png" alt="изображение3"/>
→ Создание пространств имён классов и помещение каждого метода в соответствующее пространство имён:
<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image4.png" alt="изображение4"/>
→ Создание структуры класса с учётом иерархии классов:
<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image5.png" alt="изображение5"/>
→ Создание vtable классов, и каждый метод имеет собственное определение метода для лучшего вывода декомпиляции:
<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image6.png" alt="изображение6"/>
Полная реализация находится в [`utils/class.py`.](https://github.com/0x36/ghidra_kernelcache/blob/master/utils/class.py)
Вот несколько скриншотов до и после символизации с помощью `ghidra_kernelcache`:
<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image7.png" alt="изображение7"/>
<img src="https://raw.githubusercontent.com/0x36/ghidra_kernelcache/master/screenshots/image8.png" alt="изображение8"/>