Библиотека для анализа файлов мачо для получения различной информации.
В дополнение к чтению файлов также поддерживается анализ изображений в памяти _dyld_get_image_header .
Для чтения из памяти используйте структуру MachOImage .
Он может быть инициализирован с помощью указателя заголовка Mach-O, полученного с помощью _dyld_get_image_header .
guard let mh = _dyld_get_image_header ( 0 ) else { return }
let machO = MachOImage ( ptr : mh )В качестве альтернативы его можно инициализировать с помощью имени.
// /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
guard let machO = MachOImage ( name : " Foundation " ) else { return } Для чтения из файла используйте MachOFile структуру.
Чтение из файла может быть следующим. Существует случай жирового файла и одного мачо -файла, поэтому требуется условный процесс ветвления.
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 и MachOFile могут использовать по существу одинаковые свойства и методы. Доступные методы определяются в следующем файле как протокол MachORepresentable .
Machore -Presentable
Загрузка dyld_shared_cache также поддерживается.
Доступные методы определяются в следующем файле в качестве протокола 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 ) Также можно извлечь информацию мачо, содержащуюся в dyld_shared_cache . Мачо извлечено из типа MachOFile . Как и в случае с чтением из одного мачо файла, возможны различные анализы.
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
// ...На платформе Apple кэш Dyld развернут в памяти.
var size = 0
guard let ptr = _dyld_get_shared_cache_range ( & size ) else {
return
}
let cache = try ! DyldCacheLoaded ( ptr : ptr ) Также можно извлечь информацию мачо, содержащуюся в dyld_shared_cache . Извлеченный мачо имеет тип MachOImage . Как и в случае с чтением с одного изображения мачо, возможны различные анализы.
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
// ...Существует множество применений, но большинство показывает базовый пример, который печатает вывод в тестовый каталог.
Следующий файл содержит пример кода. Machoprinttests
Следующий файл содержит пример кода. MachoFilePrintTests
Следующий файл содержит пример кода. Dyldcacheprinttests
Следующий файл содержит пример кода. Dyldcacheloadedprinttests
Machokit выпускается по лицензии MIT. Смотрите лицензию