Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Introdução

v0.8.0

Um editor hexadecimal é um software para visualizar e editar arquivos de qualquer tipo (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, ou seja, de seu conteúdo.

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. Para quem tem o costume de trabalhar no terminal, usar um editor sem precisar sair da janela do terminal se torna muito conveniente.

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.

Filosofia

A filosofia de desenvolvimento e concepção do dz6 é sustentada em quatro pilares:

Velocidade

O dz6 é rápido. Abrir um arquivo nele é um processo instantâneo, mesmo com arquivos enormes. A navegação também é muito rápida: ao invés de clicar em vários menus para inspecionar uma determinada posição num arquivo, com o dz6 você provavelmente vai usar uma tecla ou um comando para atingir o mesmo objetivo mais rapidamente.

Flexibilidade

Não importa se você usa Windows, macOS, Linux ou BSD, o dz6 funciona igual. Por rodar no terminal, você também pode utilizá-lo remotamente normalmente (por exemplo, quando conectado num servidor via SSH). Ele também funciona em janelas bem pequenas, maximizando a flexibilidade quando operado em terminais pequenos ou em áreas de trabalhos com muitas janelas.

Recursos

Embora haja vários recursos no dz6, nenhum recurso entra se ele não se fizer necessário. E os recursos são pensados por quem utiliza editores hexadecimais há décadas, ou seja, com base na experiência. Na prática, a gente converte técnicas de análise de arquivos em recursos úteis no dz6.

Organicidade

Assim como este texto, o dz6 é programado por pessoas, não por máquinas. Embora modelos de linguagem sejam bons para gerar códigos, no dz6 escrevemos o código nós mesmo porque queremos sentir que um determinado recurso está exatamente do jeito que pensamos que deveria ficar. Acreditamos que essa intenção é transmitida para quem usa.

Pronto/a para inciar a jornada? Aperte o cinto que vamos acelerar agora!

Instalação

Existe mais de uma maneira de instalar o dz6 no 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, digitar winget install dz6, apertar Enter e seguir as instruções.

Quem usa Scoop pode comandar: scoop install dz6.

Se sua versão do Windows não possui WinGet nem Scoop, você pode instalar um deles e seguir os passos acima ou ir em releases e baixar o arquivo dz6-x86_64-pc-windows-msvc.zip. Após descompactar, o comando dz6 ficará disponível a partir da pasta onde você descompactou.

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, BigLinux e Debian Sid). 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 ~/Downloads, basta fazer no terminal:

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

macOS

Se você usa o Homebrew, pode fazer: brew install dz6.

Alternativamente, baixe o arquivo dz6-x86_64-apple-darwin.tar.xz para Macs com processador Intel. Se o seu Mac tiver um processador 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 da última versão estável 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.

Compilando a partir do código-fonte

Todos os métodos acima devem instalar a última versão estável do dz6. Caso queira testar os recursos ainda não lançados, você pode compilar a partir do código-fonte (vai precisar de Git e Cargo) instalados:

cargo install --git https://github.com/mentebinaria/dz6.git dz6

Convenções

Antes de continuar, é importante que você se familiarize com os termos e convenções utilizados neste manual. Vamos lá!

Posição é o mesmo que file offset

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 se trata de uma posição num arquivo.

Teclas

No dz6, utilizamos teclas do teclado para muitas coisas. Por exemplo, assim que você abre um arquivo no editor, pode apertar a tecla G para ir para o último byte do arquivo. Para voltar para o início, basta apertar g.

Perceba que, quando escrevemos G, nos referimos ao “G maiúsculo”. Na prática, com o CAPS LOCK desabilitado, isso vai significar segurar a tecla Shift e apertar a tecla g.

Comandos

Comandos são palavras que você digita no modo COMMAND (cobriremos os modos de operação em breve). Por exemplo, o comando :set theme light orienta o dz6 a ativar o tema claro. Vamos entender o que este comando faz por partes:

:
Quando você digita :, o dz6 entra no modo COMMAND. Na real, este caractere não faz parte do comando. Ele apenas informa ao dz6 que o que virá é um comando.
set
Este é o comando propriamente dito. O comando set altera o valor de alguma variável de configuração no dz6.
theme
A variável que será alterada. No caso, a variável que configura o tema utilizado pela aplicação.
light
O novo valor para a variável tema.

