Perpustakaan untuk file Macho parsing untuk mendapatkan berbagai informasi.
Selain membaca file, penguraian gambar dalam memori oleh _dyld_get_image_header juga didukung.
Untuk membaca dari memori, gunakan struktur MachOImage .
Ini dapat diinisialisasi dengan menggunakan pointer header Mach-O yang diperoleh oleh _dyld_get_image_header .
guard let mh = _dyld_get_image_header ( 0 ) else { return }
let machO = MachOImage ( ptr : mh )Atau, dapat diinisialisasi menggunakan nama.
// /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
guard let machO = MachOImage ( name : " Foundation " ) else { return } Untuk membaca dari file, gunakan struktur MachOFile .
Membaca dari file bisa sebagai berikut. Ada kasus file lemak dan satu file macho, sehingga proses percabangan bersyarat diperlukan.
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 )
} Baik MachOImage dan MachOFile pada dasarnya dapat menggunakan sifat dan metode yang sama. Metode yang tersedia didefinisikan dalam file berikut sebagai protokol MachORepresentable .
Machorepresentable
Memuat dyld_shared_cache juga didukung.
Metode yang tersedia didefinisikan dalam file berikut sebagai protokol DyldCacheRepresentable .
DyldCacherEbsable
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 ) Dimungkinkan juga untuk mengekstrak informasi macho yang terkandung dalam dyld_shared_cache . Macho yang diekstraksi adalah tipe MachOFile . Seperti halnya membaca dari satu file macho, berbagai analisis dimungkinkan.
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
// ...Pada platform Apple, cache Dyld digunakan dalam memori.
var size = 0
guard let ptr = _dyld_get_shared_cache_range ( & size ) else {
return
}
let cache = try ! DyldCacheLoaded ( ptr : ptr ) Dimungkinkan juga untuk mengekstrak informasi macho yang terkandung dalam dyld_shared_cache . Macho yang diekstraksi adalah MachOImage tipe. Seperti membaca dari satu gambar macho tunggal, berbagai analisis dimungkinkan.
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
// ...Ada berbagai kegunaan, tetapi sebagian besar menunjukkan contoh dasar yang mencetak output ke direktori tes.
File berikut berisi kode sampel. Machoprinttests
File berikut berisi kode sampel. Machofileprinttests
File berikut berisi kode sampel. DyldCachePrintTests
File berikut berisi kode sampel. DyldcacheloadedPrintTests
Machokit dirilis di bawah lisensi MIT. Lihat lisensi