Objects in memory
Last updated
Last updated
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
CF* Objekte stammen aus CoreFoundation, das mehr als 50 Klassen von Objekten wie CFString
, CFNumber
oder CFAllocator
bereitstellt.
Alle diese Klassen sind Instanzen der Klasse CFRuntimeClass
, die, wenn sie aufgerufen wird, einen Index zur __CFRuntimeClassTable
zurückgibt. Die CFRuntimeClass ist in CFRuntime.h definiert:
Die meisten Daten, die von der ObjectiveC-Laufzeit verwendet werden, ändern sich während der Ausführung, daher verwendet es einige Abschnitte aus dem __DATA-Segment im Speicher:
__objc_msgrefs
(message_ref_t
): Nachrichtenreferenzen
__objc_ivar
(ivar
): Instanzvariablen
__objc_data
(...
): Änderbare Daten
__objc_classrefs
(Class
): Klassenreferenzen
__objc_superrefs
(Class
): Superklassenreferenzen
__objc_protorefs
(protocol_t *
): Protokollreferenzen
__objc_selrefs
(SEL
): Selektorreferenzen
__objc_const
(...
): Klassen r/o
Daten und andere (hoffentlich) konstante Daten
__objc_imageinfo
(version, flags
): Wird während des Bildladens verwendet: Version derzeit 0
; Flags geben voroptimierte GC-Unterstützung usw. an.
__objc_protolist
(protocol_t *
): Protokollliste
__objc_nlcatlist
(category_t
): Zeiger auf Nicht-Lazy-Kategorien, die in diesem Binärformat definiert sind
__objc_catlist
(category_t
): Zeiger auf Kategorien, die in diesem Binärformat definiert sind
__objc_nlclslist
(classref_t
): Zeiger auf Nicht-Lazy-Objective-C-Klassen, die in diesem Binärformat definiert sind
__objc_classlist
(classref_t
): Zeiger auf alle Objective-C-Klassen, die in diesem Binärformat definiert sind
Es verwendet auch einige Abschnitte im __TEXT
-Segment, um konstante Werte zu speichern, wenn es nicht möglich ist, in diesem Abschnitt zu schreiben:
__objc_methname
(C-String): Methodennamen
__objc_classname
(C-String): Klassennamen
__objc_methtype
(C-String): Methodentypen
Objective-C verwendet einige Mangling-Techniken, um Selektor- und Variablentypen einfacher und komplexer Typen zu kodieren:
Primitive Typen verwenden den ersten Buchstaben des Typs i
für int
, c
für char
, l
für long
... und verwenden den Großbuchstaben, falls es sich um einen unsigned Typ handelt (L
für unsigned Long
).
Andere Datentypen, deren Buchstaben verwendet werden oder die speziell sind, verwenden andere Buchstaben oder Symbole wie q
für long long
, b
für Bitfelder
, B
für Booleans
, #
für Klassen
, @
für id
, *
für char-Zeiger
, ^
für generische Zeiger
und ?
für undefiniert
.
Arrays, Strukturen und Vereinigungen verwenden [
, {
und (
Der Selektor wäre processString:withOptions:andError:
id
wird als @
kodiert
char *
wird als *
kodiert
Die vollständige Typkodierung für die Methode ist:
Rückgabetyp (NSString *
): Kodiert als @
mit Länge 24
self
(Objektinstanz): Kodiert als @
, bei Offset 0
_cmd
(Selektor): Kodiert als :
, bei Offset 8
Erstes Argument (char * input
): Kodiert als *
, bei Offset 16
Zweites Argument (NSDictionary * options
): Kodiert als @
, bei Offset 20
Drittes Argument (NSError ** error
): Kodiert als ^@
, bei Offset 24
Mit dem Selektor + der Kodierung kannst du die Methode rekonstruieren.
Klassen in Objective-C sind eine Struktur mit Eigenschaften, Methodenzeigern... Es ist möglich, die Struktur objc_class
im Quellcode zu finden:
Diese Klasse verwendet einige Bits des isa-Feldes, um Informationen über die Klasse anzuzeigen.
Dann hat die Struktur einen Zeiger auf die Struktur class_ro_t
, die auf der Festplatte gespeichert ist und Attribute der Klasse wie ihren Namen, Basis-Methoden, Eigenschaften und Instanzvariablen enthält.
Zur Laufzeit wird eine zusätzliche Struktur class_rw_t
verwendet, die Zeiger enthält, die geändert werden können, wie Methoden, Protokolle, Eigenschaften...