O comando set, quando utilizado para alterar uma variável, requer dois argumentos: o nome da variável e seu novo valor. Existem outros comandos que requererem menos argumentos. Por exemplo, o comando :q não requer nenhum argumento. Ele sai do dz6.

Abrir arquivos

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. Neste caso, o dz6 vai mostrar o indicador [RO] (de read-only)ao lado do nome do arquivo no canto inferior esquerdo:

Você também pode pedir ao dz6 para abrir o arquivo em modo somente leitura, mesmo que você tenha permissão de escrita. Para isso, basta adicionar a opção -r antes do nome do arquivo:

dz6 -r /bin/ls

Visões

São jeitos diferentes de olhar para um arquivo. O dz6 conta com três visões diferentes. A tecla Tab circula entre elas.

Hex

Esta é a visão padrão do dz6, que concentra a maior parte dos recursos. É a visão esperada pela maioria das pessoas que quer utilizar um editor hexadecimal. Nela, os bytes do arquivo são mostrados em hexadecimal.

Nesta tela, em azul acima temos uma régua que vai de 00 a 0F. Aliada às posições em azul na coluna à esquerda, podemos saber rapidamente e posição de um determinado byte. Por exemplo, na posição 18 (interseção da “linha” 00000010 com a “coluna” 08), temos o byte 40. Tudo em hexadecimal.

A parte central mostra o conteúdo do arquivo em hexadecimal, ou seja, seus bytes.

À direita temos a representação textual dos bytes exibidos no centro. Quando não há representação textual, por padrão o dz6 exibe um caractere ., mas algumas pessoas preferem exibir um espaço em branco. Experimente fazer :set ctrlchar ' ' para ver este efeito.

Na parte de baixo da tela há duas barras. A primeira, informativa, exibe nome do arquivo aberto (putty.exe), modo de operação atual (NORMAL), uma sequência de oito travessões que significa que não temos nenhuma posição favoritada, o tipo de arquivo (PE), a posição atual do cursor (00000000) e o percentual do cursor atual em relação ao tamanho total do arquivo (0%).

A segunda barra, logo abaixo da primeira, está vazia na captura de tela, mas é ali que comandos são digitados, buscas são feitas, etc.

Text

Nesta visão você olha para o arquivo como se ele fosse texto. Ela é útil para ter uma ideia dos bytes que possuem equivalência textual no arquivo, ou para inspecionar arquivos de texto mesmo.

Um detalhe importante é que esta visão é somente leitura, ou seja, não é possível editar o texto diretamente por ela. A edição acontece na visão Hex, explicada anteriormente.

Em termos de teclas, a única disponível no momento é a tecla e, que serve para escolher a codificação utilizada para decodificar o texto (UTF-8, ISO-8859-1, etc).

Esta visão está em fase de testes e não recebeu muita atenção ainda.

Esta é uma visão que te dá superpoderes ao abrir no dz6 arquivos executáveis, bibliotecas ou códigos-objeto do tipo Portable Executable (PE) ou Extensible Linkable Format (ELF). Ela interpreta os cabeçalhos destes tipos de arquivo e te permite navegar sobre eles com as teclas de navegação.

Para alternar entre as abas, você pode usar as teclas numéricas (de 1 a 8 no exemplo acima, já que há oito abas) ou as teclas de navegação para a esquerda ou direita (h e l, respectivamente).

Para campos dos cabeçalhos que fazem sentido, se você apertar Enter, o dz6 te leva para o valor do campo na visão Hex.

Por fim, mas não menos importante, às vezes é mais prático saber o valor de um campo em decimal. Você até pode chamar a calculadora para resolver isso, mas também pode apertar b para alternar base numérica de exibição desta visão entre decimal e hexadecimal.

Embora teclar Tab seja conveniente, é possível mudar a visão através do comando set atribuindo um novo valor à variável view. Por exemplo, o comando :set view text vai para a visão Text. Valores possíveis incluem hex e header.

Modos

