Biblioteca para analizar archivos machos para obtener varias información.
Además de la lectura de archivos, también es compatible con el análisis de imágenes en la memoria por _dyld_get_image_header .
Para leer de memoria, use la estructura MachOImage .
Se puede inicializar utilizando el puntero del encabezado Mach-O obtenido por _dyld_get_image_header .
guard let mh = _dyld_get_image_header ( 0 ) else { return }
let machO = MachOImage ( ptr : mh )Alternativamente, se puede inicializar usando el nombre.
// /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
guard let machO = MachOImage ( name : " Foundation " ) else { return } Para leer desde el archivo, use la estructura MachOFile .
Leer de un archivo puede ser el siguiente. Hay un caso de un archivo graso y un solo archivo machista, por lo que se requiere un proceso de ramificación condicional.
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 )
} Tanto MachOImage como MachOFile pueden usar esencialmente las mismas propiedades y métodos. Los métodos disponibles se definen en el siguiente archivo como el protocolo MachORepresentable .
Machorable
La carga de dyld_shared_cache también es compatible.
Los métodos disponibles se definen en el siguiente archivo como el protocolo 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 ) También es posible extraer información machista contenida en dyld_shared_cache . El macho extraído es de tipo MachOFile . Al igual que con la lectura de un solo archivo machista, son posibles varios análisis.
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
// ...En la plataforma Apple, el caché Dyld se implementa en la memoria.
var size = 0
guard let ptr = _dyld_get_shared_cache_range ( & size ) else {
return
}
let cache = try ! DyldCacheLoaded ( ptr : ptr ) También es posible extraer información machista contenida en dyld_shared_cache . El macho extraído es de tipo MachOImage . Al igual que con la lectura de una sola imagen machista, son posibles varios análisis.
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
// ...Hay una variedad de usos, pero la mayoría muestra un ejemplo básico que imprime la salida en el directorio de prueba.
El siguiente archivo contiene código de muestra. Machoprinttests
El siguiente archivo contiene código de muestra. MachofilePrintTests
El siguiente archivo contiene código de muestra. Dyldcacheprinttests
El siguiente archivo contiene código de muestra. Dyldcacholleadedprinttests
Machokit se lanza bajo la licencia MIT. Ver licencia