Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
ida_kernelcache — Ein IDA-Toolkit zur Analyse von iOS-Kernelcaches. | Kitploit
Tools/GitHubGitHub/bazad/ida_kernelcache
Embedded-System-SicherheitStatische AnalyseiOS-SicherheitSchwachstellenanalyseReverse EngineeringDebuggerMobile SicherheitBinäranalyseFirmware-Analyse
GitHubbazad/ida_kernelcache

ida_kernelcache

Ein IDA-Toolkit zur Analyse von iOS-Kernelcaches.

30585vor 6 JahrenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen
Repository anzeigen

ida_kernelcache: Ein IDA-Toolkit zur Analyse von iOS-Kernelcaches

ida_kernelcache ist ein IDAPython-Modul für IDA Pro, das die Arbeit mit iOS-Kernelcaches erleichtert. Das Modul bietet Funktionen zum:

  • Konvertieren der neuen statischen getaggten Zeiger von iOS 12 in normale Kernel-Zeiger.
  • Parsen des __PRELINK_INFO-Segments des Kernels in ein Python-Wörterbuch.
  • Umbenennen der Segmente in IDA entsprechend dem Namen der Kernel-Erweiterung, dem Mach-O-Segment und dem Mach-O-Abschnitt.
  • Konvertieren identifizierbarer Zeiger in einigen Segmenten in IDA-Offsets.
  • Rekonstruieren der C++-Klassenhierarchie auf Grundlage der OSMetaClass-Informationen.
  • Symbolisieren von virtuellen C++-Methodentabellen (sowohl der vtable selbst als auch ihrer Methoden).
  • Symbolisieren von Offsets in __got-Abschnitten und Stub-Funktionen in __stubs-Abschnitten.
  • Automatisches Erzeugen von IDA-Strukturen, die die virtuellen C++-Methodentabellen repräsentieren.
  • Automatisches Erzeugen von IDA-Strukturen, die die C++-Klassen im Kernelcache auf der Grundlage beobachteter Zugriffsmuster repräsentieren.

Die Hauptverarbeitungsfunktion ist dafür ausgelegt, vor jeder manuellen Analyse oder jedem Reverse Engineering ausgeführt zu werden. Mit den Standardeinstellungen übersieht IDA im Kernelcache viele nützliche Informationen. Diese Skripte helfen IDA, indem sie die bekannte Struktur des Kernelcaches nutzen, um nützliche Informationen automatisch weiterzugeben.

Zusätzlich zur Standardfunktionalität des Moduls enthält ida_kernelcache mehrere Skripte, die die Analyse des iOS-Kernelcaches erleichtern. So können Sie die Skripte beispielsweise verwenden, um von einer Funktion verwendete C-Strukturen automatisch zu erzeugen.

Viele der in ida_kernelcache verwendeten Techniken wurden für memctl entwickelt und direkt daraus übernommen.

Versionen

ida_kernelcache wurde mit IDA Pro 6.95 an Kernelcaches für die iOS-Versionen 10.1.1, 11.0, 11.2, 11.3.1 und 12.0 Beta getestet. Derzeit werden nur Arm64-Kernelcaches ab iOS 10 unterstützt.

Erste Schritte

Sie benötigen eine bereits dekomprimierte Kernelcache-Datei, die in IDA geladen ist. Die URL zum Herunterladen eines bestimmten IPSW von Apple finden Sie online, und es gibt eine Reihe öffentlicher Tools (einschließlich memctl), die den Kernelcache dekomprimieren können.

Wählen Sie in IDA in der Menüleiste „Datei“ -> „Skript-Datei...“ und dann das Skript ida_kernelcache.py im Hauptverzeichnis. Dadurch wird das Modul ida_kernelcache unter den Namen ida_kernelcache und kc in den IDAPython-Interpreter geladen. Geben Sie in der IDAPython-Eingabeaufforderung kc.kernelcache_process() ein und drücken Sie die Eingabetaste, um die Analyse des Kernelcaches zu starten. Diese Funktion führt alle wichtigen Analysen aus, die von ida_kernelcache unterstützt werden. Die Funktion läuft mehrere Minuten, während IDA neue Funktionen identifiziert und analysiert.

