Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
ida_kernelcache — Un toolkit IDA per analizzare i kernelcache iOS. | Kitploit
Strumenti/GitHubGitHub/cellebrite-labs/ida_kernelcache
Analisi StaticaSicurezza iOSAnalisi delle VulnerabilitàExploitReverse EngineeringDebuggerSicurezza MobileAnalisi di Binari
GitHubcellebrite-labs/ida_kernelcache

ida_kernelcache

Un toolkit IDA per analizzare i kernelcache iOS.

Vedi Repository
149299 giorni faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

ida_kernelcache: un toolkit IDA per l'analisi dei kernelcache iOS

Fork Cellebrite

Questo fork è stato aggiornato per funzionare con IDA 9.x / Python 3 / iOS 27.0 beta 1

Readme originale

ida_kernelcache è un modulo IDAPython per IDA Pro che semplifica il lavoro con i kernelcache iOS. Il modulo fornisce funzioni per:

  • Convertire i nuovi puntatori etichettati statici di iOS 12 in normali puntatori di kernel.
  • Analizzare il segmento __PRELINK_INFO del kernel in un dizionario Python.
  • Rinominare i segmenti in IDA in base al nome dell'estensione del kernel, al segmento Mach-O e alla sezione Mach-O.
  • Convertire i puntatori identificabili in alcuni segmenti in offset IDA.
  • Ricostruire la gerarchia delle classi C++ basandosi sulle informazioni OSMetaClass.
  • Symbolicate delle tabelle dei metodi virtuali C++ (sia la vtable stessa che i suoi metodi).
  • Symbolicate degli offset nelle sezioni __got e delle funzioni stub nelle sezioni __stubs.
  • Autogenerare struct IDA che rappresentano le tabelle dei metodi virtuali C++.
  • Autogenerare struct IDA che rappresentano le classi C++ presenti nel kernelcache in base ai pattern di accesso osservati.

La funzione di elaborazione principale è progettata per essere eseguita prima di qualsiasi analisi manuale o reverse engineering. Con le impostazioni predefinite, IDA tende a perdere molte informazioni utili nel kernelcache. Questi script aiutano IDA sfruttando la struttura nota del kernelcache per propagare automaticamente le informazioni utili.

Oltre alle funzionalità standard del modulo, ida_kernelcache contiene diversi script per semplificare l'analisi del kernelcache iOS. Ad esempio, è possibile utilizzare gli script per autogenerare struct C usate da una funzione.

Molte delle tecniche usate in ida_kernelcache sono state sviluppate per memctl e prese direttamente in prestito da esso.

Versioni

ida_kernelcache è stato testato con IDA Pro 6.95 su kernelcache per le versioni iOS 10.1.1, 11.0, 11.2, 11.3.1 e 12.0 beta. Attualmente sono supportati solo kernelcache Arm64 da iOS 10 in poi.

Per iniziare

È necessario avere già un file kernelcache decompresso caricato in IDA. Puoi trovare l'URL per scaricare un determinato IPSW da Apple online e ci sono numerosi strumenti pubblici (incluso memctl) in grado di decomprimere il kernelcache.

In IDA, seleziona "File" -> "File di script..." dalla barra dei menu, quindi scegli lo script ida_kernelcache.py nella directory principale. Questo caricherà il modulo ida_kernelcache nell'interprete IDAPython con i nomi ida_kernelcache e kc. Nel prompt IDAPython, digita kc.kernelcache_process() e premi Invio per iniziare l'analisi del kernelcache. Questa funzione esegue tutte le principali analisi supportate da ida_kernelcache. La funzione verrà eseguita per diversi minuti mentre IDA identifica e analizza nuove funzioni.

ida_kernelcache cercherà di non sovrascrivere i nomi utente degli indirizzi. Ciò significa che se il kernelcache è stato analizzato manualmente prima dell'inizializzazione con kernelcache_process, i risultati potrebbero non essere altrettanto approfonditi perché i nomi specificati dall'utente potrebbero bloccare la propagazione automatica dei nomi. Tuttavia, non vi è inoltre alcuna garanzia che ida_kernelcache non rovini le analisi precedenti, quindi se decidi di eseguire kernelcache_process su un file kernelcache che hai già analizzato, fai prima un backup.

Il modulo ida_kernelcache

