English
     ░░          ░░░░░ 
     ░░         ░░   ░░
  ░░░░░ ░░░░░░░ ░░     
░░   ░░     ░░  ░░░░░░ 
░░   ░░    ░░   ░░   ░░
░░   ░░   ░░    ░░   ░░
  ░░░░░ ░░░░░░░  ░░░░░ 

Editor hexadecimal TUI rápido inspirado no Vim

Home Documentação Código-fonte

Índice

  1. Introdução
  2. Instalação
  3. Convenções
  4. Abrir arquivos
  5. Visões
  6. Modos
  7. Navegação
  8. Busca
  9. Favoritos
  10. Comentários
  11. Blocos
  12. Edição
  13. Copiar e colar
  14. Calculadora
  15. Aparência
  16. Sair do dz6
  17. Arquivo de inicialização
  18. Casos de uso
  19. Banco de dados
  20. Perguntas frequentes
  21. História

Introdução

Um editor hexadecimal é um software para visualizar e editar qualquer arquivo (e até discos e partições em alguns casos) com um olhar mais "cru", vendo diretamente a representação numérica em hexadecimal dos bytes deste arquivo. Existem vários editores hexadecimais por aí, mas o dz6 é diferente: ele é brasileiro (o primeiro de que temos notícia), de código aberto e roda direto do terminal do Windows, macOS, Linux, FreeBSD, etc. Além disso, ele é inspirado no Vim, um editor de textos poderosíssimo. Inspirado aqui significa que o visual parece e os comandos também. Se você não conhece os comandos do Vim, não se preocupe. Ao aprender a usar o dz6, você também aprende o básico do Vim.

Na prática, usar o dz6 significa promover o uso de software livre nacional, aprender sobre engenharia reversa e edição de arquivos e, de quebra, aprender vários comandos úteis no dz6 e no Vim. Isso sem falar nas facilidades que só o dz6 te dá quando comparado a outros editores hexadecimais. Pronto/a para inciar a jornada? Aperte o cinto que vamos acelerar agora!

Instalação

Existe mais de uma maneira de instalar o dz6, dependendo do seu sistema operacional. Veja qual se aplica ao seu caso e mãos à obra!

Windows

A maioria das versões do Windows 10 ou superior contém o WinGet, um gerenciador de aplicativos de linha de comando feito pela própria Microsoft, que copiou este conceito maravilhoso do Linux. Se este é o seu sistema, basta abrir um Prompt de Comando ou terminal do PowerShell e digitar winget install dz6.

Em versões do Windows sem WinGet, você pode ir em releases e baixar o arquivo dz6-x86_64-pc-windows-msvc.zip.

Linux

Primeiro, veja se o dz6 está disponível no repositório de pacotes da sua distribuição Linux (já é o caso para Arch Linux e BigLinux). Se não estiver, você pode baixar o arquivo dz6-x86_64-unknown-linux-gnu.tar.xz (que usa a glibc) ou o dz6-x86_64-unknown-linux-musl.tar.xz (que utiliza a musl libc). Se não souber decidir entre esses dois, vai no primeiro. Aí é só abrir no terminal a pasta na qual você baixou o arquivo, descompactá-lo e usá-lo. Por exemplo, supondo que você baixou o dz6 na sua para Downloads, basta fazer:

cd ~/Dowloads
tar xvf dz6-x86_64-unknown-linux-gnu.tar.xz
cd dz6-x86_64-unknown-linux-gnu
./dz6

macOS

Para Macs Intel, baixe o arquivo dz6-x86_64-apple-darwin.tar.xz. Se o seu Mac for ARM, baixe o dz6-aarch64-apple-darwin.tar.xz.

Via Cargo

Independentemente de sistema operacional, você pode instalar o Cargo -- a ferramenta de gerenciamento de pacotes do Rust -- e rodar cargo install dz6. A vantagem é que este comando vai baixar o código-fonte do dz6 e compilar na sua máquina, o que normalmente resulta em melhor desempenho já que o compilador Rust poderá otimizar o dz6 para o seu processador. A desvantagem é que demora alguns minutos.

Convenções

As seguintes convenções são adotadas neste manual:

