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 est un module permettant d'analyser les fichiers binaires Mach-O. | Kitploit
Outils/GitHubGitHub/pstirparo/machofile
Analyse StatiqueRétro-ingénierieAnalyse ForensiqueAnalyse de MalwareAnalyse de Binaires
GitHubpstirparo/machofile

machofile

machofile est un module permettant d'analyser les fichiers binaires Mach-O.

Voir le dépôt
9954il y a 7 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 →
Site web
Partager

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