Além das visões, o dz6 possui modos de operação. Os modos definem onde o que você digita tem efeito. Eles podem estar disponíveis em visões específicas ou serem modos globais, disponíveis em todas as visões, como é o caso dos modos NORMAL e COMMAND.

NORMAL
O modo normal no qual o dz6 inicia. A partir dele, é entrar em outros modos. A partir dos outros modos, Esc sempre volta para o modo NORMAL.
COMMAND
Modo de comando acionado ao teclar :. Veja uma lista completa de comandos aqui.
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 e para marcar blocos. É acionado com a tecla v.
REPLACE
Modo de substituição para editar os bytes do arquivo.

Navegação

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

Tecla(s) / ComandoDescrição
h, j, k, lNavega uma posição para a esquerda, baixo, cima e direita, respectivamente. Também é possível usar as setas do teclado, claro.
0Vai para o primeiro byte da linha atual. Alternativa: Home.
$Vai para o último byte da linha atual. Alternativa: End.
Ctrl-fAvança uma página. Alternativa: PgDown.
Ctrl-bRetrocede uma página. Alternativa: PgUp.
gVai para o primeiro byte do arquivo. Alternativa: Ctrl-Home.
GVai para o último byte do arquivo. Alternativa: Ctrl-End.
oVai para o próximo byte diferente do byte sob o cursor.
OVai para o byte anterior diferente do byte sob o cursor.
BackspaceVolta para a última posição visitada.
:posVai 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.

Busca

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

Tecla(s)Descrição
/Entra no modo SEARCH/UTF-8. Ao digitar um texto e apertar Enter, o dz6 o procura no arquivo e vai para a posição dele, caso encontre. Para alternar entre os modos de busca, use Tab. Além de SEARCH/UTF-8, o dz6 suporta SEARCH/HEX para busca de sequências e padrões de bytes hexa.
?Tem o mesmo efeito de /, mas a direção da busca é reversa.
nRepete uma busca e vai para próxima ocorrência do resultado, se houver.
NRepete uma busca e vai para a ocorrência anterior do resultado, se houver.
sExibe 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 / te permite aplicar um filtro de expressão regular sobre elas.
EscCancela a operação de busca e volta para o modo NORMAL.

Padrões hexa

v0.8.0

No modo SEARCH/HEX, você pode usar ?? para casar com um byte de qualquer valor entre 00 e FF. Por exemplo, /f0??ca vai buscar por uma sequência iniciada por F0, seguida de um byte de qualquer valor, seguida do byte CA.

Opções

As seguintes variáveis alteram o comportamento da busca:

OpçãoAliasDescrição
wrapscanwsWrap na busca. Com esta opção ativa, o dz6 volta ao primeiro resultado da busca após o último.
ignorecaseicIgnora maiúsculas e minúsculas no modo SEARCH/UTF-8.
smartscanscsDesativa temporariamente ignorecase se o termo buscado possuir letras maiúsculas.

Para ativar as opções acima, use o comando set. Por exemplo:

:set wrapscan

Para desativar, prefixe-as com no. Exemplo:

:set noic

Estas opções estão desativadas por padrão, mas você pode adicionar qualquer comando num arquivo de inicialização do dz6 para definir um novo padrão mais ajustado ao seu fluxo de trabalho e preferências.

Favoritos

Na visão Hex, 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..8Vai para o favorito desejado. Por exemplo, Alt-1 vai para o primeiro favorito adicionado.
-Vai para o último favorito adicionado.
Alt-MenosRemove o último favorito adicionado.
Alt-0Remove todos os favoritos.

As posições favoritadas são salvas no banco de dados. Desta forma, quando você abrir o arquivo novamente, elas estarão lá.

Comentários

Um dos recursos mais úteis do dz6 são os comentários que você pode adicionar nas posições, na visão Hex. Comentários são como favoritos, mas você pode escrever o que quiser neles. Assim como os favoritos, eles também ficam salvos no banco de dados criado especificamente para o arquivo aberto.

Uma outra diferença importante em relação aos favoritos é que não há limite para o número de comentários adicionados no arquivo.

As seguintes teclas e comandos gerenciam os comentários:

Tecla(s) / ComandoDescriçã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-nAbre 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 comentada.

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

Blocos

>= v0.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:

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.

