解析男子气概文件的库,以获取各种信息。
除了文件读数外,还支持_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许可发布的。请参阅许可证