ImHex, ein Hex-Editor für Reverse Engineers
(github.com/WerWolv)- ImHex ist ein Hex-Editor für Reverse Engineers, Programmierer und alle, die spät in der Nacht arbeiten. Er bündelt Funktionen zum Analysieren, Bearbeiten und Visualisieren von Dateiinhalten in einem Tool.
- Zu den Kernfunktionen gehört eine C-ähnliche Pattern Language, mit der sich Strukturen und Datentypen definieren lassen, um Dateiinhalte zu parsen und hervorzuheben. Außerdem wird automatisches Laden anhand von MIME-Typen und Magic-Werten unterstützt.
- Es können verschiedene Datenquellen geöffnet werden, darunter lokale Dateien, Raw Disks, GDB Server, UDP-Pakete, Prozessspeicher sowie entfernte Dateien per SSH/SFTP. Ebenfalls enthalten sind ein Capstone-basierter Disassembler und YARA-Rule-Scans.
- Voraussetzung ist grundsätzlich eine GPU mit OpenGL 3.0 oder höher. Die
-NoGPU-Releases mit Software-Rendering können ohne GPU genutzt werden, können aber deutlich langsamer sein als die GPU-beschleunigte Version. - Plugins werden über
libimhex, die ImHex API und die Content Registry entwickelt. Der Großteil steht unter GPLv2-only,/lib/libimhexund/plugins/uiwerden jedoch unter LGPLv2.1 bereitgestellt und erlauben damit die Entwicklung proprietärer Plugins.
Grundlegende Rolle von ImHex
- ImHex ist ein Hex-Editor für Reverse Engineers, Programmierer und Menschen, die sich ein Tool wünschen, das auch bei der Arbeit um 3 Uhr morgens die Augen weniger ermüdet.
- Aktuelle Releases, Nightly-Pre-Releases, eine Web-Version und die Dokumentation werden separat bereitgestellt.
Hex-Ansicht und Datenbearbeitung
- Die Hex-Ansicht unterstützt Byte-Patching, Patch-Management und unbegrenztes Undo/Redo.
- Bytes können in mehreren Formaten kopiert werden.
- bytes
- hex string
- Arrays für C, C++, C#, Rust, Python, Java, JavaScript
- ASCII-Art hex view
- HTML self-contained div
- Such- und Navigationsfunktionen umfassen einfache string/hex search sowie goto relativ zu Anfang, Ende oder aktueller Cursorposition.
- Highlighting unterstützt Regeln für den Vordergrund sowie Hintergrund-Highlighting auf Basis von Patterns, Suchergebnissen und Lesezeichen.
- Die Datenanzeige unterstützt mehrere Typen.
- 8/16/32/64-Bit hexadecimal integer
- 8/16/32/64-Bit signed/unsigned decimal integer
- 16/32/64-Bit float
- RGBA8 color, HexII, binary
- Bei Encodings werden ASCII und benutzerdefinierte Encodings verarbeitet; UTF-8, UTF-16, ShiftJIS, die meisten Windows-Encodings und weitere werden standardmäßig unterstützt.
- Eine paged data view wird bereitgestellt.
Pattern Language und Interpretation von Datenstrukturen
- Die Pattern Language ist eine vollständig benutzerdefinierte Programmiersprache, die für ImHex entwickelt wurde.
- Mit einer C-ähnlichen Syntax lassen sich Strukturen und Datentypen definieren, die zum Parsen und Hervorheben von Dateiinhalten verwendet werden können.
- Die Pattern Language unterstützt automatisches Laden basierend auf MIME-Typen und Magic-Werten.
- Zu den unterstützten Elementen gehören arrays, pointers, structs, unions, enums, bitfields, namespaces, little/big endian, conditionals und weitere.
- Fehlermeldungen, syntax highlighting und error marking werden bereitgestellt.
- Zu den visualisierbaren Daten gehören images, audio, 3D models, coordinates, time stamps und weitere.
- Zugehörige Ressourcen:
- Pattern Language Source Code
- Pattern Language Documentation
- ImHex-Patterns: Repository für format patterns, libraries, magic und constant files
Datenprüfung, Vorverarbeitung und Suche
- Der Data Inspector interpretiert Daten als verschiedene Typen, unter anderem mit endianness, decimal, hexadecimal, octal und bit inversion.
- unsigned/signed integer: 8/16/24/32/48/64 Bit
- float: 16/32/64 Bit
- signed/unsigned LEB128
- ASCII, Wide, UTF-8 characters and strings
time32_t,time64_t, DOS date/time- GUID, RGBA8, RGB65 colors
- Über den Inspector lassen sich Bytes kopieren und ändern; neue Datentypen können mit der Pattern Language hinzugefügt werden.
- Der node-based data pre-processor kann Daten ändern, entschlüsseln oder decodieren, bevor sie im Hex-Editor angezeigt werden.
- Daten können geändert werden, ohne die underlying source anzutasten.
- Das Hinzufügen von custom nodes wird unterstützt.
- Die Datensuche kann über die gesamte Datei oder über eine Auswahl ausgeführt werden.
- Die String-Extraktion bietet Optionen für Mindestlänge, Zeichensatz und Encoding.
- sequence search findet byte oder character sequences und bietet eine Option zum Ignorieren der Groß-/Kleinschreibung.
- regex search, binary pattern wildcard search und numeric value/range search werden unterstützt.
- numeric search umfasst Optionen für size, endianness und das Ignorieren unaligned values.
Datenquellen und Analysefunktionen
- ImHex kann Daten aus verschiedenen Datenquellen laden.
- Lokale Dateien: unterstützt schnelles und effizientes Laden großer Dateien
- Raw Disks: Laden von Raw Disks und Partitionen
- GDB Server: Zugriff auf den RAM laufender Prozesse oder embedded devices
- Intel Hex, Motorola SREC
- Base64 encoded data
- UDP packets
- process memory: Untersuchung des gesamten address space eines laufenden Prozesses
- entfernte Dateien per SSH/SFTP
- Datenanalyse und -visualisierung umfassen einen file parser auf Basis von file magic sowie eine MIME type database.
- Graphen und Statistiken bieten byte type distribution, entropy graph, highest/average entropy, digram und layered distribution graph.
- Es gibt eine Funktion zur Erkennung von encrypted/compressed files.
- Diffing vergleicht verschiedene Datenquellen und bietet Difference-Highlighting sowie eine table view.
Disassemblierung, YARA und Hashes
- Der integrierte Disassembler unterstützt alle von Capstone unterstützten Architekturen.
- ARM32, ARM64, MIPS, x86 16/32/64-bit, PowerPC, SPARC, IBM SystemZ, xCORE, M68K, TMS320C64X, M680X, Ethereum, RISC-V, WebAssembly, MOS65XX, Berkeley Packet Filter
- Auch das Schreiben eines custom disassembler für eigene Architekturen wird unterstützt.
- YARA Rule-Support scannt Dateien mit official yara rules, hebt Matches im Hex-Editor hervor, springt zu Matches und kann mehrere Rules gleichzeitig anwenden.
- Hashing kann für bestimmte Datenbereiche und beliebige Strings ausgeführt werden.
- Zu den unterstützten Hashes gehören CRC8/16/32, MD5, SHA-1/SHA-224/SHA-256/SHA-384/SHA-512, Adler32, Murmur, SipHash, XXHash, Tiger, Blake2B, Blake2S und weitere.
UI, Themes, Import und Export
- Themes bieten standardmäßig einen dark mode; ein light mode ist ebenfalls verfügbar.
- Farben und Stile aller UI-Elemente können über teilbare theme files angepasst werden; custom fonts werden unterstützt.
- Das modern interface unterstützt multiple workspaces, custom layouts und detachable windows.
- Import/Export unterstützt Base64 files, IPS/IPS32 patches, Markdown reports und binary arrays für mehrere Programmiersprachen.
- Bookmarks unterstützen custom name/color, region highlight im Hex-Editor, jump, Öffnen von bookmark content in einem neuen Tab und das Hinzufügen von Kommentaren.
- Der integrierte content updater kann Dateien aus der Datenbank innerhalb von ImHex herunterladen.
- pattern files
- pattern language libraries
- magic files
- custom data processor nodes
- custom encodings
- custom themes
- Yara rules
Tools und Onboarding
- Zu den Helpful tools gehören LLVM-basierte Demangler für Itanium, MSVC, Rust und D-Lang.
- Weitere Tools umfassen ASCII table, regex replacer, mathematical expression evaluator, graphing calculator, hexadecimal color picker, base converter, byte swapper, UNIX permissions calculator und Wikipedia term definition finder.
- file utilities bieten file splitter, file combiner und file shredder.
- Ebenfalls enthalten sind TCP Client/Server, HTTP Requests, IEEE754 Float visualizer, Euclidean algorithm calculator und weitere.
- Für den Einstieg gibt es mehrsprachige Unterstützung, einen simplified mode für Einsteiger, umfangreiche Dokumentation, example files aus der Datenbank, achievements und interactive tutorials.
Systemanforderungen und Build-Bedingungen
- Eine GPU benötigt in der Regel OpenGL 3.0 oder höher.
- Releases mit dem Suffix
-NoGPUverwenden software rendering und können ohne GPU laufen, können aber deutlich langsamer sein als die GPU accelerated Version. - Wenn möglich, wird eine dedicated GPU statt einer integrated GPU empfohlen.
- Einige Intel-HD-GPU-Treiber unter Windows sind dafür bekannt, graphical artifacts zu verursachen.
- Releases mit dem Suffix
- OS-Unterstützung:
- Windows 7 oder höher, Windows 10/11 empfohlen
- macOS 15 Sequoia oder höher
- Niedrigere Versionen können bei eigener Kompilierung funktionieren, aber da es auf GitHub keine CI runner für macOS 15 oder älter gibt, funktionieren die release binaries dort nicht.
- Der macOS build ist nicht signed, daher ist eine manuelle Freigabe in den Security-&-Privacy-Einstellungen erforderlich.
- Für Linux gibt es official releases für Ubuntu/Debian, Fedora, RHEL/AlmaLinux und Arch Linux; andere distros werden über AppImage, Flatpak und Snap unterstützt.
- Getestet unter FreeBSD 14.3
- Offiziell unterstützt werden x86, AMD64 und ARM64; auf Little-Endian-CPUs sollte es funktionieren.
- Benötigt werden etwa 50 MiB RAM; komplexere Analysen erfordern mehr Speicher.
- Der Speicherplatzbedarf liegt bei etwa 100 MiB.
- Zum Kompilieren wird GCC oder Clang mit Unterstützung für C++23 oder höher benötigt.
- Windows- und Linux-Releases werden mit dem neuesten available GCC gebaut.
- macOS-Releases werden mit dem neuesten available LLVM Clang gebaut.
- MSVC und AppleClang werden nicht unterstützt.
- Dokumentation zu Installation und Kompilierung:
Plugin-Entwicklung und Lizenz
- Die Plugin-Entwicklung kann mit einem template project gestartet werden; über
libimhex, die ImHex API und die Content Registry kann mit ImHex interagiert oder neuer content hinzugefügt werden. - Zum Bauen von Plugins wird das SDK benötigt.
- Vorgehen zum lokalen Bauen des SDK:
cmake -G Ninja -DIMHEX_BUNDLE_PLUGIN_SDK=ON -B buildcd buildDESTDIR=install ninja install- Der SDK-Pfad lautet
install/usr/local/share/imhex/sdk;IMHEX_SDK_PATHmuss auf diesen absolute path gesetzt werden.
- In GitHub Actions CI kann das SDK mit der Action imhex-download-sdk automatisch heruntergeladen werden.
- Als Einstiegspunkt für Plugins steht das ImHex Plugin Template bereit.
- Die Lizenz ist überwiegend GPLv2-only.
/lib/libimhexsteht unter LGPLv2.1/plugins/uisteht unter LGPLv2.1- Diese Ausnahme soll die Entwicklung proprietary plugins ermöglichen.
- Die code signing policy besagt, dass keine Informationen an andere Netzwerksysteme übertragen werden, sofern dies nicht ausdrücklich vom Nutzer oder vom Installations-/Betriebsverantwortlichen angefordert wird.
1 Kommentare
Meinungen auf Hacker News
ImHex ist der beste Hex-Editor, den ich bisher benutzt habe.
Dafür gibt es mehrere Gründe; einige davon haben auch andere Editoren, aber selten alles zusammen. Er hebt Abschnitte bekannter Dateiformate über Datei-Templates automatisch hervor, zeigt die ausgewählten Bytes gleichzeitig als die meisten gängigen Datentypen interpretiert an und ist beim Umgang mit großen Dateien viel schneller als andere Editoren.
Der Nachteil ist, dass die imgui UI manchmal Bugs hat, aber er hat bei mir andere Viewer wie HexFiend oder hexa ersetzt.
Ich frage mich, ob dieser Editor ASCII-Bytes als CP437-Glyphen anzeigen kann.
Ich bin damit aufgewachsen, Binärdateien unter DOS so zu lesen, und kann die Glyphen viel schneller lesen als die entsprechenden Hex-Werte. Nicht druckbare Zeichen dagegen als Punkte darzustellen, sagt einem nicht besonders viel.
CP437 sehe ich in der Liste nicht, aber das Format der Encoding-Dateien ist schlicht, daher dürfte sich ein Mapping leicht erstellen lassen.
https://github.com/WerWolv/ImHex-Patterns/tree/master/encodi...
Außerdem gibt es Zeichen, bei denen unklar ist, ob es das deutsche scharfe S oder ein Beta sein soll.
Ich habe ImHex ausprobiert, aber für die meisten Dinge, die ich machen wollte, war es zu komplex.
Unter macOS mag ich weiterhin Hex Fiend. Es ist einfach, schnell und tut, was ich will. Unter Windows habe ich noch keinen perfekten „einfachen“ Hex-Editor gefunden.
Unter macOS verwende ich Hex Fiend, verstehe aber nicht, warum es beim Verbreitern des Fensters die Zeilen neu umbrechen lässt. Ich maximiere es, um visuelle Ablenkung zu reduzieren, möchte die Zeilenlänge aber bei 16 oder 32 Bytes halten und keine merkwürdige Breite, die die Ausrichtung ruiniert.
ImHex habe ich ebenfalls kurz ausprobiert, und ich respektiere das Projekt wirklich, aber für meinen Einsatzzweck fühlte es sich an, als würde man mit Kanonen auf Spatzen schießen.
Vorerst werde ich wohl bei 010 Editor bleiben[1]. Es ist der beste Hex-Editor, den ich je benutzt habe.
Dear ImGui, das GUI-Framework, das dieses neue Projekt verwendet, gefällt mir überhaupt nicht. Es wirkt eher für kleine Bildschirme und eingebettete Systeme ohne Fenstermanager gedacht; in einer vollständigen Desktop-Umgebung ist es wegen der kleinen Elemente und der fehlenden UI-Integration ziemlich unbeholfen.
[1] https://www.sweetscape.com/010editor/
Dort steht: „ImHex requires a GPU with OpenGL 3.0 support in general“ – warum braucht ein Hex-Editor OpenGL? Braucht er deshalb auch eine GPU?
Ich frage mich, ob es einen guten Grund für OpenGL gibt oder ob es nur beeindruckend wirken soll.
Besonders die alte Art, komplexe Formatierung pixelgenau zu zeichnen, ist spürbar langsam. Siehe zum Beispiel diesen Beitrag:
[1] https://www.sublimetext.com/blog/articles/hardware-accelerat...
Allerdings bedeutet die OpenGL-Anforderung nicht zwingend GPU. Es gibt auch Software-Implementierungen von OpenGL, deren Leistung aber meist eher schlecht ist. Außerdem gehen viele Plattformen heute davon aus, dass in irgendeiner Form eine GPU vorhanden ist. Fälle, in denen man ohne GPU GUI-Tools braucht, sind selten, und in solchen Nischenumgebungen ist es auch unwahrscheinlich, dass man lokal Hex-Editoren und Werkzeuge ausführt.
Ein wirklich großartiges Projekt. Ich hatte ziemlich viel Spaß damit, am ROM einer Philips-Smartwatch herumzuspielen.
Es gibt eine eingebaute DSL, die wie Rust aussieht; ohne Speicherverwaltung ist sie sehr leichtgewichtig, aber damit kann man strukturierte Daten in Binärstreams visualisieren und extrahieren. Wirklich spaßig und cool.
Es gibt auch einen visuellen Editor, mit dem man einfache Berechnungen ohne Code erstellen kann, aber als ich ihn ausprobiert habe, wirkte er nicht ganz ausgereift. Seltsamerweise war es intuitiver und einfacher, Code in der DSL zu schreiben.
Verwandte Beiträge:
ImHex – A Hex Editor - https://news.ycombinator.com/item?id=32287902 - Juli 2022, 70 Kommentare
ImHex – A Hex Editor - https://news.ycombinator.com/item?id=25353965 - Dezember 2020, 78 Kommentare
Sieht ziemlich gut aus. Wäre es eine gute Idee, als Projekt einen Hex-Editor zu entwickeln?
Eine einfache Version scheint nicht so schwer zu sein, aber wenn man alle möglichen Dateiformate parsen will, von ausführbaren Images über Doom WADs bis zu proprietären Dateiformaten, gibt es viel Raum zum Üben. Auch für Werkzeuge, die Reverse Engineering unterstützen, scheint es viel Spielraum zu geben.
Damit könne man Dateiverarbeitung, GUI, Textlayout, Speicherverwaltung und anderes auf einmal üben.
Sieht gut aus. Normalerweise bin ich wegen der Wildcard-Suche bei 010 Editor geblieben, aber ImHex kann das offenbar ebenfalls und noch mehr, daher tendiere ich dazu. Ich werde es noch weiter testen.
Ich mag diese Computerkultur wirklich. Reverse Engineering, Kernel-Module schreiben, herausfinden, wie Dinge funktionieren, und sie dazu bringen, Dinge zu tun, für die sie ursprünglich nicht entworfen wurden – das ist faszinierend.
Allerdings gibt es nicht viele legale Wege dafür, und es braucht enorm viel Zeit sowie Hilfe von Gleichgesinnten.
Als Hobby ist in dem Land, in dem ich lebe, Reverse Engineering ausdrücklich legal, wenn es darum geht, etwas, das einem gehört, auf dem eigenen System zum Laufen zu bringen. Zum Beispiel ein Windows-XP-Spiel so zu reparieren, dass es unter Windows 10 läuft. Diese Ausnahme ist ziemlich weit gefasst, sodass Reverse Engineering in den meisten Fällen möglich wird, die „eigentlich legal sein sollten“.
Man kann es unter einem Pseudonym veröffentlichen, das nicht mit dem echten Namen verknüpft ist, und spezielle Communities nutzen, die DMCA-Takedown-Anfragen ignorieren. Wenn man damit kein Geld verdienen will, ist das Schlimmste vermutlich, dass das Ziel die Arbeit bemerkt und im nächsten Release vmprotect einsetzt.
Mir wurde klar, dass es sich um Datensätze fester Länge handelte, und die zwei Bytes direkt nach dem Titel sahen aus wie der Hex-Wert der Datensatznummer, die in der App angezeigt wurde. Als ich ein Kontrollkästchen anklickte, änderte sich ein Byte von 0x00 auf 0x01. Nach genügend Experimenten konnte ich die gesamte Struktur auf Structs im Code abbilden und Berichte erstellen, die die ursprüngliche App nicht unterstützte.
Daran war nichts illegal. Der Anbieter hätte wohl gewollt, dass wir für die Berichtserstellung bezahlen, aber rechtlich war das nicht blockiert.
Nur weil man etwas gebaut oder gelernt hat, muss man es nicht unbedingt wie eine Durchsage verbreiten. Das Lernen selbst kann die Belohnung sein.