Objects in memory
Last updated
Last updated
Μάθετε & εξασκηθείτε στο Hacking του AWS:Εκπαίδευση HackTricks AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο Hacking του GCP: Εκπαίδευση HackTricks GCP Red Team Expert (GRTE)
Τα αντικείμενα CF* προέρχονται από το CoreFOundation, το οποίο παρέχει περισσότερες από 50 κλάσεις αντικειμένων όπως CFString
, CFNumber
ή CFAllocatior
.
Όλες αυτές οι κλάσεις είναι παραδείγματα της κλάσης CFRuntimeClass
, η οποία όταν καλείται επιστρέφει ένα δείκτη στον πίνακα __CFRuntimeClassTable
. Η CFRuntimeClass ορίζεται στο CFRuntime.h:
Τα περισσότερα δεδομένα που χρησιμοποιούνται από το runtime του 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
... και χρησιμοποιεί το κεφαλαίο γράμμα σε περίπτωση που είναι unsigned (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
στο κώδικα πηγής:
Αυτή η κλάση χρησιμοποιεί μερικά bits του πεδίου isa για να υποδείξει πληροφορίες σχετικά με την κλάση.
Στη συνέχεια, η δομή έχει ένα δείκτη προς τη δομή class_ro_t
που αποθηκεύεται στο δίσκο και περιέχει χαρακτηριστικά της κλάσης όπως το όνομά της, τις βασικές μεθόδους, τις ιδιότητες και τις μεταβλητές της παρουσίας.
Κατά τη διάρκεια της εκτέλεσης, μια επιπλέον δομή class_rw_t
χρησιμοποιείται περιέχοντας δείκτες που μπορούν να τροποποιηθούν, όπως μεθόδους, πρωτόκολλα, ιδιότητες...