4 pontos por GN⁺ 2024-06-30 | 1 comentários | Compartilhar no WhatsApp
  • 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 -NoGPU pode 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/libimhex e /plugins/ui são disponibilizados sob LGPLv2.1, permitindo o desenvolvimento de plugins proprietários

Funções básicas oferecidas pelo ImHex

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:

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 -NoGPU usa 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
  • 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 build
    • cd build
    • DESTDIR=install ninja install
    • o caminho do SDK será install/usr/local/share/imhex/sdk, e IMHEX_SDK_PATH deve 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

 
GN⁺ 2024-06-30
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

    • O 010 Editor também atende aos três pontos. Em compensação, ao contrário do 010 Editor, o ImHex não exige pagar 150 dólares e, por ser livre e open source, é fácil implementar por conta própria os recursos de que você precisa
  • 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

    • Nas configurações, é possível baixar assets adicionais e interpretar dados em vários formatos de codificação
      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...
    • O problema do CP437 é que FF, 00, 20 são todos espaços em branco, então parecem iguais
      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

    • O HxD no Windows chega perto do auge dos editores hexadecimais, e sinto que não há um equivalente real no macOS ou no Linux. O ruim é que quase não uso Windows
      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
    • Mais um voto para o HexFiend. O formato de templates é fácil de estender, então já o usei para analisar vários formatos de arquivo
      Também testei rapidamente o ImHex e respeito muito o projeto em si, mas para o meu uso parecia matar mosca com canhão
    • Fico curioso se você já experimentou o Hiew
  • 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/

    • Só a renderização de fontes, que parece sem antialiasing, já torna doloroso usar
  • 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

    • Nas resoluções de tela atuais, qualquer editor precisa de renderização por hardware para ser fluido e rápido
      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...
    • É porque a UI foi feita com Imgui. O prefixo Im do nome também vem daí; é um framework de UI para programas de computação gráfica
      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
    • Segundo o README do projeto, se não houver GPU, são fornecidas versões com renderização por software para Windows e macOS
    • Provavelmente só escolheram o renderizador OpenGL para imgui
  • É 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

    • Então parece algo parecido com os dissectors de protocolo do Wireshark
  • 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

    • Lembro de ter lido um texto dizendo que, ao aprender uma linguagem nova, implementar um editor hexadecimal é um bom primeiro projeto
      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

    • Trabalho profissionalmente com engenharia reversa e tenho muitos colegas no mundo todo que fazem o mesmo. Minha principal área de atuação é análise de malware
      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”
    • Para se divertir, o projeto não precisa necessariamente ser “legal”
      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
    • Engenharia reversa de formatos de arquivo é muito divertida. Já trabalhei em um lugar que usava um aplicativo proprietário de gestão de tarefas e, um dia, entediado, olhei o arquivo de dados dele em um editor hexadecimal e percebi um padrão: os títulos dos registros do app apareciam no arquivo exatamente a cada X bytes
      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
    • Se você não publica, em geral pode fazer quase qualquer coisa
      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