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/bazad/ida_kernelcache
Sicurezza Sistemi EmbeddedAnalisi StaticaSicurezza iOSAnalisi delle VulnerabilitàReverse EngineeringDebuggerSicurezza MobileAnalisi di BinariAnalisi del Firmware
GitHubbazad/ida_kernelcache

ida_kernelcache

Un toolkit IDA per analizzare i kernelcache iOS.

305856 anni 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
Vedi Repository

ida_kernelcache: Un toolkit IDA per analizzare i kernelcache iOS

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

  • Convertire i nuovi puntatori tagged statici di iOS 12 in normali puntatori del kernel.
  • Analizzare il segmento __PRELINK_INFO del kernel in un dizionario Python.
  • Rinominare i segmenti in IDA secondo il nome dell'estensione del kernel, il segmento Mach-O e la sezione Mach-O.
  • Convertire puntatori identificabili in alcuni segmenti in offset IDA.
  • Ricostruire la gerarchia delle classi C++ basandosi sulle informazioni di OSMetaClass.
  • Simbolizzare le tabelle dei metodi virtuali C++ (sia la vtable stessa che i suoi metodi).
  • Simbolizzare gli offset nelle sezioni __got e le funzioni stub nelle sezioni __stubs.
  • Generare automaticamente struct IDA che rappresentano le tabelle dei metodi virtuali C++.
  • Generare automaticamente struct IDA che rappresentano le classi C++ nel kernelcache basandosi sui 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 informazioni utili.

Oltre alle funzionalità standard del modulo, ida_kernelcache contiene diversi script per facilitare l'analisi del kernelcache iOS. Ad esempio, puoi utilizzare gli script per generare automaticamente struct C utilizzate da una funzione.

Molte delle tecniche utilizzate in ida_kernelcache sono state sviluppate per e prese direttamente da memctl.

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

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

In IDA, seleziona "File" -> "Script file..." 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 per gli indirizzi. Ciò significa che se il kernelcache è stato analizzato manualmente prima dell'inizializzazione con kernelcache_process, i risultati potrebbero non essere così completi perché i nomi specificati dall'utente potrebbero bloccare la propagazione automatica dei nomi. Tuttavia, non c'è nemmeno la garanzia che ida_kernelcache non rovini l'analisi precedente, 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 è pensato per 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 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 parola di dimensione variabile da un indirizzo. read_struct legge un tipo 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 parole di dati e i loro indirizzi in un intervallo.

  • build_struct: Questo modulo interno contiene utility per popolare automaticamente una struct IDA basandosi su una sequenza di accessi alla struct.

  • class_struct: Questo modulo fornisce funzioni per generare struct IDA che rappresentano le tabelle dei metodi virtuali C++ e le classi. initialize_vtable_structs esamina le tabelle dei metodi virtuali (simbolizzate) 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 ogni 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 struct. Vedi 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 utilizzano ida_kernelcache per eseguire un certo tipo di analisi. Questi script sono troppo specifici per far parte del modulo ida_kernelcache principale, ma sono utili durante il reverse engineering del kernelcache. Includono:

  • find_virtual_method_overrides.py: Uno script per trovare discendenti di una classe che sovrascrivono un metodo virtuale contenente la stringa specificata. Le sostituzioni corrispondenti vengono stampate sulla console.

  • populate_struct.py: Popola i campi per una classe C++ o 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 un formato standard per l'uso con strumenti di fuzzing.

Ricostruzione delle classi

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

Il nuovo formato kernelcache di iOS 12

Con iOS 12, Apple ha introdotto un nuovo formato kernelcache su alcuni dispositivi. Tra le modifiche, i puntatori del kernel di questo nuovo kernelcache sono taggati per collegarli in una lista, presumibilmente per consentire a iBoot di slittare il kernel senza i dati _PrelinkLinkKASLROffsets nel dizionario prelink. Analizzare un kernelcache standard che utilizza questo formato in IDA è difficile a causa della mancanza di riferimenti incrociati. Vedi l'articolo Analyzing the iOS 12 kernelcache's tagged pointers per i dettagli.

Se desideri semplicemente rimuovere il tag dai puntatori nel kernelcache senza eseguire alcuna elaborazione aggiuntiva, esegui kc.tagged_pointers.untag_pointers().

Una nota sulla generalizzazione

Alcune di queste funzionalità probabilmente si applicano in modo più ampio 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). Ciononostante, 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 la licenza MIT.

Gran parte delle funzionalità di ida_kernelcache sono prese da memctl, anch'esso rilasciato sotto la 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 ogni classe C++. Inoltre, ogni oggetto ClassInfo memorizza riferimenti al ClassInfo della superclasse e al ClassInfo di tutte le sottoclassi dirette, facilitando l'esame e la navigazione della 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 di flusso di dati utilizzate dal resto di ida_kernelcache.

  • kernel: Questo modulo fornisce le variabili globali base e prelink_info. base è l'indirizzo base dell'immagine del kernel (l'inizio dell'intestazione 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 conosciuta.

  • 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 simbolizza 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 in modo che siano più utili. Per impostazione predefinita, IDA sembra creare i nomi dei segmenti combinando un'ipotesi 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 includendo l'identificatore del bundle, il segmento Mach-O e la sezione Mach-O. Ciò rende possibile, ad esempio, distinguere tra __TEXT.__const e __DATA_CONST.__const. Questo modulo fornisce anche la funzione kernelcache_kext (riesportata al livello superiore) 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 di tipo. Questo modulo non risolve questi problemi, ma rende un po' più semplice l'esame degli stub rinominando automaticamente le funzioni stub in modo che il nome della funzione di destinazione sia visibile. Gli stub e le loro destinazioni vengono forzatamente convertiti in funzioni in IDA, il che aiuta a far sì che le funzioni in IDA corrispondano a quelle nel codice sorgente originale.

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

  • 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 i metodi virtuali utilizzati 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 di simbolo relativamente complete. Ogni sostituzione di metodo nella vtable di una sottoclasse deve essere conforme alla stessa interfaccia del metodo nella superclasse, il che significa che possiamo generare un simbolo per la sostituzione sostituendo il nome della sottoclasse al nome della superclasse nel simbolo del metodo virtuale nella superclasse. Ad esempio, se non abbiamo un 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 utilizzata per simbolizzare la maggior parte dei metodi virtuali nella maggior parte delle classi.