
machofile est un module permettant d'analyser les fichiers binaires Mach-O.
machofile est un module permettant d'analyser les fichiers binaires Mach-O, avec un accent sur l'analyse de logiciels malveillants et la rétro-ingénierie.
Inspiré par le module pefile d'Ero Carrera, ce module vise à offrir des capacités similaires mais pour les binaires Mach-O. Le matériel de référence et la documentation utilisés pour acquérir la connaissance du format de fichier, les structures de base et les constantes proviennent des ressources listées ci-dessous.
machofile est autonome. Le module n'a aucune dépendance ; il est indépendant de l'endianness ; et il fonctionne sur macOS, Windows et Linux.
Bien qu'il existe d'autres modules d'analyse Mach-O, les motivations derrière le développement de celui-ci sont :
Faites-moi savoir si vous l'essayez ou si vous trouvez des bogues mais aussi... soyez indulgent ;) le code sera optimisé et davantage de fonctionnalités seront ajoutées.
Fonctionnalités actuelles :
Remarque : à l'heure actuelle, cela a été initialement testé sur des échantillons Mach-O x86, x86_64, arm64 et arm64e.
Prochaines fonctionnalités à implémenter (dans le désordre) :
Vous pouvez l'utiliser en ligne de commande ou l'importer comme module dans votre code Python, et appeler chaque fonction individuellement pour analyser uniquement les structures qui vous intéressent. Vous pouvez l'installer directement via pip et l'utiliser programmatiquement ou en ligne de commande, ou l'utiliser comme script autonome.
pip install machofile
Il attend qu'on lui fournisse soit un chemin de fichier, soit un tampon de données à analyser.
import machofile
macho = machofile.UniversalMachO(file_path='/path/to/machobinary')
macho.parse()
Si le tampon de données est déjà disponible, il peut être fourni directement avec :
import machofile
with open(file_path, 'rb') as f:
data = f.read()
macho = machofile.UniversalMachO(data=data)
macho.parse()
Pour une utilisation détaillée de l'API, consultez la page de documentation de l'API.
Vous pouvez également utiliser machofile directement comme outil CLI si vous l'avez installé via pip, ou comme outil autonome via python3 machofile.py. Toutes les fonctionnalités sont disponibles en tant que module, ainsi qu'en tant qu'outil en ligne de commande.
% 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
Exemple de sortie :
% 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