- O termo posição diz respeito à posição de um byte no arquivo. Na posição zero, encontra-se o primeiro byte. Na posição um, o segundo e assim sucessivamente. Em inglês, o termo é file offset, comumente chamado somente de offset quando o contexto deixa implícito que uma posição num arquivo. O dz6 mostra a posição atual do cursor, no canto inferior direito, na barra de status. Além disso, posições também são mostradas na coluna à esquerda. Se somadas aos números da régua superior, resultam na posição do byte sob o cursor. Por exemplo, no trecho abaixo, é possível saber rapidamente a posição do byte 5C (realçado em vermelho) somando a posição da sua linha, 20, com a posição na régua/coluna, que é 0A, resultando em 2A.

        
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000
CA FE BA BE 00 00 00 02 01 00 00 07 00 00 00 03
00000010
00 00 40 00 00 00 BB F0 00 00 00 0E 01 00 00 0C
00000020
80 00 00 02 00 01 00 00 00 01
5C
00 00 00 00 0E
00000030
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Abrir arquivos

Após instalado, para abrir um arquivo com o dz6, basta comandar: dz6 nome_do_arquivo. Por exemplo, no Windows, você pode fazer (no Prompt de Comando ou PowerShell):

dz6 c:\windows\system32\calc.exe

Já no Linux ou macOS, você pode comandar no terminal:

dz6 /bin/ls

Se sua conta não tiver permissão de escrita no arquivo, ele será aberto em modo somente leitura. O dz6 vai mostrar isso com o indicador [RO] ao lado do nome do arquivo se for este o caso.

Você também pode pedir ao dz6 para abrir o arquivo em modo somente leitura. Para isso, basta adicionar a opção -r:

dz6 -r /bin/ls

Visões

No dz6, visões são jeitos diferentes de olhar para o arquivo. Atualmente, o dz6 possui duas visões diferentes: Hex e Text. visão A padrão é a Hex, que mostra os bytes do arquivo em representação hexadecimal, mas você pode apertar Enter para alternar entre as visões disponíveis.

Modos

Além das visões, o dz6 possui modos de operação. São eles:

Modo Descrição
NORMAL O modo normal no qual o dz6 inicia. A partir dele, é possível navegar pelo arquivo e entrar em outros modos.
COMMAND Modo de comando acionado ao teclar :
SEARCH/UTF-8 Modo de busca de strings (cadeias de texto) acionado pela tecla / ou ? (busca reversa).
SEARCH/HEX Modo de busca de sequência de bytes acionado pela tecla Tab a partir do modo de busca de strings.
SELECT Modo de seleção, útil para operar em vários bytes de uma vez.
REPLACE Modo de substituição para editar os bytes hexa.

A maioria dos modos só têm efeito na visão Hex por enquanto.

Vamos agora explorar vários recursos do dz6 e entender como os modos se relacionam com eles.

No modo NORMAL da visão Hex, as seguintes operações estão disponíveis:

Tecla(s) / Comando Descrição
h, j, k, l Navega uma posição para a esquerda, baixo, cima e direita, respectivamente. Também é possível usar as setas do teclado, claro.
0 Vai para o primeiro byte da linha atual. Alternativa: Home.
$ Vai para o último byte da linha atual. Alternativa: End.
Ctrl-f Desce uma página. Alternativa: PgDown.
Ctrl-b Sobe uma página. Alternativa: PgUp.
g Vai para o primeiro byte do arquivo. Alternativa: Ctrl-Home.
G Vai para o último byte do arquivo. Alternativa: Ctrl-End.
o Vai para o próximo byte diferente do byte sob o cursor.
O Vai para o byte anterior diferente do byte sob o cursor.
Backspace Vai para a última posição visitada.
:pos Vai para a posição desejada. :1337 vai para 0x1337, enquanto :1337t (com o sufixo t) vai para 1337 em decimal. Aceita os sufixos + e - para ir tantos bytes para frente ou para trás a partir da posição atual. Exemplo: +10t para avançar 10 bytes.

No Vim, o comando para ir para o primeiro caractere do arquivo é gg. No dz6 é somente g.

Modos de busca são acionados a partir do modo normal.

