Objects in memory
Last updated
Last updated
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Obiekty CF* pochodzą z CoreFoundation, które oferuje ponad 50 klas obiektów, takich jak CFString
, CFNumber
czy CFAllocator
.
Wszystkie te klasy są instancjami klasy CFRuntimeClass
, która po wywołaniu zwraca indeks do __CFRuntimeClassTable
. CFRuntimeClass jest zdefiniowana w CFRuntime.h:
Większość danych używanych przez runtime ObjectiveC zmienia się podczas wykonywania, dlatego wykorzystuje niektóre sekcje z segmentu __DATA w pamięci:
__objc_msgrefs
(message_ref_t
): Referencje wiadomości
__objc_ivar
(ivar
): Zmienne instancji
__objc_data
(...
): Dane mutowalne
__objc_classrefs
(Class
): Referencje klas
__objc_superrefs
(Class
): Referencje klas nadrzędnych
__objc_protorefs
(protocol_t *
): Referencje protokołów
__objc_selrefs
(SEL
): Referencje selektorów
__objc_const
(...
): Dane klas r/o
i inne (mam nadzieję) stałe dane
__objc_imageinfo
(version, flags
): Używane podczas ładowania obrazu: Wersja obecnie 0
; Flagi określają wsparcie dla preoptymalizowanego GC itp.
__objc_protolist
(protocol_t *
): Lista protokołów
__objc_nlcatlist
(category_t
): Wskaźnik do kategorii Non-Lazy zdefiniowanych w tym binarnym pliku
__objc_catlist
(category_t
): Wskaźnik do kategorii zdefiniowanych w tym binarnym pliku
__objc_nlclslist
(classref_t
): Wskaźnik do klas Objective-C Non-Lazy zdefiniowanych w tym binarnym pliku
__objc_classlist
(classref_t
): Wskaźniki do wszystkich klas Objective-C zdefiniowanych w tym binarnym pliku
Wykorzystuje również kilka sekcji w segmencie __TEXT
do przechowywania stałych wartości, jeśli nie jest możliwe zapisanie w tej sekcji:
__objc_methname
(C-String): Nazwy metod
__objc_classname
(C-String): Nazwy klas
__objc_methtype
(C-String): Typy metod
Objective-C używa pewnego mangle'owania do kodowania selektorów i typów zmiennych prostych i złożonych:
Typy prymitywne używają pierwszej litery typu i
dla int
, c
dla char
, l
dla long
... i używają wielkiej litery w przypadku, gdy jest to typ unsigned (L
dla unsigned Long
).
Inne typy danych, których litery są używane lub są specjalne, używają innych liter lub symboli, takich jak q
dla long long
, b
dla bitfields
, B
dla booleans
, #
dla classes
, @
dla id
, *
dla wskaźników char
, ^
dla ogólnych wskaźników
i ?
dla niezdefiniowanych
.
Tablice, struktury i unie używają [
, {
i (
Selektor to processString:withOptions:andError:
id
jest kodowane jako @
char *
jest kodowane jako *
Pełne kodowanie typu dla metody to:
Typ zwracany (NSString *
): Zakodowany jako @
o długości 24
self
(instancja obiektu): Zakodowany jako @
, w przesunięciu 0
_cmd
(selektor): Zakodowany jako :
, w przesunięciu 8
Pierwszy argument (char * input
): Zakodowany jako *
, w przesunięciu 16
Drugi argument (NSDictionary * options
): Zakodowany jako @
, w przesunięciu 20
Trzeci argument (NSError ** error
): Zakodowany jako ^@
, w przesunięciu 24
Z selektorem + kodowaniem możesz odtworzyć metodę.
Klasy w Objective-C to struktura z właściwościami, wskaźnikami do metod... Możliwe jest znalezienie struktury objc_class
w kodzie źródłowym:
Ta klasa używa kilku bitów pola isa, aby wskazać pewne informacje o klasie.
Następnie struktura ma wskaźnik do struktury class_ro_t
przechowywanej na dysku, która zawiera atrybuty klasy, takie jak jej nazwa, metody bazowe, właściwości i zmienne instancji.
Podczas działania programu używana jest dodatkowa struktura class_rw_t
, która zawiera wskaźniki, które można zmieniać, takie jak metody, protokoły, właściwości...
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)