ImHex, un éditeur hexadécimal pour le reverse engineering
(github.com/WerWolv)- ImHex est un éditeur hexadécimal destiné aux ingénieurs en reverse engineering, aux programmeurs et à celles et ceux qui travaillent tard le soir ; il réunit dans un seul outil des fonctions d’analyse, de modification et de visualisation du contenu de fichiers
- Ses fonctions clés incluent un langage de patterns proche du C permettant de définir des structures et des types de données afin de parser et mettre en évidence le contenu des fichiers, avec chargement automatique basé sur les types MIME et les valeurs magic
- Il peut ouvrir plusieurs sources de données : fichiers locaux, disques bruts, GDB Server, paquets UDP, mémoire de processus, fichiers distants SSH/SFTP, etc. Il inclut aussi un désassembleur basé sur Capstone et un scan de règles YARA
- Les prérequis d’utilisation incluent par défaut un GPU compatible OpenGL 3.0 ou supérieur ; la version
-NoGPUavec rendu logiciel peut être utilisée sans GPU, mais peut être beaucoup plus lente que la version accélérée par GPU - Les plugins se développent via
libimhex, l’API ImHex et le Content Registry ; la plupart sont sous GPLv2-only, mais/lib/libimhexet/plugins/uisont fournis sous LGPLv2.1, ce qui autorise le développement de plugins propriétaires
Rôle de base d’ImHex
- ImHex est un éditeur hexadécimal pour les ingénieurs en reverse engineering, les programmeurs et les personnes qui veulent un outil moins fatigant pour les yeux même à 3 h du matin
- La dernière version, les préversions nightly, la version web et la documentation sont proposées séparément
Vue hexadécimale et édition de données
- La vue hexadécimale prend en charge le byte patching, la gestion des patches et un undo/redo illimité
- La copie d’octets est possible dans plusieurs formats
- bytes
- hex string
- tableaux C, C++, C#, Rust, Python, Java, JavaScript
- ASCII-Art hex view
- HTML self-contained div
- Les fonctions de recherche et de navigation incluent la recherche simple de chaînes/hexadécimal et le goto depuis le début, la fin ou la position actuelle du curseur
- La mise en évidence prend en charge la configuration des règles de premier plan, ainsi que la mise en évidence d’arrière-plan basée sur les patterns, les résultats de recherche et les signets
- L’affichage des données prend en charge plusieurs types
- entiers hexadécimaux 8/16/32/64 bits
- entiers décimaux signés/non signés 8/16/32/64 bits
- float 16/32/64 bits
- couleur RGBA8, HexII, binaire
- Les encodages ASCII et personnalisés sont gérés, avec prise en charge intégrée de l’UTF-8, de l’UTF-16, de ShiftJIS, de la plupart des encodages Windows, etc.
- Une paged data view est proposée
Langage de patterns et interprétation des structures de données
- Pattern Language est un langage de programmation entièrement personnalisable développé pour ImHex
- Sa syntaxe proche du C permet de définir des structures et des types de données, puis de les utiliser pour parser et mettre en évidence le contenu des fichiers
- Le langage de patterns prend en charge le chargement automatique basé sur les types MIME et les valeurs magic
- Les éléments pris en charge incluent arrays, pointers, structs, unions, enums, bitfields, namespaces, little/big endian, conditionals, etc.
- Il fournit des messages d’erreur, la coloration syntaxique et le marquage des erreurs
- Les données visualisables incluent images, audio, modèles 3D, coordonnées, horodatages, etc.
- Ressources associées :
- Pattern Language Source Code
- Pattern Language Documentation
- ImHex-Patterns : dépôt de format patterns, libraries, magic et fichiers de constantes
Inspection, prétraitement et recherche de données
- Data Inspector interprète les données dans différents types, avec notamment endianness, décimal, hexadécimal, octal et inversion de bits
- unsigned/signed integer : 8/16/24/32/48/64 bits
- float : 16/32/64 bits
- signed/unsigned LEB128
- ASCII, Wide, UTF-8 characters and strings
time32_t,time64_t, date/heure DOS- GUID, couleurs RGBA8, RGB65
- L’inspector permet de copier et modifier des bytes, et d’ajouter de nouveaux types de données via le langage de patterns
- Le préprocesseur de données basé sur des nœuds peut modifier, déchiffrer ou décoder les données avant leur affichage dans l’éditeur hexadécimal
- modification des données possible sans toucher à la source sous-jacente
- prise en charge de l’ajout de custom nodes
- La recherche de données peut s’effectuer sur tout le fichier ou sur une sélection
- l’extraction de chaînes propose des options de longueur minimale, jeu de caractères et encodage
- sequence search recherche une séquence d’octets ou de caractères, avec option d’insensibilité à la casse
- prise en charge de regex search, binary pattern wildcard search et numeric value/range search
- numeric search inclut des options de taille, d’endianness et d’ignorance des valeurs non alignées
Sources de données et fonctions d’analyse
- ImHex peut charger des données depuis plusieurs sources de données
- fichiers locaux : chargement rapide et efficace de gros fichiers
- raw disks : chargement de disques bruts et de partitions
- GDB Server : accès à la RAM d’un processus en cours d’exécution ou d’un embedded device
- Intel Hex, Motorola SREC
- données encodées en Base64
- paquets UDP
- mémoire de processus : inspection de tout l’espace d’adressage d’un processus en cours d’exécution
- fichiers distants SSH/SFTP
- L’analyse et la visualisation de données incluent un file parser basé sur file magic et une base de données de types MIME
- Les graphes et statistiques proposent byte type distribution, entropy graph, highest/average entropy, digram et layered distribution graph
- Une fonction de détection de fichiers chiffrés/compressés est disponible
- Le diffing permet de comparer différentes sources de données, avec mise en évidence des différences et table view
Désassemblage, YARA et hachage
- Le désassembleur intégré prend en charge toutes les architectures supportées par Capstone
- ARM32, ARM64, MIPS, x86 16/32/64-bit, PowerPC, SPARC, IBM SystemZ, xCORE, M68K, TMS320C64X, M680X, Ethereum, RISC-V, WebAssembly, MOS65XX, Berkeley Packet Filter
- Il prend aussi en charge l’écriture d’un custom disassembler pour sa propre architecture
- La prise en charge des YARA Rule permet de scanner des fichiers avec les official yara rules, de mettre en évidence les matches dans l’éditeur hexadécimal, d’aller à un match et d’appliquer plusieurs rules à la fois
- Le hachage peut être effectué sur une zone de données précise ou sur des chaînes arbitraires
- Les hashes pris en charge incluent CRC8/16/32, MD5, SHA-1/SHA-224/SHA-256/SHA-384/SHA-512, Adler32, Murmur, SipHash, XXHash, Tiger, Blake2B, Blake2S, etc.
UI, thèmes, import/export
- Les thèmes proposent un mode sombre par défaut, avec un mode clair également disponible
- Les couleurs et styles de tous les éléments d’interface peuvent être personnalisés via un theme file partageable, avec prise en charge des custom fonts
- L’interface moderne prend en charge multiple workspaces, custom layouts et detachable windows
- L’import/export prend en charge les fichiers Base64, les patches IPS/IPS32, les rapports Markdown et les tableaux binaires pour plusieurs langages de programmation
- Les bookmarks prennent en charge custom name/color, la mise en évidence de régions dans l’éditeur hexadécimal, le saut vers un emplacement, l’ouverture du contenu d’un bookmark dans un nouvel onglet et l’ajout de commentaires
- Le content updater intégré permet de télécharger dans ImHex les fichiers de la base de données
- pattern files
- pattern language libraries
- magic files
- custom data processor nodes
- custom encodings
- custom themes
- Yara rules
Outils et onboarding
- Les Helpful tools incluent des demanglers LLVM pour Itanium, MSVC, Rust et D-Lang
- Les autres outils incluent ASCII table, regex replacer, mathematical expression evaluator, graphing calculator, hexadecimal color picker, base converter, byte swapper, UNIX permissions calculator, Wikipedia term definition finder, etc.
- Les file utilities proposent file splitter, file combiner et file shredder
- TCP Client/Server, HTTP Requests, IEEE754 Float visualizer, Euclidean algorithm calculator, etc. sont également inclus
- Les fonctions d’aide au démarrage comprennent la prise en charge multilingue, un simplified mode pour débutants, une documentation extensive, des example files dans la base de données, des achievements et des interactive tutorials
Prérequis système et conditions de build
- Un GPU compatible OpenGL 3.0 ou supérieur est généralement nécessaire
- Les versions avec le suffixe
-NoGPUutilisent un rendu logiciel et peuvent donc fonctionner sans GPU, mais peuvent être beaucoup plus lentes que les versions GPU accelerated - Il est recommandé d’utiliser si possible un GPU dédié plutôt qu’un GPU intégré
- Certains pilotes Intel HD GPU sous Windows sont connus pour provoquer des graphical artifacts
- Les versions avec le suffixe
- OS pris en charge :
- Windows 7 ou supérieur, Windows 10/11 recommandé
- macOS 15 Sequoia ou supérieur
- Des versions plus anciennes peuvent fonctionner si elles sont compilées manuellement, mais comme GitHub ne dispose pas de CI runner inférieur à macOS 15, les release binaries ne fonctionnent pas
- Le build macOS n’étant pas signé, une autorisation manuelle dans les réglages Security & Privacy est nécessaire
- Linux dispose de releases officielles pour Ubuntu/Debian, Fedora, RHEL/AlmaLinux et Arch Linux ; les autres distros sont prises en charge via AppImage, Flatpak et Snap
- Testé sur FreeBSD 14.3
- Les CPU x86, AMD64 et ARM64 sont officiellement pris en charge ; cela devrait fonctionner avec tout CPU Little Endian
- Environ 50 MiB de RAM sont nécessaires, et les analyses plus complexes nécessitent davantage de mémoire
- Environ 100 MiB d’espace de stockage sont nécessaires
- La compilation nécessite GCC ou Clang avec prise en charge de C++23 ou supérieur
- Les releases Windows et Linux sont buildées avec le dernier GCC disponible
- Les releases macOS sont buildées avec le dernier LLVM Clang disponible
- MSVC et AppleClang ne sont pas pris en charge
- Documentation d’installation et de compilation :
Développement de plugins et licence
- Le développement de plugins peut commencer avec un template project ; il permet d’accéder à
libimhex, à l’API ImHex et au Content Registry pour interagir avec ImHex ou ajouter du nouveau contenu - Le build d’un plugin nécessite le SDK
- Procédure de build local du SDK :
cmake -G Ninja -DIMHEX_BUNDLE_PLUGIN_SDK=ON -B buildcd buildDESTDIR=install ninja install- Le chemin du SDK devient
install/usr/local/share/imhex/sdk, etIMHEX_SDK_PATHdoit être défini sur ce chemin absolu
- Dans GitHub Actions CI, l’action imhex-download-sdk permet de télécharger automatiquement le SDK
- ImHex Plugin Template est fourni comme point de départ pour les plugins
- La licence est majoritairement GPLv2-only
/lib/libimhexest sous LGPLv2.1/plugins/uiest sous LGPLv2.1- Cette exception vise à autoriser le développement de plugins propriétaires
- La code signing policy indique qu’aucune information n’est transmise à d’autres systèmes réseau sauf si l’utilisateur le demande explicitement ou si l’installateur/l’opérateur le demande
1 commentaires
Avis sur Hacker News
ImHex est le meilleur éditeur hexadécimal que j’aie utilisé jusqu’ici
Il y a plusieurs raisons à cela : certains autres éditeurs en ont quelques-unes, mais il est rare de les trouver toutes réunies. Il met automatiquement en évidence les sections des formats de fichiers connus grâce aux modèles de fichiers, interprète simultanément les octets sélectionnés dans la plupart des types de données courants, et il est bien plus rapide que les autres éditeurs avec les gros fichiers
Son inconvénient, c’est que l’UI imgui est parfois boguée, mais il a fini par remplacer pour moi d’autres visualiseurs comme HexFiend ou hexa
Je me demande si cet éditeur peut afficher les octets ASCII sous forme de glyphes CP437
J’ai grandi en lisant les fichiers binaires ainsi sous DOS, donc je lis ces glyphes bien plus vite que les valeurs hexadécimales correspondantes. À l’inverse, afficher les caractères non imprimables sous forme de points n’apporte pas grand-chose
Je ne vois pas CP437 dans la liste, mais le format des fichiers d’encodage est simple, donc il devrait être facile de créer un mapping
https://github.com/WerWolv/ImHex-Patterns/tree/master/encodi...
Il y a aussi des caractères ambigus, comme celui qui peut être un eszett allemand ou un bêta
J’ai essayé ImHex, mais il était trop complexe pour la plupart des tâches que je voulais faire
Sur macOS, je préfère toujours Hex Fiend. Il est simple, rapide, et fait ce que je veux. Sur Windows, je n’ai pas encore trouvé l’éditeur hexadécimal « simple » parfait
Sur macOS, j’utilise Hex Fiend, mais je ne comprends pas pourquoi il refait le flux des lignes quand on élargit la fenêtre. Même si j’agrandis la fenêtre pour réduire les distractions visuelles, je veux garder des lignes de 16 ou 32 octets, pas une largeur bizarre qui casse l’alignement
J’ai aussi essayé ImHex rapidement, et je respecte vraiment le projet, mais pour mon usage c’était un peu comme utiliser un canon pour tuer une mouche
Pour l’instant, je pense continuer à utiliser 010 Editor[1]. C’est le meilleur éditeur hexadécimal que j’aie jamais utilisé
Je n’aime pas du tout Dear ImGui, le framework GUI utilisé par ce nouveau projet. Il me semble plutôt destiné aux systèmes embarqués avec petits écrans et sans gestionnaire de fenêtres ; dans un environnement de bureau complet, ses petits éléments et son absence d’intégration à l’UI le rendent assez maladroit
[1] https://www.sweetscape.com/010editor/
Il est écrit « ImHex requires a GPU with OpenGL 3.0 support in general », mais pourquoi un éditeur hexadécimal aurait-il besoin d’OpenGL ? Est-ce pour cela qu’il faut aussi un GPU ?
Je me demande s’il y a une bonne raison d’exiger OpenGL, ou si c’est juste pour faire moderne
Les anciennes méthodes consistant à dessiner les mises en forme complexes pixel par pixel sont particulièrement lentes de manière visible. Voir par exemple cet article
[1] https://www.sublimetext.com/blog/articles/hardware-accelerat...
Cela dit, exiger OpenGL ne signifie pas forcément exiger un GPU. Il existe aussi des implémentations logicielles d’OpenGL, même si leurs performances sont généralement médiocres. Et aujourd’hui, beaucoup de plateformes supposent la présence d’un GPU sous une forme ou une autre. Les cas où l’on a besoin d’un outil GUI sans GPU sont rares, et il est aussi peu probable d’exécuter localement un éditeur hexadécimal et des outils dans ce type d’environnement de niche
C’est un excellent projet. Je me suis pas mal amusé à manipuler la ROM d’une montre connectée Philips
Il y a un DSL intégré qui ressemble à Rust ; il n’y a pas de gestion de la mémoire, donc c’est très léger, mais il permet de visualiser et d’extraire des données structurées depuis des flux binaires. C’est vraiment amusant et élégant
Il existe aussi un éditeur visuel pour créer des calculs simples sans code, mais quand je l’ai essayé, il ne m’a pas paru très abouti. Curieusement, écrire du code dans le DSL était plus intuitif et plus simple
Articles liés :
ImHex – A Hex Editor - https://news.ycombinator.com/item?id=32287902 - juillet 2022, 70 commentaires
ImHex – A Hex Editor - https://news.ycombinator.com/item?id=25353965 - décembre 2020, 78 commentaires
Ça a l’air plutôt bien. Développer un éditeur hexadécimal comme projet, est-ce une bonne idée ?
Une version simple ne semble pas si difficile, mais il y a beaucoup de quoi s’entraîner si l’on veut parser toutes sortes de formats, des images exécutables aux WAD de Doom en passant par les formats de fichiers propriétaires. Il semble aussi y avoir beaucoup de possibilités pour créer des outils qui aident à la rétro-ingénierie
Cela permettrait de pratiquer d’un coup plusieurs sujets : traitement de fichiers, GUI, mise en page de texte, gestion de la mémoire, etc.
Ça a l’air bien. D’habitude, je continuais à utiliser 010 Editor surtout pour la recherche avec wildcards, mais ImHex fait aussi cela, et davantage, donc je suis tenté. Je vais le tester un peu plus
J’adore cette culture informatique. La rétro-ingénierie, l’écriture de modules noyau, comprendre comment les choses fonctionnent et leur faire faire ce pour quoi elles n’étaient pas conçues : tout cela est fascinant
Cela dit, il n’y a pas beaucoup de voies légales pour le faire, et cela demande énormément de temps ainsi que l’aide de pairs
Comme hobby, dans le pays où je vis, la rétro-ingénierie visant à faire fonctionner sur son propre système quelque chose que l’on possède est explicitement légale. Par exemple, corriger un jeu Windows XP pour qu’il tourne sous Windows 10. Cette exception est assez large et rend possible la rétro-ingénierie dans la plupart des cas qui « devraient être légaux »
Il suffit de publier sous un pseudonyme non relié à son identité réelle et d’utiliser des communautés dédiées qui ignorent les demandes de retrait DMCA. Si l’objectif n’est pas d’en tirer de l’argent, le pire scénario est sans doute que la cible remarque votre travail et applique vmprotect à la version suivante
J’ai compris qu’il s’agissait d’enregistrements de longueur fixe, et les 2 octets juste après le titre ressemblaient à la valeur hexadécimale du numéro d’enregistrement affiché dans l’application. En cliquant sur une case à cocher, un octet passait de 0x00 à 0x01 ; après suffisamment d’expériences, j’ai pu mapper toute la structure sur des structures de code et produire des rapports que l’application d’origine ne prenait pas en charge
Il n’y avait rien d’illégal là-dedans. Le fournisseur aurait voulu que nous payions pour créer des rapports, mais rien ne l’interdisait juridiquement
Ce n’est pas parce qu’on a créé ou appris quelque chose qu’il faut forcément le diffuser à tout le monde. L’apprentissage peut être une récompense en soi