Objects in memory
Last updated
Last updated
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
CF* об'єкти походять з CoreFoundation, який надає більше 50 класів об'єктів, таких як CFString
, CFNumber
або CFAllocator
.
Усі ці класи є екземплярами класу CFRuntimeClass
, який, коли його викликають, повертає індекс до __CFRuntimeClassTable
. CFRuntimeClass визначено в CFRuntime.h:
Більшість даних, що використовуються середовищем виконання ObjectiveC, змінюються під час виконання, тому воно використовує деякі секції з сегмента __DATA в пам'яті:
__objc_msgrefs
(message_ref_t
): Посилання на повідомлення
__objc_ivar
(ivar
): Змінні екземпляра
__objc_data
(...
): Змінні дані
__objc_classrefs
(Class
): Посилання на класи
__objc_superrefs
(Class
): Посилання на суперкласи
__objc_protorefs
(protocol_t *
): Посилання на протоколи
__objc_selrefs
(SEL
): Посилання на селектори
__objc_const
(...
): Дані класу r/o
та інші (надіємось) постійні дані
__objc_imageinfo
(version, flags
): Використовується під час завантаження зображення: Версія наразі 0
; Прапори вказують на підтримку попередньо оптимізованого GC тощо.
__objc_protolist
(protocol_t *
): Список протоколів
__objc_nlcatlist
(category_t
): Вказівник на не-ліниві категорії, визначені в цьому бінарному файлі
__objc_catlist
(category_t
): Вказівник на категорії, визначені в цьому бінарному файлі
__objc_nlclslist
(classref_t
): Вказівник на не-ліниві класи Objective-C, визначені в цьому бінарному файлі
__objc_classlist
(classref_t
): Вказівники на всі класи Objective-C, визначені в цьому бінарному файлі
Воно також використовує кілька секцій у сегменті __TEXT
для зберігання постійних значень, якщо запис у цій секції неможливий:
__objc_methname
(C-String): Імена методів
__objc_classname
(C-String): Імена класів
__objc_methtype
(C-String): Типи методів
Objective-C використовує деяке манглювання для кодування селекторів і типів змінних простих і складних типів:
Примітивні типи використовують першу літеру типу i
для int
, c
для char
, l
для long
... і використовують велику літеру, якщо це беззнаковий тип (L
для unsigned Long
).
Інші типи даних, літери яких використовуються або є спеціальними, використовують інші літери або символи, такі як q
для long long
, b
для bitfields
, B
для booleans
, #
для classes
, @
для id
, *
для char pointers
, ^
для загальних pointers
і ?
для undefined
.
Масиви, структури та об'єднання використовують [
, {
і (
Селектор буде processString:withOptions:andError:
id
кодується як @
char *
кодується як *
Повне кодування типів для методу:
Тип повернення (NSString *
): Закодовано як @
з довжиною 24
self
(екземпляр об'єкта): Закодовано як @
, на зсуві 0
_cmd
(селектор): Закодовано як :
, на зсуві 8
Перший аргумент (char * input
): Закодовано як *
, на зсуві 16
Другий аргумент (NSDictionary * options
): Закодовано як @
, на зсуві 20
Третій аргумент (NSError ** error
): Закодовано як ^@
, на зсуві 24
З селектором + кодуванням ви можете відтворити метод.
Класи в Objective-C - це структура з властивостями, вказівниками на методи... Можна знайти структуру objc_class
у джерельному коді:
Цей клас використовує деякі біти поля isa, щоб вказати певну інформацію про клас.
Потім структура має вказівник на структуру class_ro_t
, що зберігається на диску, яка містить атрибути класу, такі як його ім'я, базові методи, властивості та змінні екземпляра.
Під час виконання програми використовується додаткова структура class_rw_t
, що містить вказівники, які можуть бути змінені, такі як методи, протоколи, властивості...
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)