ida_kernelcache versucht, Benutzernamen für Adressen nicht zu überschreiben. Das bedeutet, dass die Ergebnisse möglicherweise nicht so gründlich ausfallen, wenn der Kernelcache vor der Initialisierung mit kernelcache_process manuell analysiert wurde, da benutzerdefinierte Namen die automatische Namensweitergabe blockieren können. Es gibt jedoch auch keine Garantie, dass ida_kernelcache eine frühere Analyse nicht durcheinanderbringt. Wenn Sie sich also entscheiden, kernelcache_process für eine bereits analysierte Kernelcache-Datei auszuführen, erstellen Sie zuerst ein Backup.

Das ida_kernelcache-Modul

ida_kernelcache soll über ida_kernelcache.py geladen werden; die Untermodule im Verzeichnis ida_kernelcache sind nicht für das direkte Laden gedacht. ida_kernelcache stellt jedoch die Funktionalität vieler dieser Untermodule bereit. Hier ist, was jedes von ihnen tut:

  • ida_utilities: Dieses Modul kapselt einige Funktionen von IDA, um eine benutzerfreundlichere API bereitzustellen. Besonders nützlich sind is_mapped, read_word, read_struct, force_function und ReadWords. is_mapped prüft, ob eine Adresse gemappt ist, und optional, ob sie einen bekannten Wert enthält. read_word liest ein Wort variabler Größe von einer Adresse. read_struct liest einen Strukturtyp in ein Python-Wörterbuch oder ein Python-Zugriffsobjekt, was das Parsen von Datenstrukturen erheblich erleichtert. force_function versucht verschiedene Tricks, um eine Adresse in IDA in den Anfang einer Funktion umzuwandeln. ReadWords ist ein Generator, der über Datenwörter und ihre Adressen in einem Bereich iteriert.

  • build_struct: Dieses interne Modul enthält Hilfsmittel, um eine IDA-Struktur automatisch auf der Grundlage einer Sequenz von Zugriffen auf die Struktur zu befüllen.

  • class_struct: Dieses Modul stellt Funktionen zur Erzeugung von IDA-Strukturen bereit, die virtuelle C++-Methodentabellen und -Klassen repräsentieren. scannt die (symbolisierten) Tabellen virtueller Methoden und erstellt IDA-Strukturen zur Aufnahme von Zeigern auf virtuelle Methoden. führt eine Datenflussanalyse der virtuellen Methoden durch, um Zugriffe auf die Felder jeder Klasse zu identifizieren, und erstellt dann IDA-Strukturen, die die Klassen repräsentieren. Anweisungen, die offenbar auf ein Feld verweisen, werden ebenfalls in Strukturoffset-Verweise umgewandelt. Weitere Einzelheiten finden Sie im Docstring des Moduls.

Weitere Skripte

Das Skript ida_kernelcache_reload.py ist mit ida_kernelcache.py identisch, außer dass es das Neuladen des Moduls ida_kernelcache und aller Untermodule erzwingt. Es ist hauptsächlich für die Entwicklung nützlich.

Das Verzeichnis scripts enthält Skripte, die ida_kernelcache verwenden, um eine bestimmte Art von Analyse durchzuführen. Diese Skripte sind zu spezifisch, um Teil des Hauptmoduls ida_kernelcache zu sein, aber sie sind beim Reverse Engineering des Kernelcaches nützlich. Dazu gehören:

  • find_virtual_method_overrides.py: Ein Skript zum Finden von Nachkommen einer Klasse, die eine virtuelle Methode überschreiben, die die angegebene Zeichenfolge enthält. Übereinstimmende Überschreibungen werden auf der Konsole ausgegeben.

  • populate_struct.py: Befüllt Felder für eine C++-Klasse oder eine C-Struktur, indem eine Datenflussanalyse ab der aktuellen Adresse durchgeführt wird.

  • process_external_methods.py: Verarbeitet ein IOExternalMethod- oder IOExternalMethodDispatch-Array in eine Standardform zur Verwendung durch Fuzzing-Tools.

Klassenrekonstruktion