Os blocos são salvos no banco de dados também. Assim, quando reabrir o 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

A partir da visão Hex, as combinações de teclas listadas abaixo põem o dz6 no modo REPLACE. Com elas, é possível alterar o byte sob o cursor. Para que elas funcionem, é necessário ter permissão de escrita no arquivo.

Tecla(s)Descrição
Ctrl-aIncrementa o byte sob o cursor.
Ctrl-xDecrementa o byte sob o cursor.
zZera o byte sob o cursor.
~Se o byte estiver na faixa alfabética da tabela ASCII, inverte o caso dele.
rEntra 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 das teclas acima, as seguintes teclas extras estão disponíveis:

Tecla(s)Descrição
nAltera 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.
tTrunca 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.
TTrunca 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.
EscVolta ao modo NORMAL, mantendo as alterações feitas em modo REPLACE. Você pode desafazê-las com a tecla u.
EnterSalva as alterações no buffer (mas ainda não salva no arquivo).

Bytes alterados são destacados até que as alterações sejam salvas no arquivo em disco com :w. A cor de destaque depende do tema.

De volta ao modo NORMAL, os seguintes comandos e teclas controlam as alterações feitas no modo REPLACE:

Comando / Tecla(s)Descrição
uDesfaz as alterações uma a uma.
:wSalva as alterações no arquivo.
:wqSalva 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, aperte a tecla v, selecione os bytes desejados com as teclas de navegação e depois use z, ~ ou n.

Copiar e colar

Para copiar uma sequência de bytes, a partir da visão Hex, entre no modo SELECT com v e depois use y para copiá-los.

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 REPLACE com a tecla r e depois use Ctrl-v. O dz6 suporta colar textos como “B0B0” ou “B0 B0” (bytes separados por espaços).

O dz6 roda no terminal e tudo o que você vê em sua tela é texto. Sendo assim, você também pode selecionar e copiar qualquer coisa na tela com o mouse.

Calculadora

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

VariávelDescrição
@bValor sem sinal do byte sob cursor
@BValor com sinal do byte sob cursor
@wValor sem sinal da word de 2 bytes com início sob o cursor
@WValor com sinal da word de 2 bytes com início sob o cursor
@dValor sem sinal da dword (double word) de 4 bytes com início sob o cursor
@DValor com sinal da dword (double word) de 4 bytes com início sob o cursor
@qValor sem sinal da qword (quad word) de 8 bytes com início sob o cursor
@QValor com sinal da qword (quad word) de 8 bytes com início sob o cursor
@oValor da posição atual na visão hexa
@OValor da posição visitada anteriormente na visão hexa

Aparência

As seguintes opções controlam a aparência do dz6. Com exceção das opções de tema, essas opções só têm efeito na visão Hex.

Comando / Tecla(s)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 usa um ponto, mas você pode definir um espaço em branco, por exemplo, com :set ctrlchar ' '.
:set dimctrlEsmaece todos os caracteres ASCII de controle, não só os bytes nulos.
:set dimzeroEsmaece somente os bytes nulos (padrão).
:set nodimDesabilita o esmaecimento de caracteres.
Alt-hRealç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 darkHabilita o tema escuro (padrão).
:set theme lightHabilita o tema claro.

Sair do dz6

Em teoria, sair do dz6 envolve entrar no modo COMMAND, 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:

ComandoDescrição
:qSai do dz6 sem salvar nem o arquivo nem o banco de dados.
:wqSalva 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.
:xO mesmo que :wq.

Arquivo de inicialização

Toda vez que o dz6 inicia, ele busca um arquivo .dz6init no diretório $HOME ou %USERPROFILE% (no Windows) com comandos para executar. Por exemplo, se o conteúdo deste arquivo for como o abaixo, o dz6 vai sempre iniciar com o tema claro e com a opção de ignorar maiúsculas e minúsculas na busca ativada:

# configura o tema claro
set theme light
set ignorecase # ignorar o caso na busca

É possível usar qualquer comando válido, um por linha, neste arquivo de inicialização. Neste arquivo, um caractere # define um comentário até o final da linha.

Banco de dados

Quando você adiciona uma posição aos favoritos, adiciona um comentário ou define blocos 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 esses dados quando o arquivo 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.

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

