
machofile एक मॉड्यूल है जो Mach-O बाइनरी फ़ाइलों को पार्स करने के लिए है
machofile एक मॉड्यूल है जो Mach-O बाइनरी फ़ाइलों को पार्स करता है, जिसमें मैलवेयर विश्लेषण और रिवर्स इंजीनियरिंग पर विशेष ध्यान दिया गया है।
Ero Carrera के pefile से प्रेरित होकर, यह मॉड्यूल समान क्षमताएँ प्रदान करने का लक्ष्य रखता है, लेकिन Mach-O बाइनरी के लिए। फ़ाइल प्रारूप ज्ञान, मूल संरचनाओं और स्थिरांकों को प्राप्त करने के लिए उपयोग की गई संदर्भ सामग्री और दस्तावेज़ नीचे सूचीबद्ध संसाधनों से लिए गए हैं।
machofile स्व-निहित है। इस मॉड्यूल की कोई निर्भरता नहीं है; यह एंडियननेस से स्वतंत्र है; और यह macOS, Windows और Linux पर काम करता है।
जबकि बाज़ार में अन्य Mach-O पार्सिंग मॉड्यूल मौजूद हैं, इसे विकसित करने के पीछे की प्रेरणाएँ ये हैं:
अगर आप इसे आज़माते हैं या बग पाते हैं तो मुझे बताएं, लेकिन... नरमी बरतें ;) कोड को अनुकूलित किया जाएगा और अधिक सुविधाएँ जोड़ी जाएँगी।
वर्तमान विशेषताएँ:
नोट: अभी तक, इसका प्रारंभिक परीक्षण x86, x86_64, arm64 और arm64e Mach-O नमूनों पर किया गया है।
लागू की जाने वाली अगली विशेषताएँ (यादृच्छिक क्रम में):
आप इसे कमांड लाइन से उपयोग कर सकते हैं या अपने python कोड में एक मॉड्यूल के रूप में आयात कर सकते हैं, और केवल उन संरचनाओं को पार्स करने के लिए प्रत्येक फ़ंक्शन को अलग-अलग कॉल कर सकते हैं जिनमें आपकी रुचि है। आप इसे सीधे pip के माध्यम से इंस्टॉल कर सकते हैं और प्रोग्रामेटिक रूप से या कमांड लाइन से उपयोग कर सकते हैं, या इसे स्टैंडअलोन स्क्रिप्ट के रूप में उपयोग कर सकते हैं।
pip install machofile
इसे पार्स करने के लिए या तो एक फ़ाइल पथ या एक डेटा बफ़र प्रदान किया जाना अपेक्षित है।
import machofile
macho = machofile.UniversalMachO(file_path='/path/to/machobinary')
macho.parse()
यदि डेटा बफ़र पहले से उपलब्ध है, तो इसे सीधे इस प्रकार प्रदान किया जा सकता है:
import machofile
with open(file_path, 'rb') as f:
data = f.read()
macho = machofile.UniversalMachO(data=data)
macho.parse()
API के विस्तृत उपयोग के लिए, समर्पित API दस्तावेज़ीकरण पृष्ठ देखें।
यदि आपने इसे pip के माध्यम से इंस्टॉल किया है तो आप machofile को सीधे CLI टूल के रूप में भी उपयोग कर सकते हैं, या python3 machofile.py के रूप में स्टैंडअलोन टूल के रूप में। मॉड्यूल के रूप में उपलब्ध सभी सुविधाएँ कमांड लाइन टूल के रूप में भी उपलब्ध हैं।
% machofile -h
usage: machofile [-h] -f FILE [-j] [--raw] [-a] [-d] [-e] [-ep] [-g]
[-hdr] [-i] [-l] [-seg] [-sig] [-sim] [-u] [-v]
[--arch ARCH] [--dump-dir DUMP_DIR]
Parse Mach-O binary structures. (version 2026.02.04)
options:
-h, --help show this help message and exit
required arguments:
-f, --file FILE Path to the file to be parsed
output format options:
-j, --json Output data in JSON format
--raw Output raw values in JSON format (use with -j/--json)
data extraction options:
-a, --all Print all info about the file
-d, --dylib Print Dylib Command Table and Dylib list
-e, --exports Print exported symbols
-ep, --entry-point Print entry point information
-g, --general_info Print general info about the file
-hdr, --header Print Mach-O header info
-i, --imports Print imported symbols
-l, --load_cmd_t Print Load Command Table and Command list
-seg, --segments Print File Segments info
-sig, --signature Print code signature and entitlements information
-sim, --similarity Print similarity hashes
-u, --uuid Print UUID
-v, --version Print version information
filter options:
--arch ARCH Show info for specific architecture only (for Universal binaries)
dump options:
--dump-dir DUMP_DIR Dump individual Mach-O slices from a FAT/Universal binary
to the specified directory
उदाहरण आउटपुट:
% machofile -a -f b4f68a58658ceceb368520dafc35b270272ac27b8890d5b3ff0b968170471e2b
[General File Info]
Filename: b4f68a58658ceceb368520dafc35b270272ac27b8890d5b3ff0b968170471e2b
Filesize: 54240
MD5: 20ffe440e4f557b9e03855b5da2b3c9c
SHA1: 1bf61ecad8568a774f9fba726a254a9603d09f33
SHA256: b4f68a58658ceceb368520dafc35b270272ac27b8890d5b3ff0b968170471e2b
[Mach-O Header]
magic: MH_MAGIC (32-bit), 0xFEEDFACE
cputype: Intel i386
cpusubtype: X86_ALL
filetype: EXECUTE
ncmds: 13
sizeofcmds: 1180
flags: NOUNDEFS, DYLDLINK, TWOLEVEL
[Load Cmd table]
{'cmd': 'LC_SEGMENT', 'cmdsize': 56}
{'cmd': 'LC_SEGMENT', 'cmdsize': 192}
{'cmd': 'LC_SEGMENT', 'cmdsize': 328}
{'cmd': 'LC_SEGMENT', 'cmdsize': 192}
{'cmd': 'LC_SEGMENT', 'cmdsize': 56}
{'cmd': 'LC_SYMTAB', 'cmdsize': 24}
{'cmd': 'LC_DYSYMTAB', 'cmdsize': 80}
{'cmd': 'LC_LOAD_DYLINKER', 'cmdsize': 28}
{'cmd': 'LC_UUID', 'cmdsize': 24}
{'cmd': 'LC_UNIXTHREAD', 'cmdsize': 80}
{'cmd': 'LC_LOAD_DYLIB', 'cmdsize': 52}
{'cmd': 'LC_LOAD_DYLIB', 'cmdsize': 52}
{'cmd': 'LC_CODE_SIGNATURE', 'cmdsize': 16}
[Load Commands]
LC_CODE_SIGNATURE
LC_DYSYMTAB
LC_LOAD_DYLIB
LC_LOAD_DYLINKER
LC_SEGMENT
LC_SYMTAB
LC_UNIXTHREAD
LC_UUID
[File Segments]
SEGNAME VADDR VSIZE OFFSET SIZE MAX_VM_PROTECTION INITIAL_VM_PROTECTION NSECTS FLAGS ENTROPY
------------------------------------------------------------------------------------------------------------
__PAGEZERO 0 4096 0 0 0 0 0 0 0.0
__TEXT 4096 28672 0 28672 7 5 2 0 5.080680410706916
__DATA 32768 4096 28672 4096 7 3 4 0 0.1261649636134924
__IMPORT 36864 4096 32768 4096 7 7 2 0 0.21493796627555234
__LINKEDIT 40960 20480 36864 17376 7 1 0 0 6.637864516225949
[Dylib Commands]
DYLIB_NAME_OFFSET DYLIB_TIMESTAMP DYLIB_CURRENT_VERSION DYLIB_COMPAT_VERSION DYLIB_NAME
----------------------------------------------------------------------------------------------------------
24 2 65536 65536 b'/usr/lib/libgcc_s.1.dylib'
24 2 7274759 65536 b'/usr/lib/libSystem.B.dylib'
[Dylib Names]
b'/usr/lib/libgcc_s.1.dylib'
b'/usr/lib/libSystem.B.dylib'
[UUID]
d691c242-da49-1081-50d5-4f8991924b06