다양한 정보를 얻기 위해 마초 파일을 구문 분석 용 라이브러리.
파일 읽기 외에도 _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 프로토콜로 정의됩니다.
MachorePresentable
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
다음 파일에는 샘플 코드가 포함되어 있습니다. Machofiprinttests
다음 파일에는 샘플 코드가 포함되어 있습니다. dyldcacheprinttests
다음 파일에는 샘플 코드가 포함되어 있습니다. dyldcacheloadedprinttests
Machokit은 MIT 라이센스에 따라 릴리스됩니다. 라이센스를 참조하십시오