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)
IO Kit to otwartoźródłowy, obiektowy framework sterowników urządzeń w jądrze XNU, obsługujący dynamicznie ładowane sterowniki urządzeń. Umożliwia dodawanie modularnego kodu do jądra w locie, wspierając różnorodny sprzęt.
Sterowniki IOKit zasadniczo eksportują funkcje z jądra. Typy parametrów tych funkcji są zdefiniowane z góry i są weryfikowane. Ponadto, podobnie jak XPC, IOKit jest po prostu kolejną warstwą na szczycie komunikatów Mach.
Kod jądra IOKit XNU jest otwartoźródłowy i udostępniony przez Apple w https://github.com/apple-oss-distributions/xnu/tree/main/iokit. Ponadto, komponenty IOKit w przestrzeni użytkownika są również otwartoźródłowe https://github.com/opensource-apple/IOKitUser.
Jednakże, żadne sterowniki IOKit nie są otwartoźródłowe. Tak czy inaczej, od czasu do czasu wydanie sterownika może zawierać symbole, które ułatwiają jego debugowanie. Sprawdź, jak uzyskać rozszerzenia sterownika z oprogramowania układowego tutaj.
Jest napisany w C++. Możesz uzyskać zdemanglowane symbole C++ za pomocą:
Funkcje exponowane przez IOKit mogą wykonywać dodatkowe kontrole bezpieczeństwa, gdy klient próbuje wywołać funkcję, ale należy zauważyć, że aplikacje są zazwyczaj ograniczone przez piaskownicę, z którymi funkcjami IOKit mogą wchodzić w interakcje.
W macOS znajdują się w:
/System/Library/Extensions
Pliki KEXT wbudowane w system operacyjny OS X.
/Library/Extensions
Pliki KEXT zainstalowane przez oprogramowanie firm trzecich
W iOS znajdują się w:
/System/Library/Extensions
Do momentu numeru 9 wymienione sterowniki są załadowane pod adresem 0. Oznacza to, że nie są to prawdziwe sterowniki, ale część jądra i nie mogą być odładowane.
Aby znaleźć konkretne rozszerzenia, możesz użyć:
Aby załadować i odładować rozszerzenia jądra, wykonaj:
IORegistry jest kluczową częścią frameworka IOKit w macOS i iOS, który służy jako baza danych do reprezentowania konfiguracji i stanu sprzętu systemu. To hierarchiczna kolekcja obiektów, które reprezentują cały sprzęt i sterowniki załadowane w systemie oraz ich wzajemne relacje.
Możesz uzyskać IORegistry za pomocą cli ioreg
, aby go zbadać z konsoli (szczególnie przydatne dla iOS).
Możesz pobrać IORegistryExplorer
z Xcode Additional Tools z https://developer.apple.com/download/all/ i zbadać macOS IORegistry za pomocą graficznego interfejsu.
W IORegistryExplorer "płaszczyzny" są używane do organizowania i wyświetlania relacji między różnymi obiektami w IORegistry. Każda płaszczyzna reprezentuje określony typ relacji lub szczególny widok konfiguracji sprzętowej i sterowników systemu. Oto niektóre z powszechnych płaszczyzn, które możesz napotkać w IORegistryExplorer:
IOService Plane: To najbardziej ogólna płaszczyzna, wyświetlająca obiekty usług, które reprezentują sterowniki i nuby (kanały komunikacyjne między sterownikami). Pokazuje relacje dostawca-klient między tymi obiektami.
IODeviceTree Plane: Ta płaszczyzna reprezentuje fizyczne połączenia między urządzeniami, gdy są podłączone do systemu. Często jest używana do wizualizacji hierarchii urządzeń podłączonych przez magistrale, takie jak USB lub PCI.
IOPower Plane: Wyświetla obiekty i ich relacje w kontekście zarządzania energią. Może pokazać, które obiekty wpływają na stan zasilania innych, co jest przydatne do debugowania problemów związanych z zasilaniem.
IOUSB Plane: Skupia się na urządzeniach USB i ich relacjach, pokazując hierarchię hubów USB i podłączonych urządzeń.
IOAudio Plane: Ta płaszczyzna jest przeznaczona do reprezentowania urządzeń audio i ich relacji w systemie.
...
Poniższy kod łączy się z usługą IOKit "YourServiceNameHere"
i wywołuje funkcję wewnątrz selektora 0. W tym celu:
najpierw wywołuje IOServiceMatching
i IOServiceGetMatchingServices
, aby uzyskać usługę.
Następnie nawiązuje połączenie, wywołując IOServiceOpen
.
A na końcu wywołuje funkcję za pomocą IOConnectCallScalarMethod
, wskazując selektor 0 (selektor to numer przypisany funkcji, którą chcesz wywołać).
There are inne functions that can be used to call IOKit functions apart of IOConnectCallScalarMethod
like IOConnectCallMethod
, IOConnectCallStructMethod
...
You could obtain these for example from a obraz oprogramowania (ipsw). Then, load it into your favourite decompiler.
You could start decompiling the externalMethod
function as this is the driver function that will be receiving the call and calling the correct function:
That awful call demagled means:
Zauważ, że w poprzedniej definicji brakuje parametru self
, dobra definicja to:
W rzeczywistości możesz znaleźć prawdziwą definicję pod tym adresem https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/Kernel/IOUserClient.cpp#L6388:
Z tymi informacjami możesz przepisać Ctrl+Right -> Edit function signature
i ustawić znane typy:
Nowy dekompilowany kod będzie wyglądał następująco:
Na następnym kroku musimy zdefiniować strukturę IOExternalMethodDispatch2022
. Jest to open source w https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/IOKit/IOUserClient.h#L168-L176, możesz ją zdefiniować:
Teraz, podążając za (IOExternalMethodDispatch2022 *)&sIOExternalMethodArray
, możesz zobaczyć wiele danych:
Zmień typ danych na IOExternalMethodDispatch2022:
po zmianie:
Jak teraz widzimy, mamy tablicę 7 elementów (sprawdź końcowy dekompilowany kod), kliknij, aby utworzyć tablicę 7 elementów:
Po utworzeniu tablicy możesz zobaczyć wszystkie eksportowane funkcje:
Jeśli pamiętasz, aby wywołać funkcję eksportowaną z przestrzeni użytkownika, nie musimy wywoływać nazwy funkcji, ale numer selektora. Tutaj możesz zobaczyć, że selektor 0 to funkcja initializeDecoder
, selektor 1 to startDecoder
, selektor 2 initializeEncoder
...
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)