Tecla(s) Descrição
/ Entra no modo SEARCH/UTF-8. Ao digitar uma string e apertar Enter, o dz6 a procura no arquivo e vai para ela caso encontre. Para alternar entre os modos de busca, use Tab a partir deste modo. Além de SEARCH/UTF-8, atualmente o dz6 suporta SEARCH/HEX para busca de sequências de bytes hexa.
? Tem o mesmo efeito de /, mas a direção da busca é reversa.
n Se já tiver feito uma busca, vai para o próximo "match" da mesma.
n Se já tiver feito uma busca, vai para o "match" anterior da mesma.
s Exibe uma janela com no máximo 3000 strings encontradas no arquivo. Use as teclas de navegação para selecionar uma string e Enter para segui-la no dz6. As teclas + e - modificam o tamanho mínimo da string e a tecla f te permite aplicar um filtro de expressão regular sobre elas.

Ao chegar no último resultado da busca, apertar n novamente vai voltar ao primeiro. Isto é chamado de search wrapping. Para desabilitar este comportamento, no modo normal, comande :set nowrapscan. Para reabilitar, :set wrapscan.

Favoritos

Esse recurso é útil para rapidamente navegar entre posições de interesse. Ao adicionar uma posição favorita, o dz6 mostra uma pequena estrela na barra de status.

Tecla(s) Descrição
+ Adiciona a posição atual aos favoritos (máximo de 8).
Alt-1..8 Vai para o favorito desejado. Por exemplo, Alt-1 vai para o primeiro favorito adicionado.
- Vai para o último favorito adicionado.
Alt-Menos Remove o último favorito adicionado.
Alt-0 Remove todos os favoritos.

Comentários

Um dos recursos mais úteis do dz6 são os comentários que você pode adicionar nos offsets. Comentários são como favoritos, mas você pode escrever o que quiser neles. Além disso, eles ficam salvos no banco de dados criado especificamente para o arquivo aberto.

Tecla(s) / Comando Descrição
; Comenta uma posição do arquivo. Também serve para editar um comentário existente nela. O texto do comentário é exibido na barra de status.
:cmt <posição> <texto> Formato de comando para comentar. Tem o mesmo efeito da tecla ;. Por exemplo, :cmt 1337 "happy hacking", vai comentar a posição 0x1337 (lembre-se de que o padrão do dz6 é hexa) com o texto entre aspas duplas. As aspas só são necessárias para comentários que contenham espaços em branco.
Alt-n Abre a janela Names, onde todos os comentários previamente adicionados são mostrados. Nela é possível navegar pelos comentários e segui-los com a tecla Enter.

Diferentemente dos favoritos, não há uma atalho de teclado para visitar uma posição comentada, mas nada impede de ter uma posição favoritada e também comentada.

Mesmo que o dz6 esteja trabalhando no modo somente leitura, os comentários são salvos no banco de dados com os comandos :w, :wq ou :x e estarão disponíveis na próxima vez em que você abrir o mesmo arquivo com o dz6.

Blocos

Desde a versão 0.7.0, a partir do modo NORMAL na visão Hex, é possível marcar blocos coloridos que proporcionam uma ótima indicação visual. Por exemplo:

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000
7F 45 4C 46 02 01 01 00 00 00 00 00 00 00 00 00
00000010
03 00 3E 00 01 00 00 00 F0 4A 10 00 00 00 00 00
00000020
40 00 00 00 00 00 00 00 B8 40 A5 00 00 00 00 00
00000030
00 00 00 00 40 00 38 00 0F 00 40 00 22 00 21 00

Para marcar um bloco, primeiro pressione v para entrar no modo de seleção e, após selecionar os bytes desejados, aperte Alt-m para marcá-lo com cores aleatórias para o fundo e para o texto. Se não gostar das cores, é só apertar Alt-m de novo.

Ah, os blocos são salvos no banco de dados se você salvar com :w. Assim, quando reabrir o mesmo arquivo, os blocos estarão lá.

Uma posição pode estar na lista de favoritos, possuir um comentário e ser parte de um bloco sem qualquer problema. Os três recursos são independentes.

Edição

