مكتبة لتحليل ملفات 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 .
يمكن أن تكون القراءة من ملف كما يلي. هناك حالة ملف الدهون وملف مفتول العضلات ، لذلك مطلوب عملية تفرع مشروطة.
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 . كما هو الحال مع القراءة من ملف مفتول العضلات ، يمكن إجراء تحليلات مختلفة.
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 تحت رخصة معهد ماساتشوستس للتكنولوجيا. انظر الترخيص