Introdução
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
setaltera 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.
Header
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
Tabseja conveniente, é possível mudar a visão através do comandosetatribuindo um novo valor à variávelview. Por exemplo, o comando:set view textvai para a visão Text. Valores possíveis incluemhexeheader.
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,
Escsempre 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
Taba 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) / 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 | Avança uma página. Alternativa: PgDown. |
Ctrl-b | Retrocede 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 | Volta 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 é somenteg.
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. |
n | Repete uma busca e vai para próxima ocorrência do resultado, se houver. |
N | Repete uma busca e vai para a ocorrência anterior do resultado, se houver. |
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 / te permite aplicar um filtro de expressão regular sobre elas. |
Esc | Cancela 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ção | Alias | Descrição |
|---|---|---|
wrapscan | ws | Wrap na busca. Com esta opção ativa, o dz6 volta ao primeiro resultado da busca após o último. |
ignorecase | ic | Ignora maiúsculas e minúsculas no modo SEARCH/UTF-8. |
smartscan | scs | Desativa 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..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. |
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) / 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 comentada.
Mesmo que o dz6 esteja trabalhando no modo somente leitura, os comentários são salvos no banco de dados ao comandar
:w,:wqou:xe 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-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 das teclas acima, as seguintes teclas 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, mantendo as alterações feitas em modo REPLACE. Você pode desafazê-las com a tecla u. |
Enter | Salva 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 |
|---|---|
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, aperte a tecla
v, selecione os bytes desejados com as teclas de navegação e depois usez,~oun.
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ável | Descrição |
|---|---|
@b | Valor sem sinal do byte sob cursor |
@B | Valor com sinal do byte sob cursor |
@w | Valor sem sinal da word de 2 bytes com início sob o cursor |
@W | Valor com sinal da word de 2 bytes com início sob o cursor |
@d | Valor sem sinal da dword (double word) de 4 bytes com início sob o cursor |
@D | Valor com sinal da dword (double word) de 4 bytes com início sob o cursor |
@q | Valor sem sinal da qword (quad word) de 8 bytes com início sob o cursor |
@Q | Valor com sinal da qword (quad word) de 8 bytes com início sob o cursor |
@o | Valor da posição atual na visão hexa |
@O | Valor 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 dimctrl | Esmaece todos os caracteres ASCII de controle, 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 | Habilita o tema escuro (padrão). |
:set theme light | Habilita 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:
| 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
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 |
|---|---|
Tab | Alterna entre as visões |
: | Entra no modo COMMAND |
= | Abre a calculadora |
Modo COMMAND
| Tecla(s) | Descrição |
|---|---|
: | Entra no modo COMMAND |
= | Abre a calculadora |
Enter | Executa o comando |
Esc | Volta para o modo NORMAL |
Calculadora
| Tecla(s) | Descrição |
|---|---|
Enter | Efetua o cálculo |
Esc | Fecha a calculadora |
| Seta para baixo | Avança no histórico |
| Seta para cima | Retrocede no histórico |
Visão Hex
Modo NORMAL
Navegação
| Tecla(s) | Descrição |
|---|---|
[ | Vai para o o bloco anterior |
] | Vai para o próximo bloco |
$ | Move o cursor para o fim da linha |
0 | Move o cursor para o início da linha |
Backspace | Volta para a última posição visitada |
Ctrl+b | Retrocede uma página |
Ctrl+f | Avança uma página |
d | Avança quatro bytes |
D | Retrocede quatro bytes |
End | Move o cursor para o fim da linha |
Home | Move o cursor para o início da linha |
j | Avança byteline bytes |
j | Move o cursor um byte para trás |
k | Retrocede byteline bytes |
N | Vai para a ocorrência anterior da última busca realizada |
n | Vai para a próxima ocorrência da última busca realizada |
O | Vai para o byte anterior diferente do byte sob o cursor |
o | Vai para o próximo byte diferente do byte sob o cursor |
PgDown | Avança uma página |
PgUp | Retrocede uma página |
q | Avança oito bytes |
Q | Retrocede oito bytes |
s | Exibe uma lista de strings do arquivo |
w | Avança dois bytes |
W | Retrocede dois bytes |
Favoritos
| Tecla(s) | Descrição |
|---|---|
- | Vai para o último favorito adicionado |
+ | Favorita a posição sob o cursor |
Alt-0 | Apaga todos os favoritos |
Alt-1 | Vai para a posição favorita 1 |
Alt-2 | Vai para a posição favorita 2 |
Alt-3 | Vai para a posição favorita 3 |
Alt-4 | Vai para a posição favorita 4 |
Alt-5 | Vai para a posição favorita 5 |
Alt-6 | Vai para a posição favorita 6 |
Alt-7 | Vai para a posição favorita 7 |
Alt-8 | Vai para a posição favorita 8 |
Alt-Menos | Remove o último favorito adicionado |
Comentários
| Tecla(s) | Descrição |
|---|---|
; | Adiciona ou edita um comentário da posição sob o cursor |
Alt+n | Exibe 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) |
r | Entra no modo REPLACE |
v | Entra no modo SELECT |
Edição rápida
| Tecla(s) | Descrição |
|---|---|
~ | Inverte o caso se o byte representar letra em ASCII |
Ctrl-a | Incrementa o byte sob o cursor |
Ctrl-x | Decrementa o byte sob o cursor |
u | Desfaz a última alteração |
z | Zera o byte sob o cursor |
Outros
| Tecla(s) | Descrição |
|---|---|
Alt+h | Realça todas as ocorrências do byte sob o cursor |
Alt+m | Configura uma cor aleatória para um bloco |
Modo REPLACE
| Tecla(s) | Descrição |
|---|---|
~ | Inverte o caso se o byte representar letra em ASCII |
Enter | Salva as alterações no buffer |
Esc | Volta para o modo NORMAL |
n | Substitui o byte sob o cursor por 90 (NOP em x86) |
t | Trunca o arquivo na posição atual, que passa a ser o fim dele |
T | Trunca o arquivo na posição atual, que passa a ser o início dele |
z | Zera o byte sob o cursor |
Modo SEARCH
| Tecla(s) | Descrição |
|---|---|
/ | Alterna entre os modos SEARCH/UTF-8 e SEARCH/HEX |
Enter | Inicia a busca |
Esc | Aborta 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 |
Esc | Aborta a seleção e volta para o modo NORMAL |
n | Substitui todos os bytes sob o cursor por 90 (NOP em x86) |
y | Copia os bytes selecionados para a área de transferência |
z | Zera todos os bytes selecionados |
Visão Header
Modo NORMAL
| Tecla(s) | Descrição |
|---|---|
1 | Vai para a primeira aba |
2 | Vai para a segunda aba |
3 | Vai para a terceira aba |
4 | Vai para a quarta aba |
5 | Vai para a quinta aba |
6 | Vai para a sexta aba |
7 | Vai para a sétima aba |
8 | Vai para a oitava aba |
9 | Vai para a nona aba |
b | Alterna a base de exibição entre decimal e hexa |
Ctrl-b | Vai para a primeira linha |
Ctrl-f | Vai para a última linha |
End | Move o cursor para o fim da linha |
End | Vai para a última linha |
Enter | Segue o valor do campo sob o cursor na visão Hex |
g | Vai para a primeira linha |
g | Vai para a última linha |
h | Vai para a aba à esquerda |
Home | Move o cursor para o início da linha |
Home | Vai para a primeira linha |
j | Desce uma linha |
k | Sobe uma linha |
l | Vai para a aba à direita |
Comandos
Todos os comandos são globais, ou seja, funcionam independente da visão atual.
| Comando | Argumento(s) | Descrição | Exemplo(s) de uso |
|---|---|---|---|
-delta | Retrocede delta bytes | :-10, :-16t | |
+delta | Avança delta bytes | :+10, :-16t | |
cmt | posição comentário | Comenta a posição atual | :cmt 100 "meu comentário" |
posição | Vai para a posição posição | :10, :16t | |
q | Sai do dz6 | :q | |
sel | início tamanho | Seleciona tamanho bytes a partir de início | :sel 10 a |
set | variável [valor] | Configura uma variável do dz6 | :set ignorecase |
w | Salva alterações e/ou banco de dados | ||
wq | Salva alterações e/ou banco de dados e sai | :wq | |
x | Salva alterações e/ou banco de dados e sai | :x |
O sufixo
tdiz 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ável | Argumento(s) | Descrição | Valor padrão | Exemplo de uso |
|---|---|---|---|---|
byteline | número|"auto" | Quantidade de bytes por linha ou auto para o máximo da tela | 16 | :set byteline 32 |
ctrlchar | "caractere" | Caractere a ser exibido para bytes sem representação gráfica | "." | :set ctrlchar " " |
db | Habilita o uso de banco de dados | true | :set db | |
dimctrl | Habilita o esmaecimento de bytes sem representação gráfica | false | :set dimctrl | |
dimzero | Habilita o esmaecimento de bytes nulos | true | :set dimzero | |
ignorecase/ic | Habilita a busca que não diferencia maiúsculas e minúsculas | false | :set ic | |
nodim | Desabilita o esmaecimento | false | :set nodim | |
smartcase/scs | Habilita a busca inteligente | false | :set scs | |
theme | "dark"|"light" | Tema | "dark" | :set theme dark |
view | "hex"|"text"|"view" | Altera | "hex" | :set view text |
wrapscan/ws | Habilita o wrap na busca | false | :set ws |
As variáveis do tipo booleanas (
trueoufalse) podem ser desabilitadas com o prefixono. Por exemplo,:set nowsdesabilita 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.