Biblioteca para analisar arquivos machos para obter várias informações.
Além da leitura de arquivos, a análise de imagens na memória por _dyld_get_image_header também é suportada.
Para ler a memória, use a estrutura MachOImage .
Ele pode ser inicializado usando o ponteiro do cabeçalho Mach-O obtido por _dyld_get_image_header .
guard let mh = _dyld_get_image_header ( 0 ) else { return }
let machO = MachOImage ( ptr : mh )Como alternativa, ele pode ser inicializado usando o nome.
// /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
guard let machO = MachOImage ( name : " Foundation " ) else { return } Para ler o arquivo, use a estrutura MachOFile .
A leitura de um arquivo pode ser a seguinte. Há um caso de um arquivo gordo e um único arquivo machista; portanto, é necessário um processo de ramificação 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 )
} MachOImage e MachOFile podem usar essencialmente as mesmas propriedades e métodos. Os métodos disponíveis são definidos no arquivo a seguir como o protocolo MachORepresentable .
MACHOREPRESENTABLE
O carregamento de dyld_shared_cache também é suportado.
Os métodos disponíveis são definidos no arquivo a seguir como o 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 ) Também é possível extrair informações machistas contidas em dyld_shared_cache . O machista extraído é do tipo MachOFile . Como na leitura de um único arquivo machista, várias análises são possíveis.
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
// ...Na plataforma Apple, o cache DYLD é implantado na memória.
var size = 0
guard let ptr = _dyld_get_shared_cache_range ( & size ) else {
return
}
let cache = try ! DyldCacheLoaded ( ptr : ptr ) Também é possível extrair informações machistas contidas em dyld_shared_cache . O machista extraído é do tipo MachOImage . Como na leitura de uma única imagem machista, várias análises são possíveis.
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
// ...Há uma variedade de usos, mas a maioria mostra um exemplo básico que imprime a saída no diretório de teste.
O seguinte arquivo contém código de amostra. Machoprinttestes
O seguinte arquivo contém código de amostra. MachofilePrintTests
O seguinte arquivo contém código de amostra. DyldcachePrintTests
O seguinte arquivo contém código de amostra. DyldcacheloadedPrintTests
Machokit é liberado sob a licença do MIT. Consulte a licença