ImHex, um editor hexadecimal para engenheiros reversos
(github.com/WerWolv)- ImHex é um editor hexadecimal voltado para engenheiros reversos, programadores e pessoas que trabalham até de madrugada, reunindo em uma única ferramenta recursos para analisar, modificar e visualizar o conteúdo de arquivos
- O recurso central é sua linguagem de padrões semelhante a C, que define estruturas e tipos de dados para fazer parsing e destacar o conteúdo de arquivos, com suporte a carregamento automático com base em tipo MIME e valores magic
- É possível abrir várias fontes de dados, como arquivos locais, discos brutos, servidor GDB, pacotes UDP, memória de processo e arquivos remotos via SSH/SFTP, além de incluir um disassembler baseado em Capstone e varredura com regras YARA
- O requisito básico de uso é uma GPU com OpenGL 3.0 ou superior; a release com renderização por software
-NoGPUpode ser usada sem GPU, mas pode ser muito mais lenta do que a versão com aceleração por GPU - Plugins são desenvolvidos por meio de
libimhex, da API do ImHex e do Content Registry; a maior parte do projeto é GPLv2-only, mas/lib/libimhexe/plugins/uisão disponibilizados sob LGPLv2.1, permitindo o desenvolvimento de plugins proprietários
Funções básicas oferecidas pelo ImHex
- ImHex é um editor hexadecimal para engenheiros reversos, programadores e para quem quer uma ferramenta que canse menos os olhos mesmo trabalhando às 3 da manhã
- Há downloads separados para a versão estável mais recente, nightly pre-release, versão web e documentação
Visualização hexadecimal e edição de dados
- A visualização hexadecimal oferece suporte a byte patching, gerenciamento de patches e undo/redo ilimitado
- A cópia de bytes pode ser feita em vários formatos
- bytes
- hex string
- arrays de C, C++, C#, Rust, Python, Java e JavaScript
- visualização hexadecimal em ASCII-Art
- div HTML autônoma
- Os recursos de busca e navegação incluem busca simples por string/hex e goto com base no início, fim ou cursor atual
- O destaque suporta configuração de regras de primeiro plano e destaque de fundo com base em padrões, resultados de busca e favoritos
- A exibição de dados suporta vários tipos
- inteiros hexadecimais de 8/16/32/64 bits
- inteiros decimais com sinal/sem sinal de 8/16/32/64 bits
- float de 16/32/64 bits
- cor RGBA8, HexII, binário
- A codificação lida com ASCII e codificações personalizadas, com suporte nativo a UTF-8, UTF-16, ShiftJIS e à maioria das codificações do Windows
- Oferece paged data view
Linguagem de padrões e interpretação de estruturas de dados
- A Pattern Language é uma linguagem de programação totalmente personalizável desenvolvida para o ImHex
- Com sintaxe semelhante à de C, ela permite definir estruturas e tipos de dados e usá-los para fazer parsing e destacar o conteúdo de arquivos
- A linguagem de padrões oferece suporte a carregamento automático com base em tipos MIME e valores magic
- Os elementos suportados incluem arrays, pointers, structs, unions, enums, bitfields, namespaces, little/big endian, conditionals e mais
- Fornece mensagens de erro, syntax highlighting e marcação de erros
- Os alvos de visualização de dados incluem images, audio, 3D models, coordinates, time stamps e mais
- Materiais relacionados:
- Pattern Language Source Code
- Pattern Language Documentation
- ImHex-Patterns: repositório de padrões de formato, bibliotecas, arquivos magic e arquivos de constantes
Inspeção, pré-processamento e busca de dados
- O Data Inspector interpreta dados em vários tipos, incluindo endianness, decimal, hexadecimal, octal e inversão de bits
- inteiro com sinal/sem sinal: 8/16/24/32/48/64 bits
- float: 16/32/64 bits
- LEB128 com sinal/sem sinal
- caracteres e strings ASCII, Wide e UTF-8
time32_t,time64_t, data/hora DOS- GUID, cores RGBA8 e RGB65
- É possível copiar e modificar bytes pelo inspector, além de adicionar novos tipos de dados com a linguagem de padrões
- O pré-processador de dados baseado em nós pode modificar, descriptografar e decodificar dados antes de eles serem exibidos no editor hexadecimal
- permite modificar os dados sem tocar na fonte subjacente
- suporta adição de nós personalizados
- A busca de dados pode ser feita no arquivo inteiro ou em uma área selecionada
- a extração de strings oferece opções de comprimento mínimo, conjunto de caracteres e codificação
- sequence search encontra sequências de bytes ou caracteres e oferece opção de ignorar maiúsculas/minúsculas
- suporta regex search, binary pattern wildcard search e busca por valor/faixa numérica
- a busca numérica inclui opções de tamanho, endianness e ignorar valores desalinhados
Fontes de dados e recursos de análise
- O ImHex pode carregar dados de várias fontes de dados
- arquivos locais: suporte a carregamento rápido e eficiente de arquivos grandes
- raw disks: carregamento de discos brutos e partições
- GDB Server: acesso à RAM de um processo em execução ou de um dispositivo embarcado
- Intel Hex, Motorola SREC
- dados codificados em Base64
- pacotes UDP
- memória de processo: inspeção de todo o espaço de endereçamento de um processo em execução
- arquivos remotos via SSH/SFTP
- A análise e visualização de dados inclui parser de arquivos com base em file magic e banco de dados de tipos MIME
- Gráficos e estatísticas oferecem distribuição de tipos de byte, gráfico de entropia, maior/média entropia, digrama e gráfico de distribuição em camadas
- Há recurso de detecção de arquivos criptografados/comprimidos
- O diffing compara diferentes fontes de dados e fornece destaque das diferenças e visualização em tabela
Disassembly, YARA e hash
- O disassembler integrado oferece suporte a todas as arquiteturas suportadas pelo 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
- Também há suporte à criação de custom disassemblers para arquiteturas próprias
- O suporte a YARA Rule permite escanear arquivos com regras oficiais do YARA, destacar os matches no editor hexadecimal, navegar até os matches e aplicar várias regras de uma vez
- O cálculo de hash pode ser feito em áreas específicas de dados e em strings arbitrárias
- Os hashes suportados incluem CRC8/16/32, MD5, SHA-1/SHA-224/SHA-256/SHA-384/SHA-512, Adler32, Murmur, SipHash, XXHash, Tiger, Blake2B, Blake2S e outros
UI, temas, importação e exportação
- Os temas oferecem dark mode por padrão, com light mode também disponível
- É possível personalizar cores e estilos de todos os elementos da UI com arquivos de tema compartilháveis, além de haver suporte a fontes personalizadas
- A interface moderna suporta múltiplos workspaces, layouts personalizados e janelas destacáveis
- Importação/exportação oferece suporte a arquivos Base64, patches IPS/IPS32, relatórios em Markdown e arrays binários para várias linguagens de programação
- Os bookmarks suportam nome/cor personalizados, destaque de regiões no editor hexadecimal, salto, abertura do conteúdo do bookmark em nova aba e adição de comentários
- O atualizador de conteúdo integrado pode baixar arquivos do banco de dados de dentro do próprio ImHex
- arquivos de padrão
- bibliotecas da linguagem de padrões
- arquivos magic
- nós personalizados de processamento de dados
- codificações personalizadas
- temas personalizados
- regras Yara
Ferramentas e onboarding
- As Helpful tools incluem demangler baseado em LLVM para Itanium, MSVC, Rust e D-Lang
- Outras ferramentas incluem tabela ASCII, regex replacer, avaliador de expressões matemáticas, calculadora gráfica, seletor de cores hexadecimais, conversor de base, byte swapper, calculadora de permissões UNIX e buscador de definições de termos na Wikipedia
- Os utilitários de arquivo oferecem file splitter, file combiner e file shredder
- Também inclui TCP Client/Server, HTTP Requests, visualizador de IEEE754 Float, calculadora do algoritmo de Euclides e mais
- Para ajudar no início, há suporte multilíngue, modo simplificado para iniciantes, documentação extensa, arquivos de exemplo no banco de dados, achievements e tutoriais interativos
Requisitos de sistema e condições de compilação
- A GPU geralmente precisa oferecer OpenGL 3.0 ou superior
- a release com sufixo
-NoGPUusa renderização por software, então pode rodar sem GPU, mas pode ser muito mais lenta que a versão com aceleração por GPU - quando possível, é recomendável usar uma GPU dedicada em vez de uma integrada
- alguns drivers de GPU Intel HD no Windows são conhecidos por causar artefatos gráficos
- a release com sufixo
- Suporte de SO:
- Windows 7 ou superior, com recomendação para Windows 10/11
- macOS 15 Sequoia ou superior
- versões mais baixas podem funcionar se compiladas manualmente, mas como não há runner de CI do macOS anterior ao 15 no GitHub, o binário de release pode não funcionar
- a build para macOS não é assinada, então é necessário permitir manualmente em Security & Privacy
- Linux tem releases oficiais para Ubuntu/Debian, Fedora, RHEL/AlmaLinux e Arch Linux; outras distros são atendidas via AppImage, Flatpak e Snap
- testado no FreeBSD 14.3
- A CPU tem suporte oficial para x86, AMD64 e ARM64, e deve funcionar em CPUs little endian
- São necessários cerca de 50MiB de RAM, com análises mais complexas exigindo mais memória
- São necessários cerca de 100MiB de espaço de armazenamento
- Para compilar, é necessário GCC ou Clang com suporte a C++23 ou superior
- as releases de Windows e Linux são compiladas com a versão mais recente disponível do GCC
- a release do macOS é compilada com a versão mais recente disponível do LLVM Clang
- MSVC e AppleClang não são suportados
- Documentação de instalação e compilação:
Desenvolvimento de plugins e licença
- O desenvolvimento de plugins pode começar com um projeto template e permite interagir com o ImHex ou adicionar novo conteúdo por meio de
libimhex, da API do ImHex e do Content Registry - É necessário o SDK para compilar plugins
- Procedimento para build local do SDK:
cmake -G Ninja -DIMHEX_BUNDLE_PLUGIN_SDK=ON -B buildcd buildDESTDIR=install ninja install- o caminho do SDK será
install/usr/local/share/imhex/sdk, eIMHEX_SDK_PATHdeve ser configurado para esse caminho absoluto
- No GitHub Actions CI, o action imhex-download-sdk pode baixar o SDK automaticamente
- O ponto de partida para plugins é o ImHex Plugin Template
- A licença é majoritariamente GPLv2-only
/lib/libimhexé LGPLv2.1/plugins/uié LGPLv2.1- essa exceção existe para permitir o desenvolvimento de plugins proprietários
- A política de assinatura de código afirma que nenhuma informação é transmitida para outros sistemas de rede, a menos que o usuário solicite explicitamente ou que isso seja exigido pelo processo de instalação/operação
1 comentários
Opiniões no Hacker News
ImHex foi o melhor editor hexadecimal que já usei até hoje
Há alguns motivos para isso; outros editores têm alguns deles, mas é raro encontrar tudo junto. Ele destaca automaticamente seções de formatos de arquivo conhecidos usando templates de arquivo, interpreta os bytes selecionados simultaneamente como a maioria dos tipos de dados comuns e é muito mais rápido que outros editores ao lidar com arquivos grandes
O ponto negativo é que a UI em imgui às vezes tem bugs, mas acabou substituindo outros visualizadores como HexFiend ou hexa
Fico curioso se esse editor consegue exibir bytes ASCII como glifos CP437
Cresci lendo arquivos binários assim no DOS, então consigo ler os glifos muito mais rápido do que os valores hexadecimais correspondentes. Por outro lado, mostrar caracteres não imprimíveis como pontos não informa muita coisa
Não vi CP437 na lista, mas o formato dos arquivos de codificação é simples, então parece fácil criar o mapeamento
https://github.com/WerWolv/ImHex-Patterns/tree/master/encodi...
Também há caracteres ambíguos, como se é o sharp S alemão ou beta
Experimentei o ImHex, mas ele era complexo demais para a maioria das tarefas que eu queria fazer
No macOS, ainda gosto do Hex Fiend. É simples, rápido e faz o que eu quero. No Windows, ainda não encontrei um editor hexadecimal “simples” perfeito
No macOS uso o Hex Fiend, mas não entendo por que ele reflow das linhas quando alargo a janela. Mesmo maximizando para reduzir distrações visuais, quero manter o comprimento das linhas em 16 ou 32 bytes, e não algum tamanho estranho que estrague o alinhamento
Também testei rapidamente o ImHex e respeito muito o projeto em si, mas para o meu uso parecia matar mosca com canhão
Por enquanto pretendo continuar usando o 010 Editor[1]. Foi o melhor editor hexadecimal que já usei na vida
Não gosto nem um pouco do Dear ImGui, o framework de GUI usado por este novo projeto. Ele parece mais adequado para sistemas embarcados com telas pequenas e sem gerenciador de janelas; em um ambiente desktop completo, fica bem estranho por causa dos elementos pequenos e da falta de integração com a UI
[1] https://www.sweetscape.com/010editor/
Está escrito que “ImHex requires a GPU with OpenGL 3.0 support in general”; por que um editor hexadecimal precisa de OpenGL? Então ele também precisa de GPU?
Fico me perguntando se há um bom motivo para exigir OpenGL ou se é só para parecer sofisticado
Especialmente o método antigo de desenhar formatação complexa pixel a pixel fica visivelmente lento. Por exemplo, veja este texto
[1] https://www.sublimetext.com/blog/articles/hardware-accelerat...
Dito isso, exigir OpenGL não significa necessariamente exigir uma GPU. Existem implementações de software de OpenGL, mas em geral o desempenho não é bom. Além disso, muitas plataformas atuais presumem que há algum tipo de GPU. É raro precisar de ferramentas GUI sem GPU, e nesses ambientes de nicho também é pouco provável rodar localmente um editor hexadecimal e ferramentas desse tipo
É um projeto realmente excelente. Brinquei bastante mexendo na ROM de um smartwatch Philips
Ele tem uma DSL embutida que parece Rust e, por não ter gerenciamento de memória, é bem leve; ainda assim, com ela dá para visualizar e extrair dados estruturados de fluxos binários. É muito divertido e bacana
Também há um editor visual para criar cálculos simples sem código, mas, quando usei, não pareceu muito polido. Curiosamente, escrever código na DSL foi mais intuitivo e fácil
Textos relacionados:
ImHex – A Hex Editor - https://news.ycombinator.com/item?id=32287902 - julho de 2022, 70 comentários
ImHex – A Hex Editor - https://news.ycombinator.com/item?id=25353965 - dezembro de 2020, 78 comentários
Parece bem interessante. Será que desenvolver um editor hexadecimal como projeto é uma boa ideia?
Uma versão simples não parece tão difícil, mas há bastante espaço para praticar se a ideia for fazer parsing de todo tipo de formato de arquivo, de imagens executáveis a Doom WAD e formatos proprietários. Também parece haver muito espaço para criar ferramentas que ajudem na engenharia reversa
Dizia que dá para praticar várias coisas de uma vez, como manipulação de arquivos, GUI, layout de texto e gerenciamento de memória
Parece bom. Normalmente eu continuava usando o 010 Editor por causa da busca com curingas, mas o ImHex também faz isso e mais, então estou ficando inclinado a ele. Vou testar um pouco mais
Gosto muito dessa cultura de computação. Engenharia reversa, escrever módulos de kernel, entender como as coisas funcionam e fazê-las realizar tarefas para as quais não foram originalmente projetadas são coisas fascinantes
Mas não há muitos caminhos para fazer isso legalmente, e é preciso uma enorme quantidade de tempo e ajuda de colegas
Como hobby, no país onde moro, a engenharia reversa para fazer algo que você possui funcionar no seu próprio sistema é explicitamente legal. Por exemplo, corrigir um jogo de Windows XP para rodar no Windows 10. Essa exceção é bem ampla, então permite engenharia reversa na maioria dos casos que “parecem que deveriam ser legais”
Basta publicar sob um pseudônimo não vinculado ao seu nome real e usar comunidades dedicadas que ignoram solicitações de remoção por DMCA. Se você não pretende ganhar dinheiro com isso, no pior caso o alvo percebe o trabalho e aplica vmprotect na próxima versão
Percebi que eram registros de tamanho fixo, e os 2 bytes logo depois do título pareciam ser o valor hexadecimal do número do registro exibido no app. Ao clicar em uma checkbox, um byte mudava de 0x00 para 0x01 e, depois de experimentar o suficiente, consegui mapear toda a estrutura para structs no código e criar relatórios que o app original não conseguia gerar
Não havia nada ilegal nisso. O fornecedor provavelmente queria que pagássemos pela criação dos relatórios, mas não havia impedimento legal
Não é necessário anunciar em alto e bom som tudo o que você cria ou aprende. O aprendizado em si pode ser a recompensa