ไลบรารีสำหรับการแยกวิเคราะห์ไฟล์ Macho เพื่อรับข้อมูลต่าง ๆ
นอกเหนือจากการอ่านไฟล์แล้วยังรองรับการแยกวิเคราะห์ภาพในหน่วยความจำโดย _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
การอ่านจากไฟล์อาจเป็นดังนี้ มีกรณีของไฟล์ FAT และไฟล์ Macho เดียวดังนั้นจึงจำเป็นต้องใช้กระบวนการแตกแขนงแบบมีเงื่อนไข
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 Macho สกัดเป็นประเภท 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 แคช Dyld จะถูกปรับใช้ในหน่วยความจำ
var size = 0
guard let ptr = _dyld_get_shared_cache_range ( & size ) else {
return
}
let cache = try ! DyldCacheLoaded ( ptr : ptr ) นอกจากนี้ยังเป็นไปได้ที่จะแยกข้อมูลผู้ชายที่มีอยู่ใน dyld_shared_cache Macho สกัดเป็นประเภท 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 ดูใบอนุญาต