Wenn Sie den Hex-Rays-Dekompilierer verwenden, ist eines der interessantesten Merkmale von ida_kernelcache die automatische Rekonstruktion von C++-Klassen, die die OSMetaClass-Informationen und die Datenflussanalyse nutzt, um IDA-Strukturen zu erstellen, die die im Kernelcache gefundenen Klassen repräsentieren. Diese Repräsentationen können die Lesbarkeit der Pseudocode-Darstellung erheblich verbessern. Weitere Informationen finden Sie im Beitrag Reconstructing C++ classes in the iOS kernelcache using IDA Pro.

Das neue iOS-12-Kernelcache-Format

Mit iOS 12 führte Apple auf einigen Geräten ein neues Kernelcache-Format ein. Zu den Änderungen gehört, dass die Kernel-Zeiger dieses neuen Kernelcaches getaggt sind, um sie in einer Liste zu verketten, vermutlich damit iBoot den Kernel ohne die _PrelinkLinkKASLROffsets-Daten im Prelink-Wörterbuch verschieben kann. Die Analyse eines Standard-Kernelcaches in diesem Format ist in IDA aufgrund der fehlenden Querverweise schwierig. Einzelheiten finden Sie im Artikel Analyzing the iOS 12 kernelcache's tagged pointers.

Wenn Sie die Zeiger im Kernelcache nur von ihren Tags befreien möchten, ohne eine weitere Verarbeitung durchzuführen, führen Sie kc.tagged_pointers.untag_pointers() aus.

Eine Anmerkung zur Verallgemeinerung

Ein Teil dieser Funktionalität lässt sich vermutlich über Apple-Kernelcaches hinaus anwenden (z. B. Vtable-Analyse und Symbolweitergabe oder die meisten Funktionen in ida_utilities.py). Dennoch habe ich den Importbereich auf das Modul ida_kernelcache beschränkt, da ich nichts davon mit anderen Arten von Binärdateien getestet habe.

Lizenz

ida_kernelcache wird unter der MIT-Lizenz veröffentlicht.

Ein Großteil der Funktionalität in ida_kernelcache stammt aus memctl, das ebenfalls unter der MIT-Lizenz veröffentlicht wird. Weitere Quellen sind in den Kommentaren in den entsprechenden Dateien vermerkt.


Brandon Azad