Os comandos listados abaixo põem o dz6 no modo de substituição (REPLACE). Com eles, é possível alterar o byte sob o cursor. Para que eles funcionem, é necessário ter permissão de escrita no arquivo.

Tecla(s) Descrição
Ctrl-a Incrementa o byte sob o cursor.
Ctrl-x Decrementa o byte sob o cursor.
z Zera o byte sob o cursor.
~ Se o byte estiver na faixa alfabética da tabela ASCII, inverte o caso dele.
r Entra no modo REPLACE e permite edição livre. Use Tab para alternar entre edição em hexa ou em ASCII.

Uma vez no modo REPLACE, além dos comandos acima, os seguintes comandos extras estão disponíveis:

Tecla(s) Descrição
n Altera o byte sob o cursor para o byte equivalente a uma instrução NOP (No Operation) de 1 byte. Atualmente, somente a arquitetura x86 é suportada nesta operação, portanto o byte será o 90.
t Trunca o arquivo na posição na posição atual. Em outras palavras, apaga todos os bytes do arquivo a partir da posição atual. Em ainda outras palavras, o byte atual vira o novo fim do arquivo.
T Trunca o arquivo de forma reversa. Em outras palavras, apaga todos os bytes do arquivo desde o início até a posição atual. Em ainda outras palavras, o byte atual vira o novo início do arquivo.
Esc Volta ao modo NORMAL (mantém as alterações feitas em modo REPLACE, mas você pode desafazê-las com u.
Enter Salva as alterações no buffer (mas ainda não salva no arquivo).

De volta ao modo normal, os seguintes comandos controlam as alterações:

Tecla(s) Descrição
u Desfaz as alterações uma a uma.
:w Salva as alterações no arquivo.
:wq Salva as alterações no arquivo e sai do programa. Alternativa: :x.

O modo de seleção também pode ser usado para alterar vários bytes de uma vez. Para isso, aperta a tecla v, selecione os bytes desejados com as teclas de navegação e depois use a tecla z para zerá-los, por exemplo.

Copiar e colar

Tecla(s) Descrição
y No modo de seleção, copia os bytes selecionados para a área de transferência.

Diferentemente do Vim, o d6 utiliza a área de transferência do sistema operacional. Sendo assim, você pode colar o que copiar do dz6 em qualquer outro aplicativo. Para colar no dz6, entre no modo de substituição com a tecla r e depois use Ctrl-v. O dz6 suporta colar textos como "B0B0" ou "B0 B0" (bytes separados por espaços).

Calculadora

Na visão Hex no modo normal, ou na visão Text, você pode abrir a calculadora com a tecla =. Além exibir resultados em diferentes bases, essa calculadora é integrada ao editor, de modo que as seguintes variáveis podem ser utilizadas nas expressões calculadas:

Variável Descrição
@b O valor sem sinal do byte sob cursor
@B O valor com sinal do byte sob cursor
@w O valor sem sinal da word de 2 bytes lida sob cursor
@W O valor com sinal da word de 2 bytes lida sob cursor
@d O valor sem sinal da dword (double word) de 4 bytes lida sob cursor
@D O valor com sinal da dword (double word) de 4 bytes lida sob cursor
@q O valor sem sinal da qword (quad word) de 8 bytes lida sob cursor
@Q O valor com sinal da qword (quad word) de 8 bytes lida sob cursor
@o O valor da posição atual na visão hexa (offset atual)
@O O valor da posição visitada anteriormente na visão hexa (offset atual)

Aparência

As seguintes opções controlam a aparência do dz6:
Comando Descrição
:set byteline <número> Número de bytes por linha na visão hexa. O padrão é 16, mas você pode escolher qualquer outro número entre 1 e 64 ou configurar para auto -- calculado de acordo com o tamanho da janela.
:set ctrlchar <caractere> Configura o caractere para ser exibido no dump ASCII (coluna da direita da visão hexa) quando o byte equivalente for um caractere de controle ASCII, ou seja, não for um caractere imprimível. A maioria dos editores hexa usam um ponto, mas você pode definir um espaço em branco por exemplo com :set ctrlchar ' '.
:set dimctrl Esmaece todos os caracteres ASCII de controle e não só os bytes nulos.
:set dimzero Esmaece somente os bytes nulos (padrão).
:set nodim Desabilita o esmaecimento de caracteres.
Alt-h Realça todos os bytes iguais ao byte sob o cursor. Você pode realçar quantos bytes diferentes quiser. Para remover um realce, basta posicionar o cursor sobre um byte realçado e realçar de novo.
:set theme dark Tema escuro padrão.
:set theme light Tema claro.

Sair do dz6

Em teoria, sair do dz6 envolve entrar no modo de comando, digitar o comando para sair e pressionar Enter. Na prática, a partir do modo normal, é só digitar :q e apertar Enter, assim como no Vim. A lista completa de maneiras de sair do dz6 é a seguinte:

Comando Descrição
:q Sai do dz6 sem salvar nem o arquivo nem o banco de dados.
:wq Salva o arquivo (se houver permissão de escrita) e o banco dados. Depois sai do dz6. Perceba que é possível usar :wq para salvar um banco de dados para o arquivo (que contém os comentários, favoritos, etc) mesmo que este tenha sido aberto em modo somente leitura.
:x O mesmo que :wq.

Arquivo de inicialização

Ao iniciar, o dz6 tentar busca um arquivo .dz6init na pasta $HOME ou %USERPROFILE% (no Windows) com comandos do modo de comandos para iniciar. Por exemplo, se o conteúdo deste arquivo for como o abaixo, o dz6 vai sempre iniciar com o tema claro e com o número de bytes por linha na visão hexa sempre ajustado ao tamanho da janela:

set theme light
set byteline auto

É possível usar qualquer comando válido, um por linha, neste arquivo de inicialização.

Casos de uso

Ir até o offset 0x100 do arquivo

A partir da visão hexa, em modo NORMAL, basta comandar :100 e pressionar Enter. Isso faz com o que o dz6 entre no modo de comando e leia o comando "100". Um comando numérico basicamente pede ao dz6 para te levar até uma posição no arquivo (que chamamos de file offset em inglês). Como o padrão é hexadecimal, digitar :100 faz você navegar até a posição 0x100 do arquivo. Se você quiser o centésimo byte, ou seja, informar a posição em decimal, basta usar :100t (o sufixo t é para decimal).

Zerar 32 bytes a partir da posição 0x50

A ideia é zerar os bytes de 50 até 6F, totalizando 32 bytes. Bem, há mais de uma maneira. Uma é comandar :50 para ir até o offset 50. Depois, pressionar v para entrar no modo de seleção, tecla j duas vezes para selecionar as duas linhas de bytes (assumindo linhas com 16 bytes), depois h para voltar uma posição e então teclar z.

Uma outra é com o comando :sel 50 31t e depois teclar z para zerá-los.

Buscar e substituir uma string

Suponha que você queira encontrar o texto "secreto" num arquivo. Abra-o no dz6 e pressione /. Digite o texto "secreto" (sem aspas) e então aperte Enter. Se o texto existir, o dz6 te leva até a posição dele.

Após encontrá-lo, pressione r, depois Tab. Escreva o novo texto e pressione Enter. Depois é só salvar com :w ou salvar e sair com :wq (ou :x).

Alternativamente, você pode listar as strings do arquivo com s, depois pressionar f para filtrar e digitar a palavra "secreto", ou uma expressão regular com um pedaço dela, tipo secr.* ou só secr.

Buscar um número inteiro

Ainda não há suporte para busca direta de inteiros, mas você sempre pode abrir a busca de bytes com / e depois Tab. Aí é só digitar o número com o endianness correto. Por exemplo, se for o número 2025 (ano de lançamento do dz6) em 16-bits numa arquitetura little-endian, será e907. Aperte Enter. Se o número existir, o dz6 te leva até ele. Caso contrário, exibe uma mensagem de erro.

Banco de dados

Quando você adiciona uma posição aos favoritos ou adiciona um comentário e salva as alterações, o dz6 cria um arquivo com o mesmo nome do arquivo aberto no dz6, mas com a extensão .dz6. Este arquivo serve como um banco de dados para que o dz6 restaure os favoritos e comentários para este arquivo quando ele for aberto novamente.

O dz6 tenta primeiro salvar o banco de dados na mesma pasta onde o arquivo aberto está. Caso não consiga, salva na pasta atual donde o programa foi invocado. De modo análogo, ao abrir um arquivo, o dz6 tenta ler o banco de dados referente àquele arquivo, ou seja, um arquivo de mesmo nome, mas com a extensão .dz6, do mesmo diretório onde o arquivo está e, caso falhe, tenta ler do diretório atual. nome

Na prática, se quiser passar seus comentários e favoritos para outras pessoas, é só entregar junto ao arquivo o .dz6 dele.

Internamente, o banco de dados é um simples arquivos de texto no formato TOML.

Perguntas frequentes

1. Como o dz6 se difere de outros editores hexadecimais?

Cada editor tem suas vantagens e desvantagens, embora tudo isso tenha a ver com questões de gosto e necessidades. O dz6 roda direto do terminal com uma interface textual. Isso dá velocidade pois tudo o que você vê no dz6 são apenas caracteres. Além disso, dá a comodidade de não precisar sair do terminal para editar um arquivo.

Outra característica importante é a inspiração no Vim. Quem já conhece Vim não terá problemas em usar o dz6 na sua forma mais básica. Quem não conhece Vim, vai acabar aprendendo o básico ao usar o dz6. Todo mundo ganha. :)

