
Ein IDAPython-Modul zur Verbesserung der C++-Unterstützung auf Basis von ida_kernelcache
Ein IDAPython-Modul für eine deutlich komfortablere Art des Reverse Engineering von iOS-Kernelcaches.
Ein großer Teil des iOS-Kernelcaches ist in C++ geschrieben, das zu kompliziertem Binärcode kompiliert wird, der viele Virtual-Table-Dereferenzierungen anstelle von expliziten direkten Aufrufen verwendet. ida_kcpp nutzt die Rekonstruktion der Klassenhierarchie von ida_kernelcache. Es bildet die IDB ab und synchronisiert die Binärfunktionen mit den ursprünglichen virtuellen Methoden. Es ermöglicht die Navigation durch den iOS-Kernelcache per Doppelklick auf einen C++-Virtual-Method-Aufruf, das Auffinden ihrer Xrefs und hält all dies während der Live-Recherche synchronisiert.
ida_kcpp ist von ida_medigate inspiriert, profitiert jedoch von der einzigartigen Struktur des iOS-Kernelcaches und bietet eine leistungsfähigere und komfortablere Rechercheumgebung.

Keines der beiden ist auf PyPI verfügbar, daher folge den Installationsanweisungen in ihren Repos.
Mit ida-setup:
ida-setup plugin install -e /path/to/ida-kcpp
Oder manuell:
ida_kernelcache und ida_kcpp im IDA-Python-Pfad liegen.Kann auch durch Hinzufügen in ~/.idapro/idapythonrc.py ergänzt werden:
import sys
sys.path.append(IDA_KCPP_PATH)
sys.path.append(IDA_KERNELCACHE_PATH)
~/.idapro/plugins/ida_kcpp_plugin.py auf ida_kcpp_plugin.pyida_kernelcache noch nicht ausgeführt wurde, bitte ausführen über edit >> Plugins >> Kernel Cache CPP >> ida_kernelcache process kernelEdit >> Plugins >> Kernel Cache CPP >> Perform Initial sync... aus (Es können einige Warnungs-Messageboxen erscheinen, diese können vorerst ignoriert werden). Dieser Schritt benennt die Namen der virtuellen Funktionen um, indem deren Präfix auf die Klasse gesetzt wird, zu der sie gehören. Dieser Schritt dekompiliert außerdem alle virtuellen Funktionen, setzt deren this-Argument und ändert das relevante ::vmethods-Member in einen Funktionszeiger auf den dekompilierten Typ. Dieser Schritt kann eine Weile dauern...ida_kcpp propagiert automatisch Namen und Prototypen und ändert außerdem einige Aspekte der Navigation in IDA, daher wird es nicht automatisch aktiviert, kann aber jederzeit aktiviert oder deaktiviert werden.
Aktiviere ida_kcpp durch Klicken auf edit >> Plugins >> Kernel Cache CPP >> Activate Plugin (Dies installiert die Hexrays-Hooks und führt außerdem ida_kernelcache.collect_class_info() aus)
Klicken auf Edit >> Plugins >> Kernel Cache CPP >> Deactivate Plugin
Beim Umbenennen einer virtuellen Funktion kann man den mangled Namen bearbeiten (zum Beispiel __ZNK10AppleA7IOP9method_86Ev_99) oder ihn in menschenlesbare Namen ändern (AppleA7IOP::method_86), die automatisch gemangelt werden. Das relevante ANCESTOR::vmethods-Member wird ebenfalls umbenannt, und auch alle virtuellen Funktionen, die dieselbe virtuelle Methode implementieren, werden umbenannt.
Dasselbe gilt für das Ändern von Prototypen virtueller Funktionen. In diesem Fall wird der Prototyp des relevanten ANCESTOR::vmethods-Members in einen Funktionszeiger auf den gerade gesetzten Typ geändert, wobei this als ANCESTOR * gesetzt wird. Außerdem werden die Prototypen aller relevanten Implementierungen der virtuellen Methode der DESCENDANTS von ANCESTOR geändert, wobei deren this auf DESCENTANT * gesetzt wird.
::vmethods-Member hinzu.ida_referee können wir die Verwendungen jedes Feldes verfolgen, insbesondere des ::vmethods-Members (virtuelle Aufrufe) im Dekompiler.
CTRL+SHIFT+Y von einer virtuellen Funktion hinzugefügt, um direkt das xrefs-Fenster für ihr relevantes ::vmethod-Member zu öffnen. IDA hat einen Bug, und dies funktioniert nur aus dem Disassembly-Fenster und nicht aus dem Dekompiler.Dekompiler: Ein Doppelklick auf einen Aufruf einer virtuellen Funktion öffnet ein Fenster, das es dem Benutzer ermöglicht, die Implementierung der virtuellen Methode auszuwählen.

Local Types-Ansicht (Shift+F1):
Cmd+Enter auf einer virtuellen Methode navigiert ebenfalls zur Implementierung (sauberere Alternative zum Doppelklick):: enthält, nicht springt.Verfasst von Uriel Malin, Ievgen Solodovnykov und Omer Porzecanski von Cellebrite Labs. Entwickelt und getestet für IDA 9.2 auf macOS mit Python 3.13