Tool herunterladen
initialize_vtable_structs
initialize_class_structs
  • classes: Dieses Modul definiert den Typ ClassInfo, der Informationen über C++-Klassen im Kernelcache speichert, und stellt die Funktion collect_class_info bereit, die den Kernelcache nach Klassen durchsucht und das globale Wörterbuch class_info mit einer Zuordnung von Klassennamen zu ClassInfo-Objekten befüllt. Der Typ ClassInfo erfasst für jede C++-Klasse den Klassennamen, die OSMetaClass-Instanz, die Tabelle der virtuellen Methoden und den Namen der Superklasse. Darüber hinaus speichert jedes ClassInfo-Objekt Verweise auf das ClassInfo der Superklasse und das ClassInfo aller direkten Unterklassen, wodurch die Klassenhierarchie leicht untersucht und durchlaufen werden kann. collect_class_info speichert außerdem die Menge aller Tabellen virtueller Methoden in der globalen Menge vtables.

  • data_flow: Dieses interne Modul enthält Datenflussoperationen, die vom Rest von ida_kernelcache verwendet werden.

  • kernel: Dieses Modul stellt die globalen Variablen base und prelink_info bereit. base ist die Basisadresse des Kernel-Images (der Anfang des Mach-O-Headers des Kernels). prelink_info ist das geparste __PRELINK_INFO-Wörterbuch.

  • kplist: Dieses Modul stellt die Funktion kplist_parse zum Parsen von PListen im Kernel-Stil bereit.

  • metaclass: Dieses Modul stellt die Funktion initialize_metaclass_symbols bereit, die für jede bekannte OSMetaClass-Instanz ein Symbol hinzufügt.

  • offset: Dieses Modul stellt die Funktionen initialize_data_offsets und initialize_offset_symbols bereit. Erstere durchsucht die Segmente nach Zeigern, die in Offsets umgewandelt werden können. Letztere symbolisiert Offsets im __got-Abschnitt jedes Kexts, wenn das Ziel des Offsets ein Symbol hat.

  • segment: Dieses Modul stellt die Funktion initialize_segments bereit, um IDA-Segmente so umzubenennen, dass sie nützlicher sind. Standardmäßig scheint IDA die Segmentnamen zu erstellen, indem es eine Vermutung der Bundle-ID mit dem Mach-O-Abschnitt kombiniert, der die Region beschreibt. initialize_segments extrahiert die tatsächliche Bundle-ID aus dem __PRELINK_INFO-Wörterbuch und benennt jedes Segment so um, dass es die Bundle-ID, das Mach-O-Segment und den Mach-O-Abschnitt enthält. Dadurch ist es beispielsweise möglich, zwischen __TEXT.__const und __DATA_CONST.__const zu unterscheiden. Dieses Modul stellt außerdem die Funktion kernelcache_kext bereit (auf oberster Ebene re-exportiert), um den Kext zu ermitteln, der die angegebene Adresse enthält (nur im alten iOS-11-Split-Kext-Kernelcache-Format).

  • stub: Viele Kexts im Kernelcache enthalten Stub-Funktionen in einem __stubs-Abschnitt, die zu Funktionen im eigentlichen Kernel springen. Leider stellen diese Stubs eine Barriere für die Weitergabe von Querverweisen und Typinformationen dar. Dieses Modul löst diese Probleme nicht, erleichtert aber die Betrachtung von Stubs, indem es Stub-Funktionen automatisch umbenennt, sodass der Name der Zielfunktion sichtbar ist. Stubs und ihre Ziele werden in IDA zwangsweise in Funktionen umgewandelt, was dazu beiträgt, die Funktionen in IDA mit den Funktionen im ursprünglichen Quellcode in Einklang zu bringen.

  • tagged_pointers: Das neue zusammengeführte Kernelcache-Format von iOS 12 hat die oberen 2 Bytes jedes Zeigers mit einem Offset getaggt, um die Zeiger in einer Liste zu verketten. Dieses Modul enthält Funktionen zum Verarbeiten und Wiederherstellen dieser getaggten Zeiger.

  • vtable: Dieses Modul bietet viele nützliche Funktionen für die Arbeit mit virtuellen Methodentabellen, darunter vtable_length, convert_vtable_to_offsets, vtable_overrides, initialize_vtable_symbols und initialize_vtable_method_symbols. vtable_length prüft, ob die angegebene Adresse eine vtable sein könnte, und gibt die Länge der vtable zurück. Der Generator vtable_overrides zählt die virtuellen Methoden einer Klasse auf, die von der Superklasse verwendete virtuelle Methoden überschreiben. Die Funktion initialize_vtable_symbols fügt ein Symbol für den Anfang jeder identifizierten vtable hinzu. initialize_vtable_method_symbols iteriert über die überschriebenen Methoden in jeder vtable und überträgt Symbole von der Superklasse auf die Unterklasse. Dies ist möglich, weil die meisten Basisklassen in IOKit in XNU mit relativ vollständigen Symbolinformationen definiert sind. Jede Methodenüberschreibung in der vtable einer Unterklasse muss dieselbe Schnittstelle erfüllen wie die Methode in der Superklasse. Das bedeutet, dass wir ein Symbol für die Überschreibung erzeugen können, indem wir in dem Symbol der virtuellen Methode der Superklasse den Namen der Superklasse durch den Namen der Unterklasse ersetzen. Wenn wir beispielsweise keinen Namen für die virtuelle Methode an Index 7 in der Klasse AppleKeyStore haben, aber wissen, dass die virtuelle Methode an Index 7 in ihrer Superklasse IOService __ZNK9IOService12getMetaClassEv heißt, dann können wir ableiten, dass Index 7 in der Unterklasse __ZNK13AppleKeyStore12getMetaClassEv heißen sollte. Diese Technik kann verwendet werden, um die meisten virtuellen Methoden in den meisten Klassen zu symbolisieren.