Mas há limitações também. Editores hexadecimais "maiores" provavelmente possuem mais recursos que o dz6, que foi pensado para ser "rápido e rasteiro" e não para ser uma grande plataforma de engenharia reversa.

2. Por que Enter para alternar entre as visões disponíveis?

O conceito de visões veio dos modos do Hiew e nele a tecla de atalho para alternar entre os modos é o Enter, além de F4.

3. Por que o dz6 não usa as teclas de função (F1, F2, etc) como o Hiew?

Para facilitar o uso em laptops que, para acionar estas teclas, precisam que a pessoa pressione alguma outra, tipo a tecla Fn. No entanto, de vez em quando ainda penso em por suporte a essas teclas de função, mas desisto logo. Se você acha que é importante, abra uma discussão no GitHub.

4. Todos os comandos do Vim são suportados?

Não. O Vim faz coisas que o dz6 não faz e vice-versa. Além disso, alguns comandos se comportam de maneira diferente no Vim e no dz6, mas em geral, sem prejuízo para quem os usa. Um exemplo é a tecla r, que no Vim permite substituir apenas um caractere, mas no dz6 faz entrar em modo de substituição para sobrescrever vários bytes, o que seria equivalente ao comando R do Vim.

5. Como usar a tecla Alt no terminal do Mac?