Você não precisa se preocupar com isso, mas o banco de dados é um simples arquivos de texto no formato TOML. Por exemplo, o banco de dados abaixo possui uma posição favoritada, dois blocos definidos e um comentário:

bookmarks = [1286656]

[[blocks]]
start = 1286436
end = 1286438
bg_color = 1702192276
fg_color = 3190239820

[[blocks]]
start = 1286472
end = 1286474
bg_color = 2478229751
fg_color = 3070563780

[comments]
120 = "meu byte preferido!"

Casos de uso

Ir até o offset 0x100 do arquivo

A partir da visão Hex, no 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 a tecla s, depois pressionar / 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.

Teclas

Globais

As seguintes teclas funcionam em qualquer visão:

Tecla(s)Descrição
TabAlterna entre as visões
:Entra no modo COMMAND
=Abre a calculadora

Modo COMMAND

Tecla(s)Descrição
:Entra no modo COMMAND
=Abre a calculadora
EnterExecuta o comando
EscVolta para o modo NORMAL

Calculadora

Tecla(s)Descrição
EnterEfetua o cálculo
EscFecha a calculadora
Seta para baixoAvança no histórico
Seta para cimaRetrocede no histórico

Visão Hex

Modo NORMAL

Tecla(s)Descrição
[Vai para o o bloco anterior
]Vai para o próximo bloco
$Move o cursor para o fim da linha
0Move o cursor para o início da linha
BackspaceVolta para a última posição visitada
Ctrl+bRetrocede uma página
Ctrl+fAvança uma página
dAvança quatro bytes
DRetrocede quatro bytes
EndMove o cursor para o fim da linha
HomeMove o cursor para o início da linha
jAvança byteline bytes
jMove o cursor um byte para trás
kRetrocede byteline bytes
NVai para a ocorrência anterior da última busca realizada
nVai para a próxima ocorrência da última busca realizada
OVai para o byte anterior diferente do byte sob o cursor
oVai para o próximo byte diferente do byte sob o cursor
PgDownAvança uma página
PgUpRetrocede uma página
qAvança oito bytes
QRetrocede oito bytes
sExibe uma lista de strings do arquivo
wAvança dois bytes
WRetrocede dois bytes

Favoritos

Tecla(s)Descrição
-Vai para o último favorito adicionado
+Favorita a posição sob o cursor
Alt-0Apaga todos os favoritos
Alt-1Vai para a posição favorita 1
Alt-2Vai para a posição favorita 2
Alt-3Vai para a posição favorita 3
Alt-4Vai para a posição favorita 4
Alt-5Vai para a posição favorita 5
Alt-6Vai para a posição favorita 6
Alt-7Vai para a posição favorita 7
Alt-8Vai para a posição favorita 8
Alt-MenosRemove o último favorito adicionado

Comentários

Tecla(s)Descrição
;Adiciona ou edita um comentário da posição sob o cursor
Alt+nExibe a janela Names, que contém os comentários

Mudança de modo

Tecla(s)Descrição
?Entra no modo SEARCH/UTF-8 (busca para trás)
/Entra no modo SEARCH/UTF-8 (busca para frente)
rEntra no modo REPLACE
vEntra no modo SELECT

Edição rápida

Tecla(s)Descrição
~Inverte o caso se o byte representar letra em ASCII
Ctrl-aIncrementa o byte sob o cursor
Ctrl-xDecrementa o byte sob o cursor
uDesfaz a última alteração
zZera o byte sob o cursor

Outros

Tecla(s)Descrição
Alt+hRealça todas as ocorrências do byte sob o cursor
Alt+mConfigura uma cor aleatória para um bloco

Modo REPLACE

Tecla(s)Descrição
~Inverte o caso se o byte representar letra em ASCII
EnterSalva as alterações no buffer
EscVolta para o modo NORMAL
nSubstitui o byte sob o cursor por 90 (NOP em x86)
tTrunca o arquivo na posição atual, que passa a ser o fim dele
TTrunca o arquivo na posição atual, que passa a ser o início dele
zZera o byte sob o cursor
Tecla(s)Descrição
/Alterna entre os modos SEARCH/UTF-8 e SEARCH/HEX
EnterInicia a busca
EscAborta a busca e volta para o modo NORMAL