ida_kernelcache deve essere caricato tramite ida_kernelcache.py; i sottomoduli nella directory ida_kernelcache non devono essere caricati direttamente. Tuttavia, ida_kernelcache espone le funzionalità di molti di questi sottomoduli. Ecco cosa fa ciascuno di essi:

  • ida_utilities: Questo modulo incapsula alcune delle funzioni di IDA per fornire un'API più facile da usare. Particolarmente utili sono is_mapped, read_word, read_struct, force_function e ReadWords. is_mapped controlla se un indirizzo è mappato e, opzionalmente, se contiene un valore noto. read_word legge una word di dimensione variabile da un indirizzo. read_struct legge un tipo di struct in un dizionario Python o in un oggetto accessor Python, il che rende molto più semplice l'analisi delle strutture dati. force_function prova diversi trucchi per convertire un indirizzo nell'inizio di una funzione in IDA. ReadWords è un generatore per iterare su word di dati e sui loro indirizzi in un intervallo.

  • build_struct: Questo modulo interno contiene utilità per popolare automaticamente una struct IDA in base a una sequenza di accessi alla struct.

  • class_struct: Questo modulo fornisce funzioni per generare struct IDA che rappresentano tabelle di metodi virtuali C++ e classi. initialize_vtable_structs esamina le tabelle dei metodi virtuali (symbolicate) e crea struct IDA per contenere i puntatori ai metodi virtuali. esegue un'analisi del flusso di dati sui metodi virtuali per identificare gli accessi ai campi di ciascuna classe, quindi costruisce struct IDA per rappresentare le classi. Le istruzioni che sembrano fare riferimento a un campo vengono anche convertite in riferimenti a offset di struttura. Consulta la docstring del modulo per maggiori dettagli.

Altri script

Lo script ida_kernelcache_reload.py è identico a ida_kernelcache.py, tranne per il fatto che forza il ricaricamento del modulo ida_kernelcache e di tutti i sottomoduli. È utile principalmente per lo sviluppo.

La directory scripts contiene script che usano ida_kernelcache per eseguire qualche tipo di analisi. Questi script sono troppo specifici per far parte del modulo principale ida_kernelcache, ma sono utili durante il reverse engineering del kernelcache. Includono:

  • find_virtual_method_overrides.py: Uno script per trovare i discendenti di una classe che sovrascrivono un metodo virtuale contenente la stringa specificata. Gli override corrispondenti vengono stampati sulla console.

  • populate_struct.py: Popola i campi di una classe C++ o di una struct C eseguendo un'analisi del flusso di dati a partire dall'indirizzo corrente.

  • process_external_methods.py: Elabora un array IOExternalMethod o IOExternalMethodDispatch in una forma standard per l'uso da parte di strumenti di fuzzing.

Ricostruzione delle classi

Se stai usando il decompilatore Hex-Rays, una delle caratteristiche più interessanti di ida_kernelcache è la ricostruzione automatica delle classi C++, che userà le informazioni OSMetaClass e l'analisi del flusso di dati per creare struct IDA che rappresentano le classi trovate nel kernelcache. Queste rappresentazioni possono migliorare notevolmente la leggibilità della rappresentazione in pseudocodice. Per saperne di più, consulta il post Reconstructing C++ classes in the iOS kernelcache using IDA Pro.

Il nuovo formato del kernelcache di iOS 12

Con iOS 12, Apple ha introdotto un nuovo formato di kernelcache su alcuni dispositivi. Tra le modifiche, i puntatori del kernel di questo nuovo kernelcache sono etichettati per collegarli in una lista, presumibilmente per consentire a iBoot di applicare lo slide al kernel senza i dati _PrelinkLinkKASLROffsets nel dizionario prelink. Cercare di analizzare un kernelcache stock che usa questo formato in IDA è difficile a causa dei riferimenti incrociati mancanti. Vedi l'articolo Analyzing the iOS 12 kernelcache's tagged pointers per i dettagli.

Se vuoi solo rimuovere l'etichettatura dei puntatori nel kernelcache senza eseguire alcuna ulteriore elaborazione, esegui kc.tagged_pointers.untag_pointers().

Una nota sulla generalizzazione

