ImHex, un editor hexadecimal para ingeniería inversa
(github.com/WerWolv)- ImHex es un editor hexadecimal dirigido a ingenieros de reversa, programadores y quienes trabajan de madrugada; reúne en una sola herramienta funciones para analizar, modificar y visualizar el contenido de archivos
- Su función central es permitir definir estructuras y tipos de datos con un lenguaje de patrones similar a C para parsear y resaltar el contenido de archivos, además de admitir carga automática basada en tipos MIME y valores magic
- Puede abrir múltiples fuentes de datos, como archivos locales, discos raw, GDB Server, paquetes UDP, memoria de procesos y archivos remotos por SSH/SFTP, e incluye un desensamblador basado en Capstone y escaneo con reglas YARA
- Como requisito de uso, normalmente se necesita una GPU con OpenGL 3.0 o superior; la versión de renderizado por software
-NoGPUpuede usarse sin GPU, pero puede ser mucho más lenta que la versión con aceleración por GPU - Los plugins se desarrollan mediante
libimhex, la API de ImHex y el Content Registry; la mayor parte del proyecto es GPLv2-only, pero/lib/libimhexy/plugins/uise ofrecen bajo LGPLv2.1, lo que permite desarrollar plugins propietarios
Rol básico que ofrece ImHex
- ImHex es un editor hexadecimal para ingenieros de reversa, programadores y personas que quieren una herramienta que canse menos la vista incluso trabajando a las 3 de la mañana
- La versión estable más reciente, las preversiones nightly, la versión web y la documentación se ofrecen por separado
Vista hexadecimal y edición de datos
- La vista hexadecimal admite byte patching, gestión de parches y undo/redo ilimitado
- La copia de bytes puede hacerse en varios formatos
- bytes
- hex string
- arreglos de C, C++, C#, Rust, Python, Java y JavaScript
- ASCII-Art hex view
- HTML self-contained div
- Las funciones de búsqueda y navegación incluyen string/hex search simple y goto relativo al inicio, al final o al cursor actual
- El resaltado admite configuración de reglas de primer plano y resaltado de fondo basado en patrones, resultados de búsqueda y marcadores
- La visualización de datos admite varios tipos
- enteros hexadecimales de 8/16/32/64 bits
- enteros decimales signed/unsigned de 8/16/32/64 bits
- float de 16/32/64 bits
- color RGBA8, HexII, binary
- En codificación, maneja ASCII y codificaciones definidas por el usuario, y trae soporte por defecto para UTF-8, UTF-16, ShiftJIS, la mayoría de las codificaciones de Windows, entre otras
- Ofrece paged data view
Lenguaje de patrones e interpretación de estructuras de datos
- Pattern Language es un lenguaje de programación completamente personalizable desarrollado para ImHex
- Con una sintaxis similar a C, permite definir estructuras y tipos de datos, y usarlos para parsear y resaltar el contenido de archivos
- El lenguaje de patrones admite carga automática basada en tipos MIME y valores magic
- Los elementos soportados incluyen arrays, pointers, structs, unions, enums, bitfields, namespaces, little/big endian, conditionals, entre otros
- Ofrece mensajes de error, syntax highlighting y error marking
- Los objetivos de visualización de datos incluyen images, audio, 3D models, coordinates, time stamps, entre otros
- Recursos relacionados:
- Pattern Language Source Code
- Pattern Language Documentation
- ImHex-Patterns: repositorio de format patterns, libraries, magic y constant files
Inspección, preprocesamiento y búsqueda de datos
- Data Inspector interpreta datos como distintos tipos, incluyendo endianness, decimal, hexadecimal, octal y bit inversion
- unsigned/signed integer: 8/16/24/32/48/64 bits
- float: 16/32/64 bits
- signed/unsigned LEB128
- caracteres y strings ASCII, Wide y UTF-8
time32_t,time64_t, fecha/hora DOS- colores GUID, RGBA8 y RGB65
- A través del inspector se pueden copiar y modificar bytes, y agregar nuevos tipos de datos con el lenguaje de patrones
- El preprocesador de datos basado en nodos puede modificar, descifrar o decodificar datos antes de que se muestren en el editor hexadecimal
- permite modificar datos sin tocar la fuente subyacente
- admite agregar custom nodes
- La búsqueda de datos puede hacerse sobre todo el archivo o sobre una selección
- la extracción de strings ofrece opciones de longitud mínima, conjunto de caracteres y codificación
- sequence search encuentra secuencias de bytes o caracteres y ofrece una opción para ignorar mayúsculas/minúsculas
- admite regex search, binary pattern wildcard search y búsqueda de valores/rangos numéricos
- numeric search incluye opciones de size, endianness e ignorar valores unaligned
Fuentes de datos y funciones de análisis
- ImHex puede cargar datos desde múltiples fuentes de datos
- archivos locales: carga rápida y eficiente de archivos grandes
- raw disks: carga de discos raw y particiones
- GDB Server: acceso a la RAM de un proceso en ejecución o de un embedded device
- Intel Hex, Motorola SREC
- Base64 encoded data
- UDP packets
- process memory: inspección de todo el address space de un proceso en ejecución
- archivos remotos por SSH/SFTP
- El análisis y la visualización de datos incluyen file parser basado en file magic y una base de datos de MIME type
- Los gráficos y estadísticas ofrecen byte type distribution, entropy graph, highest/average entropy, digram y layered distribution graph
- Tiene función de detección de archivos encrypted/compressed
- diffing compara distintas fuentes de datos y ofrece resaltado de diferencias y table view
Desensamblado, YARA y hashes
- El desensamblador integrado soporta todas las arquitecturas compatibles con 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
- También permite escribir custom disassemblers para arquitecturas propias
- El soporte de YARA Rule permite escanear archivos con official yara rules, resaltar matches en el editor hexadecimal, saltar a cada match y aplicar varias rules a la vez
- El hashing puede ejecutarse sobre regiones específicas de datos y strings arbitrarios
- Los hashes soportados incluyen CRC8/16/32, MD5, SHA-1/SHA-224/SHA-256/SHA-384/SHA-512, Adler32, Murmur, SipHash, XXHash, Tiger, Blake2B, Blake2S, entre otros
UI, temas, importación y exportación
- Los temas ofrecen dark mode por defecto y también permiten usar light mode
- Con theme files compartibles se pueden personalizar los colores y estilos de todos los elementos de la UI, y se admiten custom fonts
- La modern interface soporta multiple workspaces, custom layouts y detachable windows
- import/export soporta Base64 files, parches IPS/IPS32, reportes Markdown y binary arrays para varios lenguajes de programación
- bookmarks soporta custom name/color, resaltado de regiones dentro del editor hexadecimal, jump, abrir el contenido del bookmark en una nueva pestaña y agregar comentarios
- El content updater integrado permite descargar dentro de ImHex archivos de la base de datos
- pattern files
- pattern language libraries
- magic files
- custom data processor nodes
- custom encodings
- custom themes
- Yara rules
Herramientas y onboarding
- Helpful tools incluye demanglers basados en LLVM para Itanium, MSVC, Rust y D-Lang
- Otras herramientas incluyen ASCII table, regex replacer, mathematical expression evaluator, graphing calculator, hexadecimal color picker, base converter, byte swapper, UNIX permissions calculator, Wikipedia term definition finder, entre otras
- Las file utilities ofrecen file splitter, file combiner y file shredder
- También incluye TCP Client/Server, HTTP Requests, IEEE754 Float visualizer, Euclidean algorithm calculator, entre otros
- Para ayudar a comenzar, ofrece soporte multilenguaje, simplified mode para principiantes, extensive documentation, example files de la base de datos, achievements e interactive tutorials
Requisitos del sistema y condiciones de compilación
- La GPU normalmente requiere OpenGL 3.0 o superior
- Las versiones con sufijo
-NoGPUusan renderizado por software, por lo que pueden ejecutarse sin GPU, pero pueden ser mucho más lentas que la versión con GPU accelerated - Si es posible, se recomienda usar una dedicated GPU en lugar de una integrated GPU
- Se sabe que algunos drivers de Intel HD GPU en Windows generan graphical artifacts
- Las versiones con sufijo
- Soporte de OS:
- Windows 7 o superior; se recomienda Windows 10/11
- macOS 15 Sequoia o superior
- Las versiones anteriores podrían funcionar si se compilan manualmente, pero como no hay runners de CI para macOS 15 o inferior en GitHub, el release binary no funciona
- El build para macOS no está firmado, por lo que debe permitirse manualmente desde la configuración de Security & Privacy
- Linux tiene releases oficiales para Ubuntu/Debian, Fedora, RHEL/AlmaLinux y Arch Linux; otras distros se soportan mediante AppImage, Flatpak y Snap
- Probado en FreeBSD 14.3
- La CPU soporta oficialmente x86, AMD64 y ARM64, y debería funcionar con CPUs Little Endian
- Requiere alrededor de 50 MiB de RAM, y los análisis más complejos necesitan más memoria
- Requiere alrededor de 100 MiB de almacenamiento
- Para compilar se necesita GCC o Clang compatible con C++23 o superior
- Los releases de Windows y Linux se compilan con el GCC disponible más reciente
- El release de macOS se compila con el LLVM Clang disponible más reciente
- MSVC y AppleClang no están soportados
- Documentación de instalación y compilación:
Desarrollo de plugins y licencia
- El desarrollo de plugins puede iniciarse con un template project, y permite interactuar con ImHex o agregar nuevo content accediendo a
libimhex, la API de ImHex y el Content Registry - Para compilar plugins se necesita el SDK
- Procedimiento para compilar el SDK localmente:
cmake -G Ninja -DIMHEX_BUNDLE_PLUGIN_SDK=ON -B buildcd buildDESTDIR=install ninja install- La ruta del SDK será
install/usr/local/share/imhex/sdk, yIMHEX_SDK_PATHdebe configurarse con esa ruta absoluta
- En GitHub Actions CI, el SDK puede descargarse automáticamente con la action imhex-download-sdk
- Como punto de partida para plugins se ofrece ImHex Plugin Template
- La licencia es mayormente GPLv2-only
/lib/libimhexestá bajo LGPLv2.1/plugins/uiestá bajo LGPLv2.1- Esta excepción existe para permitir el desarrollo de plugins propietarios
- La code signing policy declara que no se transmite información a otros sistemas de red a menos que el usuario lo solicite explícitamente o lo pida el instalador u operador
1 comentarios
Opiniones en Hacker News
ImHex es el mejor editor hexadecimal que he usado hasta ahora
Hay varias razones; otros editores tienen algunas de ellas, pero es raro que las reúnan todas. Resalta automáticamente secciones de formatos de archivo conocidos mediante plantillas de archivo, interpreta los bytes seleccionados simultáneamente como la mayoría de los tipos de datos comunes y, al trabajar con archivos grandes, es mucho más rápido que otros editores
La desventaja es que la UI de imgui a veces tiene bugs, pero terminó reemplazando a otros visores como HexFiend o hexa
Me pregunto si este editor puede mostrar bytes ASCII como glifos CP437
Crecí leyendo archivos binarios así en DOS, así que puedo leer los glifos mucho más rápido que sus valores hexadecimales. En cambio, mostrar los caracteres no imprimibles como puntos no dice gran cosa
No veo CP437 en la lista, pero el formato de los archivos de codificación es simple, así que parece que sería fácil crear el mapeo
https://github.com/WerWolv/ImHex-Patterns/tree/master/encodi...
También hay caracteres ambiguos, como si son la sharp S alemana o beta
Probé ImHex, pero era demasiado complejo para la mayoría de las tareas que quería hacer
En macOS todavía me gusta Hex Fiend. Es simple, rápido y hace lo que necesito. En Windows todavía no encontré el editor hexadecimal “simple” perfecto
En macOS uso Hex Fiend, pero no entiendo por qué, al ensanchar la ventana, vuelve a ajustar las líneas. Quiero maximizarlo para reducir distracciones visuales, pero mantener la longitud de línea en 16 o 32 bytes, no en un tamaño raro que arruine la alineación
También probé ImHex un rato y respeto muchísimo el proyecto, pero para mi uso se sentía como matar una mosca con un cañón
Por ahora pienso seguir usando 010 Editor[1]. Es el editor hexadecimal más excelente que he usado en toda mi vida
Dear ImGui, el framework de GUI que usa este nuevo proyecto, no me gusta en absoluto. Se siente más apropiado para sistemas embebidos con pantallas pequeñas y sin gestor de ventanas; en un entorno de escritorio completo resulta bastante incómodo por sus elementos pequeños y la falta de integración con la UI
[1] https://www.sweetscape.com/010editor/
Dice “ImHex requires a GPU with OpenGL 3.0 support in general”; ¿por qué un editor hexadecimal necesita OpenGL? ¿Por eso también necesita una GPU?
Me pregunto si hay una buena razón para necesitar OpenGL, o si es solo para que parezca más sofisticado
En especial, el método de la época en que se dibujaba formato complejo píxel por píxel se nota lento. Por ejemplo, se puede ver este artículo
[1] https://www.sublimetext.com/blog/articles/hardware-accelerat...
Aun así, requerir OpenGL no necesariamente significa requerir una GPU. También hay implementaciones de software de OpenGL, aunque su rendimiento suele ser bastante malo. Además, hoy muchas plataformas asumen que hay alguna forma de GPU. Es raro necesitar una herramienta GUI sin GPU, y en esos entornos de nicho tampoco es muy probable ejecutar localmente un editor hexadecimal y sus herramientas
Es un proyecto realmente excelente. Me divertí bastante manipulando la ROM de un reloj inteligente Philips
Tiene un DSL integrado que parece Rust, y como no tiene gestión de memoria es muy liviano, pero con él se pueden visualizar y extraer datos estructurados de un flujo binario. Es realmente divertido y genial
También hay un editor visual para crear cálculos simples sin código, pero cuando lo probé no se sentía pulido. Curiosamente, escribir código en el DSL resultó más intuitivo y fácil
Artículos relacionados:
ImHex – A Hex Editor - https://news.ycombinator.com/item?id=32287902 - julio de 2022, 70 comentarios
ImHex – A Hex Editor - https://news.ycombinator.com/item?id=25353965 - diciembre de 2020, 78 comentarios
Se ve bastante bien. ¿Será buena idea desarrollar un editor hexadecimal como proyecto?
Una versión simple no parece tan difícil, pero para parsear todo tipo de formatos de archivo, desde imágenes ejecutables hasta WAD de Doom y formatos propietarios, hay mucho margen para practicar. También parece haber mucho espacio para crear herramientas que ayuden a la ingeniería inversa
Decía que permite practicar varias cosas a la vez: manejo de archivos, GUI, disposición de texto, gestión de memoria, etc.
Se ve bien. Normalmente seguía usando 010 Editor por la búsqueda con comodines, pero ImHex también hace eso y más, así que me está convenciendo. Voy a probarlo un poco más
Me encanta esta cultura informática. La ingeniería inversa, escribir módulos del kernel, descubrir cómo funcionan las cosas y hacer que hagan cosas para las que no fueron diseñadas originalmente: todo eso es fascinante
Pero no hay muchos caminos para hacerlo legalmente, y requiere muchísimo tiempo y ayuda de colegas
Como hobby, en el país donde vivo la ingeniería inversa con el propósito de hacer funcionar algo que uno posee en su propio sistema es explícitamente legal. Por ejemplo, arreglar un juego de Windows XP para que funcione en Windows 10. Esta excepción es bastante amplia, así que permite hacer ingeniería inversa en la mayoría de los casos en los que “parecería que debería ser legal”
Basta con publicarlo bajo un seudónimo no vinculado a tu nombre real y usar comunidades dedicadas que ignoren las solicitudes de baja por DMCA. Si no piensas ganar dinero con eso, en el peor de los casos el objetivo se enterará del trabajo y aplicará vmprotect en la siguiente versión
Me di cuenta de que eran registros de longitud fija, y los 2 bytes justo después del título parecían ser el valor hexadecimal del número de registro que mostraba la app. Al hacer clic en una casilla, un byte cambiaba de 0x00 a 0x01 y, tras suficientes experimentos, pude mapear toda la estructura a structs en código y crear reportes que la app original no podía generar
No había nada ilegal en eso. El proveedor seguramente quería que pagáramos por la creación de reportes, pero legalmente no había impedimento
El hecho de crear o aprender algo no significa que necesariamente tengas que anunciarlo a los cuatro vientos. El aprendizaje en sí puede ser la recompensa