
Un modulo IDAPython per migliorare il supporto c++ basato su ida_kernelcache
Un modulo IDAPython per un modo molto più comodo di fare Reverse Engineering dei kernelcache di iOS.
Gran parte del kernelcache di iOS è scritta in C++, che compilato in codice binario complicato utilizza molti dereferenziamenti di tabelle virtuali anziché chiamate dirette esplicite. ida_kcpp sfrutta la ricostruzione della gerarchia delle classi di ida_kernelcache. Mappa l'IDB e sincronizza le funzioni binarie e i metodi virtuali originali. Consente la navigazione attraverso il kernelcache di iOS facendo doppio clic sulla chiamata ai metodi virtuali C++, trovando i loro xref e mantenendo tutto sincronizzato durante la ricerca live.
ida_kcpp è ispirato a ida_medigate ma beneficia della struttura unica del kernelcache di iOS e fornisce un ambiente di ricerca più potente e conveniente.

Nessuno dei due è su PyPI, quindi segui le istruzioni di installazione nei loro repository.
Con ida-setup:
ida-setup plugin install -e /path/to/ida-kcpp
Oppure manualmente:
ida_kernelcache e ida_kcpp siano nel path di IDA python.Potrebbe anche essere aggiunto inserendolo in ~/.idapro/idapythonrc.py:
import sys
sys.path.append(IDA_KCPP_PATH)
sys.path.append(IDA_KERNELCACHE_PATH)
~/.idapro/plugins/ida_kcpp_plugin.py a ida_kcpp_plugin.pyida_kernelcache non è ancora stato eseguito, eseguirlo tramite edit >> Plugins >> Kernel Cache CPP >> ida_kernelcache process kernelEdit >> Plugins >> Kernel Cache CPP >> Perform Initial sync... (potrebbero comparire alcune finestre di avviso, per ora è possibile ignorarle). Questo passaggio rinomina i nomi delle funzioni virtuali impostando il loro prefisso alla classe a cui appartengono. Questo passaggio decompila inoltre tutte le funzioni virtuali, imposta il loro argomento this e modifica il relativo membro ::vmethods in modo che sia un puntatore a funzione del tipo decompilato. Questo passaggio può richiedere un po' di tempo...ida_kcpp propaga automaticamente nomi e prototipi, e modifica anche alcuni aspetti della navigazione in IDA, pertanto non viene attivato automaticamente ma può essere attivato o disattivato in qualsiasi momento.
Attivare ida_kcpp facendo clic su edit >> Plugins >> Kernel Cache CPP >> Activate Plugin (questo installerà gli hook di Hexrays ed eseguirà anche ida_kernelcache.collect_class_info())
facendo clic su Edit >> Plugins >> Kernel Cache CPP >> Deactivate Plugin
Quando si rinomina una funzione virtuale è possibile modificare il nome con mangling (ad esempio __ZNK10AppleA7IOP9method_86Ev_99), oppure cambiarlo con nomi leggibili (AppleA7IOP::method_86) che verranno sottoposti a mangling automaticamente. Il relativo membro ANCESTOR::vmethods verrà rinominato anch'esso, e anche tutte le funzioni virtuali che implementano lo stesso metodo virtuale verranno rinominate.
Lo stesso vale per la modifica del prototipo di una funzione virtuale. In questo caso, il prototipo del relativo membro ANCESTOR::vmethods verrà modificato in un puntatore a funzione del tipo appena impostato, impostando this come ANCESTOR *. Inoltre, i prototipi di tutte le relative implementazioni del metodo virtuale dei DISCENDENTI di ANCESTOR verranno modificati, impostando il loro this come DESCENTANT *.
::vmethods.ida_referee possiamo tracciare gli utilizzi di ogni campo, e in particolare del membro ::vmethods (chiamate virtuali) nel decompilatore.
CTRL+SHIFT+Y dalla funzione virtuale, per aprire direttamente la finestra degli xref al relativo membro ::vmethod. IDA ha un bug e questo funziona solo dalla finestra di disassembly e non dal decompilatore.Decompilatore: il doppio clic su una chiamata a funzione virtuale apre una finestra che consente all'utente di scegliere l'implementazione del metodo virtuale.

Vista Local Types (Shift+F1):
Cmd+Enter su un metodo virtuale naviga anch'esso verso l'implementazione (alternativa più pulita al doppio clic):: non effettuava il salto.Realizzato da Uriel Malin, Ievgen Solodovnykov e Omer Porzecanski di Cellebrite Labs. Sviluppato e testato per IDA 9.2 su macOS con Python 3.13