Parte di questa funzionalità probabilmente si applica più in generale che solo ai kernelcache Apple (ad esempio, l'analisi delle vtable e la propagazione dei simboli, o la maggior parte delle funzioni in ida_utilities.py). Tuttavia, ho limitato l'ambito di importazione al solo modulo ida_kernelcache perché non ho testato nulla di tutto ciò su altri tipi di binari.

Licenza

ida_kernelcache è rilasciato sotto licenza MIT.

Gran parte della funzionalità di ida_kernelcache è presa in prestito da memctl, anch'esso rilasciato sotto licenza MIT. Altre fonti sono indicate nei commenti nei file corrispondenti.


Brandon Azad

Scarica lo strumento
initialize_class_structs
  • classes: Questo modulo definisce il tipo ClassInfo che contiene informazioni sulle classi C++ nel kernelcache e fornisce la funzione collect_class_info per esaminare il kernelcache alla ricerca di classi e popolare il dizionario globale class_info con una mappa dai nomi delle classi agli oggetti ClassInfo. Il tipo ClassInfo registra il nome della classe, l'istanza OSMetaClass, la tabella dei metodi virtuali e il nome della superclasse per ciascuna classe C++. Inoltre, ogni oggetto ClassInfo memorizza riferimenti al ClassInfo della superclasse e al ClassInfo di tutte le sottoclassi dirette, rendendo facile esaminare e attraversare la gerarchia delle classi. collect_class_info memorizza anche l'insieme di tutte le tabelle dei metodi virtuali nell'insieme globale vtables.

  • data_flow: Questo modulo interno contiene operazioni sul flusso di dati usate dal resto di ida_kernelcache.

  • kernel: Questo modulo fornisce le variabili globali base e prelink_info. base è l'indirizzo di base dell'immagine del kernel (l'inizio dell'header Mach-O del kernel). prelink_info è il dizionario __PRELINK_INFO analizzato.

  • kplist: Questo modulo fornisce la funzione kplist_parse per analizzare plist in stile kernel.

  • metaclass: Questo modulo fornisce la funzione initialize_metaclass_symbols che aggiunge un simbolo per ogni istanza OSMetaClass nota.

  • offset: Questo modulo fornisce le funzioni initialize_data_offsets e initialize_offset_symbols. La prima esamina i segmenti alla ricerca di puntatori che possono essere convertiti in offset. La seconda symbolicate gli offset nella sezione __got di ogni kext se la destinazione dell'offset ha un simbolo.

  • segment: Questo modulo fornisce la funzione initialize_segments per rinominare i segmenti di IDA rendendoli più utili. Di default, IDA sembra creare i nomi dei segmenti combinando una stima dell'identificatore del bundle con la sezione Mach-O che descrive la regione. initialize_segments estrae il vero identificatore del bundle dal dizionario __PRELINK_INFO e rinomina ogni segmento in modo da includere l'identificatore del bundle, il segmento Mach-O e la sezione Mach-O. Questo rende possibile, ad esempio, distinguere tra __TEXT.__const e __DATA_CONST.__const. Questo modulo fornisce anche la funzione kernelcache_kext (riesportata a livello principale) per determinare il kext che contiene l'indirizzo specificato (solo nel vecchio formato kernelcache split-kext di iOS 11).

  • stub: Molti kext nel kernelcache contengono funzioni stub in una sezione __stubs che saltano a funzioni nel kernel vero e proprio. Sfortunatamente, questi stub rappresentano una barriera per la propagazione dei riferimenti incrociati e delle informazioni sui tipi. Questo modulo non risolve questi problemi, ma rende l'osservazione degli stub un po' più semplice rinominando automaticamente le funzioni stub in modo che il nome della funzione di destinazione sia visibile. Gli stub e le loro destinazioni vengono convertiti con forza in funzioni in IDA, il che aiuta a far coincidere le funzioni in IDA con le funzioni nel codice sorgente originale.

  • tagged_pointers: Il nuovo formato di kernelcache unificato di iOS 12 ha i 2 byte superiori di ogni puntatore etichettati con un offset per concatenare i puntatori in una lista. Questo modulo contiene funzioni per elaborare e ripristinare questi puntatori etichettati.

  • vtable: Questo modulo fornisce molte funzioni utili per lavorare con le tabelle dei metodi virtuali, tra cui vtable_length, convert_vtable_to_offsets, vtable_overrides, initialize_vtable_symbols e initialize_vtable_method_symbols. vtable_length controlla se l'indirizzo specificato potrebbe essere una vtable e restituisce la lunghezza della vtable. Il generatore vtable_overrides enumera i metodi virtuali in una classe che sovrascrivono metodi virtuali usati dalla superclasse. La funzione initialize_vtable_symbols aggiunge un simbolo per l'inizio di ogni vtable identificata. initialize_vtable_method_symbols itera attraverso i metodi sovrascritti in ogni vtable e propaga i simboli dalla superclasse alla sottoclasse. Questo è possibile perché la maggior parte delle classi base in IOKit sono definite in XNU con informazioni sui simboli relativamente complete. Ogni override di metodo nella vtable di una sottoclasse deve conformarsi alla stessa interfaccia del metodo nella superclasse, il che significa che possiamo generare un simbolo per l'override sostituendo il nome della sottoclasse al nome della superclasse nel simbolo del metodo virtuale nella superclasse. Ad esempio, se non abbiamo alcun nome per il metodo virtuale all'indice 7 nella classe AppleKeyStore, ma sappiamo che il metodo virtuale all'indice 7 nella sua superclasse IOService si chiama __ZNK9IOService12getMetaClassEv, allora possiamo dedurre che l'indice 7 dovrebbe chiamarsi __ZNK13AppleKeyStore12getMetaClassEv nella sottoclasse. Questa tecnica può essere usata per symbolicate la maggior parte dei metodi virtuali nella maggior parte delle classi.