解析男子氣概文件的庫,以獲取各種信息。
除了文件讀數外,還支持_dyld_get_image_header對內存中的圖像進行解析。
要從內存中讀取,請使用MachOImage結構。
可以使用_dyld_get_image_header獲得的MACH-O標頭指針來初始化它。
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協議。
Machoreprentable
還支持dyld_shared_cache的加載。
可用的方法在以下文件中定義為DyldCacheRepresentable協議。
Dyldcachere可以證明
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類型。與從單個Macho文件中閱讀一樣,可以進行各種分析。
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平台上,染色器緩存部署在內存中。
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許可發布的。請參閱許可證