Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
machofile — machofile is a module to parse Mach-O binary files | Kitploit
Outils/GitHubGitHub/pstirparo/machofile
Static AnalysisReverse EngineeringForensicsMalware AnalysisBinary Analysis
GitHubpstirparo/machofile

machofile

machofile is a module to parse Mach-O binary files

Voir le dépôt
995il y a 6 moisVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager
Site web

machofile

Downloads

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 :

  • avant tout, pour moi c'était un excellent moyen d'approfondir et d'en apprendre davantage sur le format et les structures Mach-O
  • fournir un moyen simple d'analyser les fichiers Mach-O pour analyse
  • ne pas dépendre de modules externes (par ex. lief, macholib, macho, etc.), puisque tout est directement extrait du fichier et le tout est en Python pur.

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 :

  • Analyser l'en-tête Mach-O
  • Analyser les commandes de chargement
  • Analyser les segments de fichier
  • Analyser les commandes Dylib
  • Analyser la liste des Dylib
  • Extraire les fonctions importées
  • Extraire les symboles exportés
  • Hachages : hachage dylib, hachage d'import, hachage d'export, hachage d'entitlements, symhash
  • Calcul de l'entropie des segments
  • Extraire le point d'entrée
  • Extraire l'UUID
  • Extraire les informations de version
  • Analyser les informations de base de la signature de code
  • Prise en charge des binaires FAT (Universal)
  • Extraire les tranches Mach-O individuelles des binaires FAT (Universal)
  • Prise en charge de la sortie JSON (format lisible par l'humain et format brut)

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) :

  • Chaînes intégrées
  • Attributs de fichier
  • Indicateur pour les bibliothèques suspectes
  • Détection de packer
  • ...

Utilisation et exemples

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.

root@kitploit:~
pip install machofile

Version du module

Il attend qu'on lui fournisse soit un chemin de fichier, soit un tampon de données à analyser.

root@kitploit:~
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 :

root@kitploit:~
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.

Version en ligne de commande

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.

root@kitploit:~
% 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 :

root@kitploit:~
% 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

[Entry Point]
        type:             LC_UNIXTHREAD
        entry_address:    9200
        thread_data_size: 72

[Version Information]
        No version information found

[Code Signature]
        signed:           True
        signing_status:   Apple signed
        certificates_info:
            count:            3
            certificates:
              index:            0
              size:             4815
              subject:          Contains: Developer ID Certification Authority
              issuer:           Unable to parse
              is_apple_cert:    True
              type:             Developer ID Certification Authority

              index:            1
              size:             1215
              subject:          Contains: Apple Root CA
              issuer:           Unable to parse
              is_apple_cert:    True
              type:             Apple Root CA

              index:            2
              size:             1385
              subject:          Contains: Developer ID Application:
              issuer:           Unable to parse
              is_apple_cert:    False
              type:             Developer ID Application Certificate
        entitlements_info:
            count:            0
            entitlements:
        code_directory:
            version:          131328
            flags:            0
            hash_offset:      144
            identifier_offset:48
            special_slots:    3
            signing_flags:
                None
            code_slots:       11
            hash_size:        44640
            hash_type:        335609868
            hash_algorithm:   Unknown (335609868)
            identifier:       onmac.unspecified.installer

[Imported Libraries]
        /usr/lib/libgcc_s.1.dylib
        /usr/lib/libSystem.B.dylib

[Imported Functions]
        (Sources: CF=chained_fixups, BO=bind, WB=weak_bind, LB=lazy_bind, ST=symtab)
        /usr/lib/libSystem.B.dylib:
                __NSGetExecutablePath [ST]
                ___stderrp [ST]
                _dlerror [ST]
                _dlopen [ST]
                _dlsym [ST]
                _exit [ST]
                _fclose [ST]
                _fopen [ST]
                _fprintf [ST]
                _fputs$UNIX2003 [ST]
                _free [ST]
                _fwrite$UNIX2003 [ST]
                _getenv [ST]
                _getpid [ST]
                _getpwnam [ST]
                _lstat [ST]
                _mbstowcs [ST]
                _memcpy [ST]
                _memset [ST]
                _setenv$UNIX2003 [ST]
                _setlocale [ST]
                _snprintf [ST]
                _stat [ST]
                _strchr [ST]
                _strdup [ST]
                _strlen [ST]
                _unsetenv$UNIX2003 [ST]

[Exported Symbols]
        <unknown>:
                _NXArgc
                _NXArgv
                ___progname
                _environ
                _main
                start

[Similarity Hashes]
        dylib_hash:       0556bed5dc31bddaee73f3234b3c577b
        export_hash:      824e359e3d0ad7283d0982bd5da2e8fd
        import_hash:      0bae89995ad3900987c49c0bea1d17fe
        symhash:          15e6c1aeba01be1404901f7152213779

Extraction des tranches de binaires Universal (FAT)

Lorsque vous travaillez avec des binaires Universal (FAT), vous pouvez extraire chaque tranche d'architecture dans son propre fichier Mach-O autonome en utilisant --dump-dir :

