macOS IOKit
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Die I/O Kit is 'n oopbron, objek-georiënteerde toestuurder-raamwerk in die XNU-kern, wat dynamies gelaaide toestel bestuurders hanteer. Dit laat modulaire kode toe om aan die kern bygevoeg te word terwyl dit loop, wat diverse hardeware ondersteun.
IOKit bestuurders sal basies funksies van die kern uitvoer. Hierdie funksie parameter tipes is vooraf gedefinieer en word geverifieer. Boonop, soortgelyk aan XPC, is IOKit net 'n ander laag op bo van Mach-boodskappe.
IOKit XNU-kernkode is oopbron gemaak deur Apple in https://github.com/apple-oss-distributions/xnu/tree/main/iokit. Boonop is die gebruikersruimte IOKit-komponente ook oopbron https://github.com/opensource-apple/IOKitUser.
Egter, geen IOKit bestuurders is oopbron. In elk geval, van tyd tot tyd kan 'n vrystelling van 'n bestuurder kom met simbole wat dit makliker maak om dit te debug. Kyk hoe om die bestuurder uitbreidings van die firmware hier te kry.
Dit is geskryf in C++. Jy kan demangled C++ simbole kry met:
IOKit blootgestelde funksies kan addisionele sekuriteitskontroles uitvoer wanneer 'n kliënt probeer om 'n funksie aan te roep, maar let daarop dat die toepassings gewoonlik beperk is deur die sandbox waartoe IOKit-funksies hulle kan interaksie hê.
In macOS is hulle geleë in:
/System/Library/Extensions
KEXT-lêers ingebou in die OS X-bedryfstelsel.
/Library/Extensions
KEXT-lêers geïnstalleer deur 3de party sagteware
In iOS is hulle geleë in:
/System/Library/Extensions
Tot nommer 9 is die gelysde bestuurders gelaai in die adres 0. Dit beteken dat dit nie werklike bestuurders is nie, maar deel van die kern en hulle kan nie ontlaai word nie.
Om spesifieke uitbreidings te vind, kan jy gebruik maak van:
Om kernuitbreidings te laai en te ontlaai, doen:
Die IORegistry is 'n belangrike deel van die IOKit-raamwerk in macOS en iOS wat dien as 'n databasis om die stelsel se hardeware-konfigurasie en toestand voor te stel. Dit is 'n hiërargiese versameling van objekke wat al die hardeware en bestuurders wat op die stelsel gelaai is, en hul verhoudings tot mekaar voorstel.
Jy kan die IORegistry verkry met die cli ioreg
om dit vanaf die konsole te inspekteer (spesiaal nuttig vir iOS).
You could download IORegistryExplorer
from Xcode Additional Tools from https://developer.apple.com/download/all/ and inspect the macOS IORegistry through a graphical interface.
In IORegistryExplorer, "planes" are used to organize and display the relationships between different objects in the IORegistry. Each plane represents a specific type of relationship or a particular view of the system's hardware and driver configuration. Here are some of the common planes you might encounter in IORegistryExplorer:
IOService Plane: Dit is die mees algemene vlak, wat die diensobjekte vertoon wat bestuurders en nubs (kommunikasiekanale tussen bestuurders) verteenwoordig. Dit wys die verskaffer-klant verhoudings tussen hierdie objek.
IODeviceTree Plane: Hierdie vlak verteenwoordig die fisiese verbande tussen toestelle soos hulle aan die stelsel gekoppel is. Dit word dikwels gebruik om die hiërargie van toestelle wat via busse soos USB of PCI gekoppel is, te visualiseer.
IOPower Plane: Vertoon objek en hul verhoudings in terme van kragbestuur. Dit kan wys watter objek die kragtoestand van ander beïnvloed, nuttig vir die ontfouting van kragverwante probleme.
IOUSB Plane: Spesifiek gefokus op USB-toestelle en hul verhoudings, wat die hiërargie van USB-hubs en gekonnekte toestelle wys.
IOAudio Plane: Hierdie vlak is vir die verteenwoordiging van klanktoestelle en hul verhoudings binne die stelsel.
...
The following code connects to the IOKit service "YourServiceNameHere"
and calls the function inside the selector 0. For it:
it first calls IOServiceMatching
and IOServiceGetMatchingServices
to get the service.
It then establish a connection calling IOServiceOpen
.
And it finally calls a function with IOConnectCallScalarMethod
indicating the selector 0 (the selector is the number the function you want to call has assigned).
Daar is ander funksies wat gebruik kan word om IOKit funksies aan te roep behalwe IOConnectCallScalarMethod
soos IOConnectCallMethod
, IOConnectCallStructMethod
...
Jy kan hierdie verkry byvoorbeeld van 'n firmware beeld (ipsw). Laai dit dan in jou gunsteling decompiler.
Jy kan begin om die externalMethod
funksie te dekompileer, aangesien dit die bestuurder funksie is wat die oproep sal ontvang en die korrekte funksie sal aanroep:
Daardie vreselike oproep demagled beteken:
Let op hoe die self
parameter in die vorige definisie ontbreek, die goeie definisie sou wees:
Werklik, jy kan die werklike definisie vind in https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/Kernel/IOUserClient.cpp#L6388:
Met hierdie inligting kan jy Ctrl+Right -> Edit function signature
herskryf en die bekende tipes stel:
Die nuwe dekompilde kode sal soos volg lyk:
Vir die volgende stap moet ons die IOExternalMethodDispatch2022
struktuur gedefinieer hê. Dit is oopbron in https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/IOKit/IOUserClient.h#L168-L176, jy kan dit definieer:
Nou, volg die (IOExternalMethodDispatch2022 *)&sIOExternalMethodArray
kan jy 'n klomp data sien:
Verander die Data Type na IOExternalMethodDispatch2022:
na die verandering:
En soos ons nou daar is, het ons 'n array van 7 elemente (kyk die finale dekompilde kode), klik om 'n array van 7 elemente te skep:
Nadat die array geskep is, kan jy al die geexporteerde funksies sien:
As jy onthou, om 'n geexporteerde funksie vanuit gebruikersruimte te roep, hoef ons nie die naam van die funksie te noem nie, maar die selector nommer. Hier kan jy sien dat die selector 0 die funksie initializeDecoder
is, die selector 1 is startDecoder
, die selector 2 initializeEncoder
...
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)