Modo SELECT

Tecla(s)Descrição
~Inverte o caso de todos os bytes selecionados quando aplicável
EscAborta a seleção e volta para o modo NORMAL
nSubstitui todos os bytes sob o cursor por 90 (NOP em x86)
yCopia os bytes selecionados para a área de transferência
zZera todos os bytes selecionados

Visão Header

Modo NORMAL

Tecla(s)Descrição
1Vai para a primeira aba
2Vai para a segunda aba
3Vai para a terceira aba
4Vai para a quarta aba
5Vai para a quinta aba
6Vai para a sexta aba
7Vai para a sétima aba
8Vai para a oitava aba
9Vai para a nona aba
bAlterna a base de exibição entre decimal e hexa
Ctrl-bVai para a primeira linha
Ctrl-fVai para a última linha
EndMove o cursor para o fim da linha
EndVai para a última linha
EnterSegue o valor do campo sob o cursor na visão Hex
gVai para a primeira linha
gVai para a última linha
hVai para a aba à esquerda
HomeMove o cursor para o início da linha
HomeVai para a primeira linha
jDesce uma linha
kSobe uma linha
lVai para a aba à direita

Comandos

Todos os comandos são globais, ou seja, funcionam independente da visão atual.

ComandoArgumento(s)DescriçãoExemplo(s) de uso
-deltaRetrocede delta bytes:-10, :-16t
+deltaAvança delta bytes:+10, :-16t
cmtposição comentárioComenta a posição atual:cmt 100 "meu comentário"
posiçãoVai para a posição posição:10, :16t
qSai do dz6:q
selinício tamanhoSeleciona tamanho bytes a partir de início:sel 10 a
setvariável [valor]Configura uma variável do dz6:set ignorecase
wSalva alterações e/ou banco de dados
wqSalva alterações e/ou banco de dados e sai:wq
xSalva alterações e/ou banco de dados e sai:x

O sufixo t diz ao dz6 que a base numérica está em decimal.

Em comandos que recebem argumentos de texto de tamanho variável, o uso de aspas simples ou duplas é obrigatório se o texto contiver espaço:

  • :cmt 10t décimo – certo
  • :cmt 10t décimo byte – errado
  • :cmt 10t 'décimo byte' – certo
  • :cmt 10t "décimo byte" – certo

Variáveis

As seguintes variáveis podem ser controladas com o comando set:

VariávelArgumento(s)DescriçãoValor padrãoExemplo de uso
bytelinenúmero|"auto"Quantidade de bytes por linha ou auto para o máximo da tela16:set byteline 32
ctrlchar"caractere"Caractere a ser exibido para bytes sem representação gráfica".":set ctrlchar " "
dbHabilita o uso de banco de dadostrue:set db
dimctrlHabilita o esmaecimento de bytes sem representação gráficafalse:set dimctrl
dimzeroHabilita o esmaecimento de bytes nulostrue:set dimzero
ignorecase/icHabilita a busca que não diferencia maiúsculas e minúsculasfalse:set ic
nodimDesabilita o esmaecimentofalse:set nodim
smartcase/scsHabilita a busca inteligentefalse:set scs
theme"dark"|"light"Tema"dark":set theme dark
view"hex"|"text"|"view"Altera"hex":set view text
wrapscan/wsHabilita o wrap na buscafalse:set ws

As variáveis do tipo booleanas (true ou false) podem ser desabilitadas com o prefixo no. Por exemplo, :set nows desabilita o wrap na busca.

Você pode sobrepor os valores padrão destas variáveis com o uso do arquivo de inicialização.

Perguntas frequentes

Como o dz6 se compara com 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 complexa plataforma de engenharia reversa.

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

Porque queremos facilitar o uso em laptops onde, para acionar estas teclas, é necessário que a pessoa pressione alguma outra, tipo a tecla Fn. Outro motivo são a popularização dos teclados com menos teclas: os chamados teclados 65% ou menos tendem a não ter as teclas de função.

Pelo mesmo motivo temos alternativas a teclas como Home, End, PgUp e PgDown são sempre alternativas.

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 muito 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.

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.