macOS Universal binaries & Mach-O Format
Taarifa Msingi
Vipande vya Mac OS kawaida hukusanywa kama vipande vya universal. Kipande cha universal kinaweza kusaidia miundo mingi katika faili moja.
Vipande hivi vinazingatia muundo wa Mach-O ambao kimsingi unaundwa na:
Kichwa
Amri za Upakiaji
Data
Kichwa cha Mafuta
Tafuta faili kwa: mdfind fat.h | grep -i mach-o | grep -E "fat.h$"
Kichwa kina baye za uchawi zifuatiwazo na idadi ya miundo faili ina inajumuisha (nfat_arch
) na kila muundo utakuwa na muundo wa fat_arch
.
Angalia na:
au kutumia zana ya Mach-O View:
Kama unavyoweza kufikiria kawaida kipande cha universal kilichopangwa kwa miundo 2 hufanya ukubwa wa moja iliyopangwa kwa muundo mmoja tu.
Kichwa cha Mach-O
Kichwa kina taarifa msingi kuhusu faili, kama baye za uchawi kutambua kama faili ya Mach-O na taarifa kuhusu miundo ya lengo. Unaweza kuipata kwa: mdfind loader.h | grep -i mach-o | grep -E "loader.h$"
Aina za Faili za Mach-O
Kuna aina tofauti za faili, unaweza kuzipata zimefafanuliwa katika mifano ya msimbo hapa kwa mfano. Zile muhimu zaidi ni:
MH_OBJECT
: Faili ya kitu inayoweza kuhama (bidhaa za kati za uundaji, sio utekelezaji bado).MH_EXECUTE
: Faili za utekelezaji.MH_FVMLIB
: Faili ya maktaba ya VM iliyofungwa.MH_CORE
: Dump za MsimboMH_PRELOAD
: Faili ya utekelezaji iliyopakiwa mapema (haisaidiwi tena katika XNU)MH_DYLIB
: Maktaba za KisasaMH_DYLINKER
: Kiungo cha KisasaMH_BUNDLE
: "Faili za programu-jalizi". Zinazozalishwa kwa kutumia -bundle katika gcc na kupakiwa wazi naNSBundle
audlopen
.MH_DYSM
: Faili ya.dSym
mshirika (faili yenye alama za kutatua matatizo).MH_KEXT_BUNDLE
: Vipanuzi vya Kerneli.
Au kutumia Mach-O View:
Mach-O Alama
Msimbo wa chanzo pia unatambua alama kadhaa zinazofaa kwa kupakia maktaba:
MH_NOUNDEFS
: Hakuna marejeo yasiyojulikana (imeunganishwa kabisa)MH_DYLDLINK
: Uunganishaji wa DyldMH_PREBOUND
: Marejeo ya kudumu yanayoweza kubadilika.MH_SPLIT_SEGS
: Faili inagawanya segimenti za r/o na r/w.MH_WEAK_DEFINES
: Baina ina alama zilizofafanuliwa kwa udhaifuMH_BINDS_TO_WEAK
: Baina inatumia alama za udhaifuMH_ALLOW_STACK_EXECUTION
: Fanya steki iweze kutekelezwaMH_NO_REEXPORTED_DYLIBS
: Maktaba haina amri za LC_REEXPORTMH_PIE
: Kutekelezeka kwa Nafasi Isiyokuwa na KitegemeziMH_HAS_TLV_DESCRIPTORS
: Kuna sehemu na pembejeo za mitambo ya mnyororoMH_NO_HEAP_EXECUTION
: Hakuna utekelezaji kwa kurasa za rundo/dataMH_HAS_OBJC
: Baina ina sehemu za oBject-CMH_SIM_SUPPORT
: Msaada wa SimulatorMH_DYLIB_IN_CACHE
: Kutumika kwenye dylibs/frameworks katika hifadhi ya maktaba ya pamoja.
Mach-O Amri za Upakiaji
Mpangilio wa faili akilini unatajwa hapa, ukielezea eneo la jedwali la alama, muktadha wa mnyororo mkuu mwanzoni mwa utekelezaji, na maktaba zinazoshirikiwa zinazohitajika. Maelekezo yanatolewa kwa mzigo wa kudumu (dyld) kuhusu mchakato wa kupakia bainari akilini.
Inatumia muundo wa load_command, uliotajwa katika loader.h
iliyotajwa:
Kuna karibu aina 50 tofauti za amri za mzigo ambazo mfumo unashughulikia tofauti. Zile za kawaida zaidi ni: LC_SEGMENT_64
, LC_LOAD_DYLINKER
, LC_MAIN
, LC_LOAD_DYLIB
, na LC_CODE_SIGNATURE
.
LC_SEGMENT/LC_SEGMENT_64
Kimsingi, aina hii ya Amri ya Mzigo inaainisha jinsi ya kupakia __TEXT (msimbo wa kutekelezeka) na __DATA (data kwa ajili ya mchakato) sehemu kulingana na makadirio yaliyoonyeshwa katika sehemu ya Data wakati binary inatekelezwa.
Amri hizi inaainisha sehemu ambazo zinapangiliwa katika nafasi ya kumbukumbu ya kielezo ya mchakato unapotekelezwa.
Kuna aina tofauti za sehemu, kama vile sehemu ya __TEXT, ambayo inashikilia msimbo wa kutekelezeka wa programu, na sehemu ya __DATA, ambayo ina data inayotumiwa na mchakato. Hizi sehemu zinapatikana katika sehemu ya data ya faili ya Mach-O.
Kila sehemu inaweza kugawanywa zaidi katika sehemu nyingi. Muundo wa amri ya mzigo una habari kuhusu sehemu hizi ndani ya sehemu husika.
Katika kichwa kwanza unapata kichwa cha sehemu:
Mfano wa kichwa cha sehemu:
Kichwa hiki kinafafanua idadi ya sehemu ambazo vichwa vyake vinatokea baada ya hiyo:
Mfano wa kichwa cha sehemu:
Ikiwa un ongeza kielekezi cha sehemu (0x37DC) + kielekezi ambapo arch inaanza, katika kesi hii 0x18000
--> 0x37DC + 0x18000 = 0x1B7DC
Pia niwezekana kupata habari za vichwa kutoka kwa mstari wa amri na:
Sehemu za kawaida zilizopakiwa na hii cmd:
__PAGEZERO
: Inaagiza kernel kufanya ramani ya anwani sifuri ili isomeki, iandikwe, au kutekelezwa. maxprot na minprot katika muundo huo hupangwa kuwa sifuri kuonyesha kwamba hakuna haki za kusoma-andika-tekeleza kwenye ukurasa huu.Upeanaji huu ni muhimu kwa kuzuia udhaifu wa dereferensi ya pointer ya NULL. Hii ni kwa sababu XNU inatekeleza ukurasa sifuri wa ngumu ambao unahakikisha ukurasa wa kwanza (ukurasa wa kwanza tu) wa kumbukumbu haupatikani (isipokuwa kwa i386). Binary inaweza kukidhi mahitaji haya kwa kutengeneza __PAGEZERO ndogo (kwa kutumia
-pagezero_size
) kufunika kwanza 4k na kuwa na kumbukumbu ya 32bit iliyobaki inayopatikana katika hali ya mtumiaji na hali ya kernel.__TEXT
: Ina mimbo inayoweza kutekelezwa na kusomwa na kutekelezwa (siyo inayoweza kuandikwa). Sehemu za kawaida za kipande hiki:__text
: Mimbo ya kanuni iliyokompiliwa__const
: Data ya kudumu (soma tu)__[c/u/os_log]string
: Konstanti za herufi za C, Unicode, au os logs__stubs
na__stubs_helper
: Husika wakati wa mchakato wa kupakia maktaba za kudumu__unwind_info
: Data ya kufungua mizunguko.Tafadhali elewa kuwa yaliyomo yote haya yamesainiwa lakini pia yameainishwa kama yanayoweza kutekelezwa (ikiumba chaguzi zaidi za kutumia sehemu ambazo hazihitaji lazima haki hii, kama sehemu zilizotengwa kwa herufi).
__DATA
: Ina data inayoweza kusomwa na kuandikwa (siyo inayoweza kutekelezwa).__got:
Jedwali la Kielekezi cha Kijumla__nl_symbol_ptr
: Alama ya ishara isiyo wavivu (inayobana wakati wa kupakia)__la_symbol_ptr
: Alama ya ishara wavivu (inayobana wakati wa matumizi)__const
: Inapaswa kuwa data isiyoweza kubadilishwa (sio kweli)__cfstring
: Herufi za CoreFoundation__data
: Vigezo vya kawaida (ambavyo vimeanzishwa)__bss
: Vigezo vya tuli (ambavyo havijaanzishwa)__objc_*
(__objc_classlist, __objc_protolist, nk): Taarifa zinazotumiwa na muda wa Objective-C__DATA_CONST
: __DATA.__const haihakikishiwi kuwa ya kudumu (ruhusa ya kuandika), wala viashiria vingine na jedwali la Kielekezi cha Kijumla. Sehemu hii inafanya__const
, baadhi ya waanzilishi na jedwali la Kielekezi cha Kijumla (baada ya kutatuliwa) kuwa soma tu kwa kutumiamprotect
.__LINKEDIT
: Ina taarifa kwa kiungo (dyld) kama vile, alama, herufi, na maktaba za uhamishaji. Ni chombo cha jumla cha yaliyomo ambayo hayamo katika__TEXT
au__DATA
na yaliyomo yake yanaelezwa katika amri zingine za kupakia.Taarifa za dyld: Rebase, Opcodes za kubana zisizo wavivu/wavivu/dhaifu na habari ya kuuza
Kuanza kwa Kazi: Jedwali la anwani za kuanza za kazi
Data Ndani ya Kanuni: Visiwa vya data katika __text
Jedwali la Alama: Alama katika binary
Jedwali la Alama Isiyokuwa ya Moja kwa Moja: Alama za kielekezi/stub
Jedwali la Herufi
Saini ya Kanuni
__OBJC
: Ina taarifa zinazotumiwa na muda wa Objective-C. Ingawa taarifa hii inaweza kupatikana pia katika sehemu ya __DATA, ndani ya sehemu mbalimbali za __objc_*.__RESTRICT
: Sehemu bila yaliyomo yenye sehemu moja tu inayoitwa__restrict
(pia tupu) ambayo inahakikisha kwamba wakati wa kukimbia binary, itapuuza viwango vya mazingira vya DYLD.
Kama ilivyowezekana kuona katika kanuni, sehemu pia zinaunga mkono bendera (ingawa mara nyingi hazitumiwi sana):
SG_HIGHVM
: Msingi pekee (haikutumiwa)SG_FVMLIB
: HaikutumiwaSG_NORELOC
: Sehemu haina uhamishajiSG_PROTECTED_VERSION_1
: Ufichaji. Hutumiwa kwa mfano na Finder kuficha maandishi ya sehemu ya__TEXT
.
LC_UNIXTHREAD/LC_MAIN
LC_UNIXTHREAD/LC_MAIN
LC_MAIN
inaingiza sehemu ya kuingia katika sifa ya entryoff. Wakati wa kupakia, dyld tu inaongeza thamani hii kwenye (kumbukumbu) msingi wa binary, kisha inahamia kwenye maagizo haya kuanza utekelezaji wa kanuni ya binary.
LC_UNIXTHREAD
ina thamani ambazo kisajili kinapaswa kuwa nacho wakati wa kuanza mnyororo wa kazi kuu. Hii tayari imepitwa na wakati lakini dyld
bado inaitumia. Inawezekana kuona thamani za visajili vilivyowekwa na hii kwa:
LC_CODE_SIGNATURE
LC_CODE_SIGNATURE
Ina taarifa kuhusu sahihi ya nambari ya faili ya Macho-O. Ina offset tu ambayo inaelekeza kwenye blob ya sahihi. Kawaida iko mwishoni mwa faili. Hata hivyo, unaweza kupata baadhi ya taarifa kuhusu sehemu hii katika chapisho hili la blogu na hii gists.
LC_ENCRYPTION_INFO[_64]
LC_ENCRYPTION_INFO[_64]
Inasaidia kwa kificho cha kuficha faili. Hata hivyo, bila shaka, ikiwa mshambuliaji anafanikiwa kuhatarisha mchakato, ataweza kudump kumbukumbu bila kufichwa.
LC_LOAD_DYLINKER
LC_LOAD_DYLINKER
Ina njia ya kutekelezeka ya kiungo cha kudhibiti ambayo inafanya ramani maktaba zinazoshirikiwa kwenye nafasi ya anwani ya mchakato. Thamani daima inawekwa kwa /usr/lib/dyld
. Ni muhimu kutambua kwamba katika macOS, ramani ya dylib hufanyika katika mode ya mtumiaji, sio katika mode ya kernel.
LC_IDENT
LC_IDENT
Imepitwa na wakati lakini ikipangwa kuzalisha dumps wakati wa mshtuko, kudump kwa msingi wa Mach-O hufanywa na toleo la kernel linawekwa katika amri ya LC_IDENT
.
LC_UUID
LC_UUID
UUID Isiyotabirika. Ni muhimu kwa chochote moja kwa moja lakini XNU inahifadhi na habari nyingine ya mchakato. Inaweza kutumika katika ripoti za ajali.
LC_DYLD_ENVIRONMENT
LC_DYLD_ENVIRONMENT
Inaruhusu kuonyesha mazingira ya mazingira kwa dyld kabla ya mchakato kutekelezwa. Hii inaweza kuwa hatari sana kwani inaweza kuruhusu kutekeleza nambari ya aina yoyote ndani ya mchakato hivyo amri ya mzigo hii hutumiwa tu katika dyld iliyoundwa na #define SUPPORT_LC_DYLD_ENVIRONMENT
na inazuia usindikaji zaidi tu kwa mazingira ya aina DYLD_..._PATH
inayoeleza njia za mzigo.
LC_LOAD_DYLIB
LC_LOAD_DYLIB
Amri ya mzigo hii inaelezea tegemezi la maktaba ya kudhibiti ambayo inawaagiza mzigo (dyld) kwa kupakia na kuunganisha maktaba hiyo. Kuna amri ya mzigo ya LC_LOAD_DYLIB
kwa kila maktaba ambayo faili ya Mach-O inahitaji.
Amri ya mzigo hii ni muundo wa aina
dylib_command
(ambao una struct dylib, ukiainisha maktaba ya kudhibiti inayotegemea halisi):
Ungepata habari hii pia kutoka kwa cli kwa:
Baadhi ya maktaba zinazohusiana na zisizo za zisizo za zisizo ni:
DiskArbitration: Kufuatilia diski za USB
AVFoundation: Kukamata sauti na video
CoreWLAN: Uchunguzi wa Wifi.
Mach-O binary inaweza kuwa na moja au zaidi constructors, ambazo zitafanywa kabla ya anwani iliyoainishwa katika LC_MAIN. Offsets ya wajenzi wowote zinashikiliwa katika sehemu ya __mod_init_func ya segimenti ya __DATA_CONST.
Data ya Mach-O
Katikati ya faili kuna eneo la data, ambalo linaundwa na sehemu kadhaa kama ilivyoelezwa katika eneo la amri za mzigo. Aina mbalimbali za sehemu za data zinaweza kuhifadhiwa ndani ya kila segimenti, na kila sehemu inashikilia kanuni au data maalum kwa aina.
Data ni sehemu inayohusisha habari zote ambazo zinapakiwa na amri za mzigo LC_SEGMENTS_64
Hii ni pamoja na:
Jedwali la kazi: Ambalo linashikilia habari kuhusu kazi za programu.
Jedwali la alama: Ambalo lina habari kuhusu kazi za nje zinazotumiwa na binary
Pia inaweza kuwa na kazi za ndani, majina ya vitu, na zaidi.
Ili kuangalia unaweza kutumia chombo cha Mach-O View:
Au kutoka kwa cli:
Sehemu za Kawaida za Objective-C
Katika segimenti ya __TEXT
(r-x):
__objc_classname
: Majina ya darasa (herufi)__objc_methname
: Majina ya mbinu (herufi)__objc_methtype
: Aina za mbinu (herufi)
Katika segimenti ya __DATA
(rw-):
__objc_classlist
: Pointa kwa darasa zote za Objective-C__objc_nlclslist
: Pointa kwa Darasa za Objective-C zisizo za uvivu__objc_catlist
: Pointa kwa Jamii__objc_nlcatlist
: Pointa kwa Jamii zisizo za uvivu__objc_protolist
: Orodha ya Itifaki__objc_const
: Data ya kudumu__objc_imageinfo
,__objc_selrefs
,objc__protorefs
...
Swift
_swift_typeref
,_swift3_capture
,_swift3_assocty
,_swift3_types, _swift3_proto
,_swift3_fieldmd
,_swift3_builtin
,_swift3_reflstr
Last updated