macOS IOKit
Temel Bilgiler
I/O Kit, XNU çekirdeğindeki açık kaynaklı, nesne yönelimli aygıt sürücü çerçevesidir, dinamik olarak yüklenen aygıt sürücülerini işler. Çeşitli donanımı destekleyen çekirdeğe modüler kodun anında eklenmesine izin verir.
IOKit sürücüleri temelde çekirdekten fonksiyonlar ihraç eder. Bu fonksiyon parametre türleri önceden tanımlanmıştır ve doğrulanır. Dahası, XPC gibi, IOKit sadece Mach mesajlarının üzerinde başka bir katmandır.
IOKit XNU çekirdek kodu, Apple tarafından https://github.com/apple-oss-distributions/xnu/tree/main/iokit adresinde açık kaynak olarak yayınlanmıştır. Ayrıca, kullanıcı alanı IOKit bileşenleri de açık kaynaktır https://github.com/opensource-apple/IOKitUser.
Ancak, hiçbir IOKit sürücüsü açık kaynak değildir. Neyse ki, zaman zaman bir sürücünün sürümü, onu hata ayıklamayı kolaylaştıran sembollerle gelebilir. Firmware'den sürücü uzantılarını nasıl alacağınızı buradan öğrenin.
C++ dilinde yazılmıştır. Demangled C++ sembollerini alabilirsiniz:
IOKit açık fonksiyonları, bir istemcinin bir işlevi çağırmaya çalıştığında ek güvenlik kontrolleri gerçekleştirebilir ancak uygulamalar genellikle IOKit fonksiyonlarıyla etkileşime girebilecekleri kum havuzu tarafından sınırlanır.
Sürücüler
macOS'ta şurada bulunurlar:
/System/Library/Extensions
OS X işletim sistemi içine yerleştirilmiş KEXT dosyaları.
/Library/Extensions
taraf yazılım tarafından yüklenen KEXT dosyaları
iOS'ta şurada bulunurlar:
/System/Library/Extensions
Sayı 9'a kadar listelenen sürücüler 0 adresinde yüklenir. Bu, bunların gerçek sürücüler olmadığı anlamına gelir ve çekilemezler.
Belirli uzantıları bulmak için şunu kullanabilirsiniz:
Kernel uzantılarını yüklemek ve kaldırmak için şunları yapın:
IORegistry
IORegistry, macOS ve iOS'taki IOKit çerçevesinin kritik bir parçasıdır ve sistem donanım konfigürasyonunu ve durumunu temsil etmek için bir veritabanı olarak hizmet verir. Tüm donanım ve sürücüleri temsil eden nesnelerin hiyerarşik bir koleksiyonudur ve birbirleriyle olan ilişkilerini gösterir.
IORegistry'yi ioreg
komutunu kullanarak konsoldan inceleyebilirsiniz (özellikle iOS için kullanışlıdır).
IORegistryExplorer
'ı https://developer.apple.com/download/all/ adresinden Xcode Ek Araçları'ndan indirebilir ve grafiksel arayüz aracılığıyla macOS IORegistry'yi inceleyebilirsiniz.
IORegistryExplorer'da "planes" (düzlemler), IORegistry'deki farklı nesneler arasındaki ilişkileri düzenlemek ve göstermek için kullanılır. Her düzlem, sistem donanımının ve sürücü yapılandırmasının belirli bir görünümünü veya belirli bir ilişki türünü temsil eder. İşte IORegistryExplorer'da karşılaşabileceğiniz bazı yaygın düzlemler:
IOService Düzlemi: Bu en genel düzlemdir, sürücüleri ve nub'ları (sürücüler arasındaki iletişim kanalları) temsil eden hizmet nesnelerini gösterir. Bu nesneler arasındaki sağlayıcı-müşteri ilişkilerini gösterir.
IODeviceTree Düzlemi: Bu düzlem, cihazların sistemdeki bağlantılarını temsil eder. USB veya PCI gibi otobüsler aracılığıyla bağlanan cihazların hiyerarşisini görselleştirmek için sıkça kullanılır.
IOPower Düzlemi: Nesneleri ve ilişkilerini güç yönetimi açısından gösterir. Diğer nesnelerin güç durumunu etkileyen nesneleri gösterebilir, güçle ilgili sorunları gidermek için faydalıdır.
IOUSB Düzlemi: Özellikle USB cihazlarına ve ilişkilerine odaklanır, USB hub'larının ve bağlı cihazların hiyerarşisini gösterir.
IOAudio Düzlemi: Bu düzlem, ses cihazlarını ve sistem içindeki ilişkilerini temsil etmek içindir.
...
Sürücü İletişim Kod Örneği
Aşağıdaki kod, "YourServiceNameHere"
adlı IOKit hizmetine bağlanır ve seçici 0 içindeki işlevi çağırır. Bunun için:
İlk olarak
IOServiceMatching
veIOServiceGetMatchingServices
'i çağırarak hizmeti alır.Ardından
IOServiceOpen
çağırarak bir bağlantı kurar.Ve son olarak
IOConnectCallScalarMethod
ile seçici 0'ı (seçici, çağırmak istediğiniz işlevin atandığı numaradır) belirterek bir işlevi çağırır.
IOConnectCallScalarMethod gibi IOKit işlevlerini çağırmak için kullanılabilecek IOConnectCallMethod, IOConnectCallStructMethod gibi diğer işlevler bulunmaktadır.
Sürücü giriş noktasını tersine çevirme
Bunları örneğin bir firmware görüntüsünden (ipsw) elde edebilirsiniz. Daha sonra, favori dekompilerinize yükleyin.
Doğru işlevi çağıran çağrıyı alan ve doğru işlevi çağıran sürücü işlevi olan externalMethod işlevini dekompilasyona başlayabilirsiniz:
Bu korkunç çağrı, şunu ifade eder:
Önceki tanımda self
parametresinin eksik olduğuna dikkat edin, doğru tanım şu şekilde olmalıdır:
Aslında, gerçek tanımı https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/Kernel/IOUserClient.cpp#L6388 adresinde bulabilirsiniz:
Bu bilgiyle Ctrl+Right -> Düzenle fonksiyon imzası
yeniden yazılabilir ve bilinen tipler ayarlanabilir:
Yeni decompile edilmiş kod şu şekilde görünecek:
Bir sonraki adım için IOExternalMethodDispatch2022
yapısının tanımlanmış olması gerekiyor. https://github.com/apple-oss-distributions/xnu/blob/1031c584a5e37aff177559b9f69dbd3c8c3fd30a/iokit/IOKit/IOUserClient.h#L168-L176 adresinde açık kaynaklıdır, şu şekilde tanımlayabilirsiniz:
Şimdi, (IOExternalMethodDispatch2022 *)&sIOExternalMethodArray
takip ederek birçok veri görebilirsiniz:
Veri Türünü IOExternalMethodDispatch2022:
olarak değiştirin:
değişiklikten sonra:
Ve şimdi, içinde 7 elemanın bir dizisi olduğunu biliyoruz (son decompile edilmiş kodu kontrol edin), 7 elemanlık bir dizi oluşturmak için tıklayın:
Dizi oluşturulduktan sonra tüm ihraç edilen fonksiyonları görebilirsiniz:
Hatırlarsanız, kullanıcı alanından bir ihraç edilen fonksiyonu çağırmak için fonksiyonun adını değil, seçici numarasını çağırmamız gerekir. Burada, seçici 0'ın initializeDecoder
fonksiyonu, seçici 1'in startDecoder
fonksiyonu, seçici 2'nin initializeEncoder
fonksiyonu olduğunu görebilirsiniz...
Last updated