Bibliothèque pour analyser les fichiers machos pour obtenir diverses informations.
En plus de la lecture des fichiers, l'analyse des images en mémoire par _dyld_get_image_header est également prise en charge.
Pour lire de la mémoire, utilisez la structure MachOImage .
Il peut être initialisé en utilisant le pointeur d'en-tête Mach-O obtenu par _dyld_get_image_header .
guard let mh = _dyld_get_image_header ( 0 ) else { return }
let machO = MachOImage ( ptr : mh )Alternativement, il peut être initialisé à l'aide du nom.
// /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
guard let machO = MachOImage ( name : " Foundation " ) else { return } Pour lire à partir du fichier, utilisez la structure MachOFile .
La lecture d'un fichier peut être la suivante. Il y a un cas de fichier gras et un seul fichier macho, donc un processus de ramification conditionnel est requis.
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 )
} MachOImage et MachOFile peuvent utiliser essentiellement les mêmes propriétés et méthodes. Les méthodes disponibles sont définies dans le fichier suivant comme le protocole MachORepresentable .
Machore-présentable
Le chargement de dyld_shared_cache est également pris en charge.
Les méthodes disponibles sont définies dans le fichier suivant comme le protocole DyldCacheRepresentable .
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 ) Il est également possible d'extraire des informations macho contenues dans dyld_shared_cache . Le macho extrait est de type MachOFile . Comme pour la lecture à partir d'un seul fichier macho, diverses analyses sont possibles.
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
// ...Sur la plate-forme Apple, le cache Dyld est déployé en mémoire.
var size = 0
guard let ptr = _dyld_get_shared_cache_range ( & size ) else {
return
}
let cache = try ! DyldCacheLoaded ( ptr : ptr ) Il est également possible d'extraire des informations macho contenues dans dyld_shared_cache . Le macho extrait est de type MachOImage . Comme pour la lecture d'une seule image macho, diverses analyses sont possibles.
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
// ...Il existe une variété d'utilisations, mais la plupart montrent un exemple de base qui imprime la sortie du répertoire de test.
Le fichier suivant contient un exemple de code. Machoprinttests
Le fichier suivant contient un exemple de code. Machofileprinttests
Le fichier suivant contient un exemple de code. Dyldcacheprinttests
Le fichier suivant contient un exemple de code. Dyldcacheloadedprinttests
Machokit est libéré sous la licence du MIT. Voir la licence