Se você usa o iTerm2, pode ir em Settings → Profiles → (seu perfil) → Keys e configurar a tecla Left Option para Esc+. Isso vai fazer com que a tecla Option funcione como o Alt no iTerm2.

História

Em 26 de fevereiro de 2025, um grupo de pesquisadores da Mente Binária, uma ONG brasileira de ensino e pesquisa em segurança da informação, começou a discutir sobre a necessidade de um editor hexadecimal que fosse rápido e cheio de recursos úteis como o Hiew, mas que funcionasse no Linux. Além disso, eles estavam afim de aprender a programar em Rust. Dessa conversa participaram Fernando Mercês, Bruno Trevizan e Leandro Fróes. Eles chegaram a desenvolver um visualizador hexadecimal de linha de comando em Rust, que chamaram de rh. Este foi o primeiro passo na direção de começar a construir a interface textual para o futuro dz6. No entanto, por falta de tempo livre (sempre o capitalismo amassando geral né?), o trio não conseguiu dar sequência ao projeto.

Em junho do mesmo ano, quando o Fernando Mercês estava prestes a iniciar numa nova empresa onde trabalharia com Rust, decidiu iniciar o desenvolvimento do editor para ter um projeto no qual poderia treinar programação nessa linguagem. Em novembro de 2025 veio o primeiro lançamento público da ferramenta.

De lá pra cá, o dz6 evoluiu bastante. Recebeu contribuições, menções e reúne cada vez mais pessoas interessadas na arte da engenharia reversa e na inspeção de arquivos.