Bibliothek zum Parsen von Macho -Dateien, um verschiedene Informationen zu erhalten.
Zusätzlich zum Lesen von Dateien wird auch das Parsen von Bildern im Speicher von _dyld_get_image_header unterstützt.
Verwenden Sie zum Lesen aus dem Speicher die MachOImage -Struktur.
Es kann mit dem von _dyld_get_image_header erhaltenen Mach-O-Header-Zeiger initialisiert werden.
guard let mh = _dyld_get_image_header ( 0 ) else { return }
let machO = MachOImage ( ptr : mh )Alternativ kann es mit dem Namen initialisiert werden.
// /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
guard let machO = MachOImage ( name : " Foundation " ) else { return } Verwenden Sie zum Lesen aus der Datei die MachOFile .
Das Lesen aus einer Datei kann wie folgt sein. Es gibt einen Fall einer Fettdatei und einer einzelnen Macho -Datei, sodass ein bedingter Verzweigungsvorgang erforderlich ist.
let path = " Path to MachO file "
let url = URL ( string : path )
let file = try MachOKit . loadFromFile ( url : url )
switch file {
case . machO ( let machOFile ) : // single MachO file
print ( machOFile )
case . fat ( let fatFile ) : // Fat file
let machOFiles = try fatFile . machOFiles ( )
print ( machOFiles )
} Sowohl MachOImage als auch MachOFile können im Wesentlichen die gleichen Eigenschaften und Methoden verwenden. Die verfügbaren Methoden werden in der folgenden Datei als MachORepresentable -Protokoll definiert.
Machorepresentierbar
Das Laden von dyld_shared_cache wird ebenfalls unterstützt.
Die verfügbaren Methoden werden in der folgenden Datei als DyldCacheRepresentable -Protokoll definiert.
DyldCacheRepresentable
let path = " /System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e "
let url = URL ( fileURLWithPath : path )
let cache = try ! DyldCache ( url : url ) Es ist auch möglich, Macho -Informationen zu extrahieren, die in dyld_shared_cache enthalten sind. Das extrahierte Macho ist vom Typ MachOFile . Wie beim Lesen einer einzelnen Macho -Datei sind verschiedene Analysen möglich.
let machOs = cache . machOFiles ( )
for machO in machOs {
print (
String ( machO . headerStartOffsetInCache , radix : 16 ) ,
machO . imagePath ,
machO . header . ncmds
)
}
// 5c000 /usr/lib/libobjc.A.dylib 22
// 98000 /usr/lib/dyld 15
// 131000 /usr/lib/system/libsystem_blocks.dylib 24
// ...Auf der Apple -Plattform wird der DYLD -Cache im Speicher bereitgestellt.
var size = 0
guard let ptr = _dyld_get_shared_cache_range ( & size ) else {
return
}
let cache = try ! DyldCacheLoaded ( ptr : ptr ) Es ist auch möglich, Macho -Informationen zu extrahieren, die in dyld_shared_cache enthalten sind. Das extrahierte Macho ist vom Typ MachOImage . Wie beim Lesen aus einem einzigen Macho -Bild sind verschiedene Analysen möglich.
let machOs = cache . machOImages ( )
for machO in machOs {
print (
String ( Int ( bitPattern : machO . ptr ) , radix : 16 ) ,
machO . path! ,
machO . header . ncmds
)
}
// 193438000 /usr/lib/libobjc.A.dylib 24
// 193489000 /usr/lib/dyld 15
// 193513000 /usr/lib/system/libsystem_blocks.dylib 24
// ...Es gibt eine Vielzahl von Verwendungszwecken, aber die meisten zeigen ein grundlegendes Beispiel, das die Ausgabe in das Testverzeichnis druckt.
Die folgende Datei enthält Beispielcode. Machoprinttests
Die folgende Datei enthält Beispielcode. MachoFileprinttests
Die folgende Datei enthält Beispielcode. DyldCacheprinttests
Die folgende Datei enthält Beispielcode. DyldcacheloadedPrintTests
Machokit wird unter der MIT -Lizenz veröffentlicht. Siehe Lizenz