macOS IOKit
Taarifa Msingi
IO Kit ni mtandao wa madereva wa kifaa wa chanzo wazi, wenye mwelekeo wa vitu katika kernel ya XNU, unashughulikia madereva ya kifaa yaliyopakiwa kwa kudumu. Inaruhusu msimbo wa modular kuongezwa kwa kernel mara moja, ikiunga mkono vifaa mbalimbali.
Madereva ya IOKit kimsingi hutoa kazi kutoka kernel. Aina za parameta za kazi hizi ni zilizopangwa mapema na kuthibitishwa. Zaidi ya hayo, kama XPC, IOKit ni safu nyingine tu juu ya ujumbe wa Mach.
Msimbo wa kernel wa IOKit XNU umefunguliwa na Apple katika https://github.com/apple-oss-distributions/xnu/tree/main/iokit. Zaidi ya hayo, vipengele vya IOKit vya nafasi ya mtumiaji pia vimefunguliwa https://github.com/opensource-apple/IOKitUser.
Hata hivyo, madereva ya IOKit hayajafunguliwa. Hata hivyo, mara kwa mara kutolewa kwa dereva kunaweza kuja na alama ambazo hufanya iwe rahisi kuidungua. Angalia jinsi ya kupata nyongeza za dereva kutoka kwa firmware hapa.
Imeandikwa katika C++. Unaweza kupata alama za C++ zilizopanguliwa na:
IOKit kazi zilizofunuliwa zinaweza kufanya ukaguzi wa ziada wa usalama wakati mteja anajaribu kuita kazi lakini kumbuka kuwa programu kawaida zinazuiliwa na sandbox ambayo IOKit kazi wanaweza kuingiliana nayo.
Madereva
Katika macOS zinapatikana katika:
/System/Library/Extensions
Faili za KEXT zilizojengwa katika mfumo wa uendeshaji wa OS X.
/Library/Extensions
Faili za KEXT zilizowekwa na programu ya tatu
Katika iOS zinapatikana katika:
/System/Library/Extensions
Mpaka nambari 9 madereva yaliyoorodheshwa yanapakia katika anwani 0. Hii inamaanisha kuwa hayo si madereva halisi bali ni sehemu ya kernel na haziwezi kuondolewa.
Ili kupata nyongeza maalum unaweza kutumia:
Kupakia na kusafirisha vifaa vya msingi fanya:
IORegistry
IORegistry ni sehemu muhimu ya mfumo wa IOKit katika macOS na iOS ambayo hutumika kama database ya kuwakilisha usanidi na hali ya vifaa vya mfumo. Ni mkusanyiko wa hiari wa vitu vinavyowakilisha vifaa vyote na madereva vilivyopakiwa kwenye mfumo, na uhusiano wao kati yao.
Unaweza kupata IORegistry kwa kutumia cli ioreg
kuikagua kutoka kwenye koni (hasa muhimu kwa iOS).
Unaweza kupakua IORegistryExplorer
kutoka Zana Zingine za Xcode kutoka https://developer.apple.com/download/all/ na ukague macOS IORegistry kupitia kiolesura cha picha.
Katika IORegistryExplorer, "planes" hutumiwa kuandaa na kuonyesha uhusiano kati ya vitu tofauti katika IORegistry. Kila ndege inawakilisha aina maalum ya uhusiano au mtazamo maalum wa vifaa vya mfumo na usanidi wa dereva. Hapa kuna baadhi ya ndege za kawaida unazoweza kukutana nazo katika IORegistryExplorer:
IOService Plane: Hii ni ndege ya kawaida zaidi, inayoonyesha vitu vya huduma vinavyowakilisha dereva na nubs (njia za mawasiliano kati ya madereva). Inaonyesha uhusiano wa mtoa huduma-mteja kati ya vitu hivi.
IODeviceTree Plane: Ndege hii inawakilisha uhusiano wa kimwili kati ya vifaa wanavyounganishwa kwenye mfumo. Mara nyingi hutumiwa kuona muundo wa vifaa vilivyounganishwa kupitia mabasi kama vile USB au PCI.
IOPower Plane: Inaonyesha vitu na uhusiano wao kwa upande wa usimamizi wa nguvu. Inaweza kuonyesha ni vitu vipi vinavyoathiri hali ya nguvu ya vingine, inayofaa kwa kutatua matatizo yanayohusiana na nguvu.
IOUSB Plane: Kuzingatia hasa vifaa vya USB na uhusiano wao, ikiwaonyesha muundo wa vituo vya USB na vifaa vilivyounganishwa.
IOAudio Plane: Ndege hii ni kwa ajili ya kuwakilisha vifaa vya sauti na uhusiano wao ndani ya mfumo.
...
Mfano wa Kanuni ya Mawasiliano ya Dereva
Msimbo ufuatao unahusiana na huduma ya IOKit "JinaLakoLaHudumaHapa"
na kuita kazi ndani ya kuchagua 0. Kwa hilo:
kwanza inaita
IOServiceMatching
naIOServiceGetMatchingServices
kupata huduma.Kisha inathibitisha uhusiano kwa kuita
IOServiceOpen
.Na hatimaye inaita kazi na
IOConnectCallScalarMethod
ikionyesha kuchagua 0 (kuchagua ni nambari ambayo kazi unayotaka kuita imepewa).
Kuna kazi nyingine ambazo zinaweza kutumika kuita kazi za IOKit isipokuwa IOConnectCallScalarMethod
kama vile IOConnectCallMethod
, IOConnectCallStructMethod
...
Kugeuza mshale wa dereva
Unaweza kupata hizi kwa mfano kutoka kwa picha ya firmware (ipsw). Kisha, iweke kwenye decompiler yako pendwa.
Unaweza kuanza kudecompile kazi ya externalMethod
kwani hii ni kazi ya dereva ambayo itapokea simu na kuita kazi sahihi:
Simu hiyo mbaya iliyopanguliwa inamaanisha:
Tazama jinsi katika ufafanuzi uliopita paramu ya self
imeachwa, ufafanuzi mzuri ungekuwa:
Kwa kweli, unaweza kupata ufafanuzi halisi katika https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/Kernel/IOUserClient.cpp#L6388:
Na habari hii unaweza kuandika upya Ctrl+Right -> Hariri saini ya kazi
na weka aina zilizojulikana:
Msimbo uliokwisha kudecompile utaonekana kama:
Kwa hatua inayofuata tunahitaji kuwa tumefafanua muundo wa IOExternalMethodDispatch2022
. Ni wazi chanzo katika https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/IOKit/IOUserClient.h#L168-L176, unaweza kufafanua hivyo:
Sasa, kufuatia (IOExternalMethodDispatch2022 *)&sIOExternalMethodArray
unaweza kuona data nyingi:
Badilisha Aina ya Data kuwa IOExternalMethodDispatch2022:
baada ya mabadiliko:
Na sasa tunavyo huko tuna array ya vipengele 7 (angalia msimbo uliokwisha kudecompile), bonyeza kuunda array ya vipengele 7:
Baada ya array kuundwa unaweza kuona kazi zote zilizosafirishwa:
Ukikumbuka, kwa kupiga kazi iliyosafirishwa kutoka nafasi ya mtumiaji hatuhitaji kupiga jina la kazi, bali namba ya kuchagua. Hapa unaweza kuona kwamba chaguo 0 ni kazi initializeDecoder
, chaguo 1 ni startDecoder
, chaguo 2 initializeEncoder
...
Last updated