root@kitploit:~
# Dump all slices
% machofile -f universal_binary --dump-dir ./output
Dumped x86_64 -> ./output/universal_binary.x86_64
Dumped arm64 -> ./output/universal_binary.arm64

# Dump only a specific architecture (combine with --arch)
% machofile -f universal_binary --dump-dir ./output --arch arm64
Dumped arm64 -> ./output/universal_binary.arm64

Chaque fichier extrait est un binaire Mach-O autonome valide. Le répertoire de sortie est créé automatiquement s'il n'existe pas. Les fichiers de sortie sont nommés <original_filename>.<arch_name>.

Sortie JSON

machofile prend en charge la sortie JSON pour une consommation programmatique des données analysées. La sortie JSON se décline en deux formats :

JSON lisible par l'humain (par défaut)

La sortie JSON par défaut fournit des valeurs lisibles par l'humain avec un formatage approprié :

root@kitploit:~
% python3 machofile.py -j -hdr -f dec750b9d596b14aeab1ed6f6d6d370022443ceceb127e7d2468b903c2d9477a 
{
  "header": {
    "x86_64": {
      "magic": "MH_MAGIC_64 (64-bit), 0xFEEDFACF",
      "cputype": "x86_64",
      "cpusubtype": "x86_ALL",
      "filetype": "EXECUTE",
      "ncmds": 41,
      "sizeofcmds": 5024,
      "flags": "NOUNDEFS, DYLDLINK, TWOLEVEL, BINDS_TO_WEAK, PIE"
    },
    "arm64": {
      "magic": "MH_MAGIC_64 (64-bit), 0xFEEDFACF",
      "cputype": "ARM 64-bit",
      "cpusubtype": "ARM_ALL",
      "filetype": "EXECUTE",
      "ncmds": 41,
      "sizeofcmds": 5104,
      "flags": "NOUNDEFS, DYLDLINK, TWOLEVEL, BINDS_TO_WEAK, PIE"
    }
  },
  "architectures": [
    "x86_64",
    "arm64"
  ]
}

Sortie JSON brute

Pour les applications qui doivent traiter des valeurs numériques brutes, utilisez l'option --raw :

root@kitploit:~
% python3 machofile.py -j --raw -hdr -f dec750b9d596b14aeab1ed6f6d6d370022443ceceb127e7d2468b903c2d9477a
{
  "header": {
    "x86_64": {
      "magic": 4277009103,
      "cputype": 16777223,
      "cpusubtype": 3,
      "filetype": 2,
      "ncmds": 41,
      "sizeofcmds": 5024,
      "flags": 2162821
    },
    "arm64": {
      "magic": 4277009103,
      "cputype": 16777228,
      "cpusubtype": 0,
      "filetype": 2,
      "ncmds": 41,
      "sizeofcmds": 5104,
      "flags": 2162821
    }
  },
  "architectures": [
    "x86_64",
    "arm64"
  ]
}

Options de sortie JSON

  • -j, --json : Affiche les données au format JSON (lisible par l'humain par défaut)
  • --raw : Affiche les valeurs numériques brutes au lieu de chaînes formatées (doit être utilisé avec -j)

La sortie JSON prend en charge toutes les mêmes options d'analyse que la sortie standard (-a, -hd, -l, -sg, etc.) et fonctionne avec les binaires mono-architecture et Universal (FAT).

Sponsorisé par

RationalEdge

Le développement de machofile est sponsorisé par RationalEdge.

Crédits

Voici les personnes que je souhaite remercier pour avoir été l'inspiration qui m'a conduit à écrire ce module :

  • Ero Carrera (@erocarrera) pour avoir écrit et maintenu le module pefile
  • Patrick Wardle (@patrickwardle) pour son excellent travail de partage de ses analyses et recherches sur les logiciels malveillants macOS, et pour avoir donné vie à OBTS :)
  • Greg Lesnewich (@greg-l.bsky.social) et Jacob Latonis (@jacoblatonis.me) pour leur travail sur la similarité Mach-O et les sessions de brainstorming continuelles, pointues et éclairantes sur le format binaire Mach-O. Allez voir leur présentation OBTS v7 sur YT.

Liens de référence/documentation :

  • https://opensource.apple.com/source/xnu/xnu-2050.18.24/EXTERNAL_HEADERS/mach-o/loader.h
  • https://github.com/apple-oss-distributions/lldb/blob/10de1840defe0dff10b42b9c56971dbc17c1f18c/llvm/include/llvm/Support/MachO.h
  • https://github.com/apple-oss-distributions/dyld/tree/main
  • https://iphonedev.wiki/Mach-O_File_Format
  • https://lowlevelbits.org/parsing-mach-o-files/
  • https://github.com/aidansteele/osx-abi-macho-file-format-reference
  • https://lief-project.github.io/doc/latest/tutorials/11_macho_modification.html
  • https://github.com/VirusTotal/yara/blob/master/libyara/include/yara/macho.h
  • https://github.com/corkami/pics/blob/master/binary/README.md
  • https://github.com/qyang-nj/llios/tree/main
  • https://github.com/threatstream/symhash
Télécharger l’outil