Objects in memory
Last updated
Last updated
Aprenda e pratique AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Objetos CF* vêm do CoreFoundation, que fornece mais de 50 classes de objetos como CFString
, CFNumber
ou CFAllocator
.
Todas essas classes são instâncias da classe CFRuntimeClass
, que quando chamada retorna um índice para a __CFRuntimeClassTable
. A CFRuntimeClass é definida em CFRuntime.h:
A maior parte dos dados usados pelo tempo de execução do ObjectiveC mudará durante a execução, portanto, ele utiliza algumas seções do segmento __DATA na memória:
__objc_msgrefs
(message_ref_t
): Referências de mensagem
__objc_ivar
(ivar
): Variáveis de instância
__objc_data
(...
): Dados mutáveis
__objc_classrefs
(Class
): Referências de classe
__objc_superrefs
(Class
): Referências de superclasse
__objc_protorefs
(protocol_t *
): Referências de protocolo
__objc_selrefs
(SEL
): Referências de seletor
__objc_const
(...
): Dados de classe r/o
e outros dados (esperançosamente) constantes
__objc_imageinfo
(version, flags
): Usado durante o carregamento da imagem: Versão atualmente 0
; Flags especificam suporte a GC pré-otimizado, etc.
__objc_protolist
(protocol_t *
): Lista de protocolos
__objc_nlcatlist
(category_t
): Ponteiro para Categorias Não-Lazy definidas neste binário
__objc_catlist
(category_t
): Ponteiro para Categorias definidas neste binário
__objc_nlclslist
(classref_t
): Ponteiro para classes Objective-C Não-Lazy definidas neste binário
__objc_classlist
(classref_t
): Ponteiros para todas as classes Objective-C definidas neste binário
Ele também utiliza algumas seções no segmento __TEXT
para armazenar valores constantes, pois não é possível escrever nesta seção:
__objc_methname
(C-String): Nomes de métodos
__objc_classname
(C-String): Nomes de classes
__objc_methtype
(C-String): Tipos de métodos
Objective-C usa algumas codificações para codificar seletores e tipos de variáveis de tipos simples e complexos:
Tipos primitivos usam a primeira letra do tipo i
para int
, c
para char
, l
para long
... e usam a letra maiúscula no caso de ser sem sinal (L
para unsigned Long
).
Outros tipos de dados cujas letras são usadas ou são especiais, usam outras letras ou símbolos como q
para long long
, b
para bitfields
, B
para booleans
, #
para classes
, @
para id
, *
para char pointers
, ^
para pointers
genéricos e ?
para undefined
.
Arrays, estruturas e uniões usam [
, {
e (
O seletor seria processString:withOptions:andError:
id
é codificado como @
char *
é codificado como *
A codificação de tipo completa para o método é:
Tipo de Retorno (NSString *
): Codificado como @
com comprimento 24
self
(instância do objeto): Codificado como @
, no deslocamento 0
_cmd
(seletor): Codificado como :
, no deslocamento 8
Primeiro argumento (char * input
): Codificado como *
, no deslocamento 16
Segundo argumento (NSDictionary * options
): Codificado como @
, no deslocamento 20
Terceiro argumento (NSError ** error
): Codificado como ^@
, no deslocamento 24
Com o seletor + a codificação você pode reconstruir o método.
Classes em Objective-C são uma struct com propriedades, ponteiros de método... É possível encontrar a struct objc_class
no código-fonte:
Esta classe usa alguns bits do campo isa para indicar algumas informações sobre a classe.
Então, a struct tem um ponteiro para a struct class_ro_t
armazenada no disco, que contém atributos da classe, como seu nome, métodos base, propriedades e variáveis de instância.
Durante a execução, uma estrutura adicional class_rw_t
é usada, contendo ponteiros que podem ser alterados, como métodos, protocolos, propriedades...
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)