Objects in memory
Last updated
Last updated
Impara e pratica l'hacking su AWS: HackTricks Training AWS Red Team Expert (ARTE) Impara e pratica l'hacking su GCP: HackTricks Training GCP Red Team Expert (GRTE)
Gli oggetti CF* provengono da CoreFoundation, che fornisce più di 50 classi di oggetti come CFString
, CFNumber
o CFAllocatior
.
Tutte queste classi sono istanze della classe CFRuntimeClass
, che quando chiamata restituisce un indice alla __CFRuntimeClassTable
. Il CFRuntimeClass è definito in CFRuntime.h:
La maggior parte dei dati utilizzati dall'esecuzione di ObjectiveC cambierà durante l'esecuzione, quindi utilizza alcune sezioni del segmento __DATA in memoria:
__objc_msgrefs
(message_ref_t
): Riferimenti ai messaggi
__objc_ivar
(ivar
): Variabili di istanza
__objc_data
(...
): Dati mutabili
__objc_classrefs
(Class
): Riferimenti alle classi
__objc_superrefs
(Class
): Riferimenti alle superclassi
__objc_protorefs
(protocol_t *
): Riferimenti ai protocolli
__objc_selrefs
(SEL
): Riferimenti ai selettori
__objc_const
(...
): Dati della classe r/o
e altri dati (sperabilmente) costanti
__objc_imageinfo
(versione, flag
): Utilizzato durante il caricamento dell'immagine: Versione attualmente 0
; I flag specificano il supporto preottimizzato per il GC, ecc.
__objc_protolist
(protocol_t *
): Elenco dei protocolli
__objc_nlcatlist
(category_t
): Puntatore alle categorie Non-Lazy definite in questo binario
__objc_catlist
(category_t
): Puntatore alle categorie definite in questo binario
__objc_nlclslist
(classref_t
): Puntatore alle classi Objective-C Non-Lazy definite in questo binario
__objc_classlist
(classref_t
): Puntatori a tutte le classi Objective-C definite in questo binario
Utilizza anche alcune sezioni nel segmento __TEXT
per memorizzare valori costanti se non è possibile scriverli in questa sezione:
__objc_methname
(Stringa-C): Nomi dei metodi
__objc_classname
(Stringa-C): Nomi delle classi
__objc_methtype
(Stringa-C): Tipi di metodi
Objective-C utilizza alcune manipolazioni per codificare i tipi di selettori e variabili di tipi semplici e complessi:
I tipi primitivi utilizzano la loro prima lettera del tipo i
per int
, c
per char
, l
per long
... e utilizzano la lettera maiuscola nel caso in cui sia senza segno (L
per unsigned Long
).
Altri tipi di dati le cui lettere sono utilizzate o sono speciali, utilizzano altre lettere o simboli come q
per long long
, b
per campi di bit
, B
per booleani
, #
per classi
, @
per id
, *
per puntatori a char
, ^
per puntatori generici
e ?
per non definito
.
Gli array, le strutture e le unioni utilizzano [
, {
e (
Il selettore sarebbe processString:withOptions:andError:
id
è codificato come @
char *
è codificato come *
La codifica completa del tipo per il metodo è:
Tipo di Ritorno (NSString *
): Codificato come @
con lunghezza 24
self
(istanza dell'oggetto): Codificato come @
, all'offset 0
_cmd
(selettore): Codificato come :
, all'offset 8
Primo argomento (char * input
): Codificato come *
, all'offset 16
Secondo argomento (NSDictionary * options
): Codificato come @
, all'offset 20
Terzo argomento (NSError ** error
): Codificato come ^@
, all'offset 24
Con il selettore + la codifica è possibile ricostruire il metodo.
Le classi in Objective-C sono una struttura con proprietà, puntatori a metodi... È possibile trovare la struttura objc_class
nel codice sorgente:
Questo classe utilizza alcuni bit del campo isa per indicare alcune informazioni sulla classe.
Successivamente, la struct ha un puntatore alla struct class_ro_t
memorizzata su disco che contiene attributi della classe come il suo nome, metodi di base, proprietà e variabili di istanza.
Durante l'esecuzione, una struttura aggiuntiva class_rw_t
viene utilizzata contenente puntatori che possono essere modificati come metodi, protocolli, proprietà...