Decompiler-VB.Net
BR
Entrar
VBReFormer Gen2 Motor reescrito do zero, P-code completo e o estúdio on-line em beta público. Ler o anúncio →
Documentação
VBReFormer Desktop

Manual do VBReFormer Desktop

Manual do usuário do VBReFormer Desktop: instalar, ativar a licença, ler as sete vistas, analisar um binário, exportar um projeto VB6 recarregável no IDE.

Atualizado em 20/09/202614 capítulos

O aplicativo instalado na sua máquina Windows. Ele abre seus executáveis Visual Basic 5 e 6, reconstrói o código-fonte deles e devolve um projeto que o IDE do VB6 consegue reabrir – com a bancada de trabalho completa: bytes, recursos, designer, grafos, referências cruzadas e patches binários.

Nota sobre a tradução. A interface do aplicativo desktop está disponível em inglês, francês e espanhol. Este manual cita os nomes de menus e vistas em inglês, tal como aparecem no aplicativo.

1. Instalação

O VBReFormer Desktop é distribuído como um instalador MSI, um por idioma de interface. O pacote é autocontido: ele incorpora tudo o que precisa, não há nenhum framework a instalar previamente.

requisito
Sistema Windows 10 versão 1607 ou posterior, ou Windows 11
Arquitetura x64
Framework nenhum – o pacote é autocontido
Conexão necessária para a descompilação e a validação da licença
Idiomas da interface inglês, francês, espanhol

Windows XP, Vista, 7 e 8 não são suportados. O aplicativo depende de uma plataforma que exige no mínimo o Windows 10. Se a sua máquina for mais antiga, o VBReFormer Online funciona em qualquer navegador, em qualquer sistema – esse é o caminho recomendado nesse caso.

Onde o motor trabalha

O aplicativo é local; a reconstrução do código, porém, é executada nos nossos servidores. É isso que o nome da edição significa – Desktop + Cloud. Tudo o que é lido do arquivo (o formato, os bytes, a desmontagem, os recursos) é calculado na sua máquina; tudo o que é reconstruído passa pelo serviço.

A caixa Help ▸ About (Ajuda ▸ Sobre) informa a qualquer momento a versão do motor conectado, a versão do contrato e a lista de capacidades servidas (Capabilities served) – útil quando uma função não aparece: se ela não está nessa lista, não é a interface que a recusa.

2. Ativar sua licença

Sem licença, o aplicativo abre e funciona: você pode explorar um binário, ler a desmontagem completa, os bytes, os recursos e o designer. O que a licença desbloqueia é a reconstrução do código VB6 e a exportação do projeto.

Um posto de cada vez

Uma licença VBReFormer abre uma estação de trabalho de cada vez. Se você já a estiver usando em outro lugar, o aplicativo diz isso claramente e oferece duas saídas: transferir a licença para esta máquina a partir da sua conta, ou adicionar um posto.

É uma recusa suave: você pagou, nada está faltando. A mensagem diz isso dessa forma em vez de devolver um erro técnico.

Um navegador aberto no VBReFormer Online também conta como um posto: o estúdio web e o aplicativo desktop consomem a mesma licença.

3. A janela

  1. Abra um binário. File ▸ Open a VB6 binary (Arquivo ▸ Abrir um binário VB6, Ctrl+O). Os formatos aceitos são .exe, .dll, .ocx e .scr. A barra de status mostra a análise em andamento, depois o nome do arquivo e sua forma de compilação – código nativo ou P-code.
  2. Percorra o painel PROJECT. À esquerda, o binário é apresentado do jeito que o VB6 o via: formulários, classes, módulos e seus procedimentos. A árvore é preenchida sob demanda – expandir um nó solicita seus filhos; nada é calculado antecipadamente, o que mantém a abertura rápida mesmo em um executável grande.
  3. Selecione um procedimento. As vistas desse nó aparecem à direita. Se nenhuma vista for servida para um nó, o motivo é escrito na tela em vez de um painel vazio.

Os painéis inferiores

aba para que serve
Output (Saída) o log das operações. Ele conserva o idioma em que cada linha foi escrita, mesmo que você mude o idioma da interface – um log é um registro, não uma exibição.
Diagnostics (Diagnósticos) o que o motor se recusou a fazer, e por quê. O reflexo a ter assim que um resultado surpreender você.
Analyser (Analisador) referências cruzadas: chamadores de um procedimento, ocorrências de um símbolo. O resultado é clicável.

Visibilidade dos membros

Cada membro da árvore traz sua visibilidade tal como o binário a declara – (Public), (Private), (Friend). São palavras-chave do VB6: não são traduzidas. Um membro cuja visibilidade não pôde ser lida não traz marca nenhuma: não escrevemos o que não sabemos.

4. As sete vistas

Elas estão organizadas em três famílias, e essa separação diz de onde vem o que você lê. É a coisa mais útil a entender.

A família “Code” – reconstruída pela análise

vista o que mostra quando consultá-la
Visual Basic 6 o código-fonte reconstruído e estruturado por padrão – é isso que você procura
IR a representação intermediária para ver o que o motor entendeu
Disassembly (Desmontagem) as instruções de máquina x86 para ver o que o processador executa
P-code os opcodes da máquina virtual do VB6 somente binários em P-code

Descer nesta lista é ir em direção à máquina. Na dúvida sobre uma linha: Visual Basic 6 diz a intenção, Disassembly diz o fato.

A família “Project files” – lida, não inferida

Designer (.frm), Project (.vbp) e Structure (Estrutura). Nada aqui passa pela reconstrução de código: tudo foi lido de tabelas do binário, e o que não pôde ser lido é escrito com todas as letras em vez de preenchido. É a família mais confiável do produto, e a que não depende de nenhuma inferência.

A família “Resources”

Veja o capítulo 9.

5. O que a compilação conserva, e o que ela descarta

Este capítulo explica por que algumas partes do seu código voltam quase intactas e outras com nomes técnicos. A regra é simples:

O que o Visual Basic precisa em tempo de execução, ele gravou no arquivo: o VBReFormer o encontra de novo. O que ele não precisava mais depois da compilação, ele descartou – e ninguém consegue recuperar.

O que sobrevive: nomes de formulários, classes e módulos · nomes de controles · manipuladores de eventos · membros públicos das classes · todas as propriedades de interface · chamadas ao runtime do VB (635 funções) · API Win32 (15.680 assinaturas) · a estrutura do código · as strings.

O que não está no arquivo: comentários · nomes de variáveis locais · nomes de parâmetros · constantes nomeadas, substituídas pelo seu valor · nomes de procedimentos em módulos .bas · a indentação original · Option Explicit e os Enum.

A consequência prática. Seus formulários voltam muito legíveis. Seus módulos .bas voltam corretos, mas com nomes técnicos (proc_42C506). A função Rename (Renomear, F2) existe para isso, e ela propaga o novo nome a todos os pontos de chamada do projeto – veja o capítulo 7.

Dois exemplos verificáveis

Os trechos abaixo vêm do SETUP1.EXE, o assistente de instalação distribuído com o Visual Basic 6. A Microsoft distribui seu código-fonte na mesma pasta – assim você pode refazer a comparação por conta própria.

Um procedimento de módulo .bas

Fonte original, COMMON.BAS:

Sub AddDirSep(strPathName As String)
    If Right(Trim(strPathName), Len(gstrSEP_URLDIR)) <> gstrSEP_URLDIR And _
       Right(Trim(strPathName), Len(gstrSEP_DIR)) <> gstrSEP_DIR Then
        strPathName = RTrim$(strPathName) & gstrSEP_DIR
    End If
End Sub

Renderizado pelo VBReFormer:

Public Sub proc_42C506(ByRef arg_8 As String)
    If ((Right(Trim(arg_8), Len("/")) <> "/") And (Right(Trim(arg_8), Len("\")) <> "\")) <> 0 Then
        arg_8 = (RTrim$(arg_8) & "\")
    End If
End Sub

Lógica idêntica, linha por linha. Right, Trim, Len, RTrim$ têm nome; a passagem ByRef é inferida corretamente. Em contrapartida, o nome do procedimento e o do parâmetro se perderam, e as constantes aparecem como seu valor – foi o compilador que as substituiu, não o VBReFormer.

Um manipulador de evento

Fonte original, BEGIN.FRM:

Private Sub cmdExit_Click()
    ExitSetup Me, gintRET_EXIT
End Sub

Renderizado pelo VBReFormer:

Private Sub cmdExit_Click()
    Set var_18 = Me
    basSetup1.proc_41CE2D var_18, var_1C
End Sub

O nome do formulário, o do botão e o do manipulador estão intactos; Me é reconhecido; o módulo chamado tem nome, o que diz aonde ir. Só o procedimento chamado, que vive em um .bas, mantém seu nome de endereço.

Os marcadores

O VBReFormer nunca adivinha. Um valor que não pode ser estabelecido é marcado em vez de inventado – um valor plausível e errado é o pior resultado que um descompilador pode produzir.

marcador significado o que fazer
proc_42C506 procedimento designado pelo seu endereço renomeie-o (F2)
var_18, arg_8 variável local ou parâmetro leia seu uso, depois renomeie
vtbl_3C chamada por tabela virtual não resolvida o Object Browser costuma dizer de que biblioteca se trata
? valor não estabelecido consulte a vista Disassembly no mesmo lugar

Um arquivo que contém um ? será rejeitado pelo IDE do VB6. O marcador está ali para você decidir, não para ser recompilado como está.

6. As ferramentas de análise

É aqui que a edição desktop mais se diferencia: ela oferece uma bancada de trabalho completa, enquanto o estúdio web se concentra em ler, descompilar e exportar.

ferramenta atalho o que ela oferece
Analyse references (Analisar referências) Shift+F12 chamadores de um procedimento, ocorrências de um símbolo – resultado clicável, e a cobertura é quantificada: o que a análise não vê é contado, não silenciado
Symbol list (Lista de símbolos) Ctrl+Shift+S o inventário completo, filtrável por tipo e por escopo – ele distingue os nomes lidos dos nomes sintetizados
Call graph (Grafo de chamadas) Ctrl+Shift+A quem chama o quê, em três escalas, com filtros de chamadores / chamados
Control-flow graph (Grafo de fluxo de controle) Ctrl+Shift+G a forma de um procedimento: blocos, laços, arestas de retorno, blocos inacessíveis
Object Browser (Navegador de objetos) Ctrl+Shift+B “onde isto está definido?”, quando a resposta está fora do binário
API Browser (Navegador de API) Ctrl+Shift+P protótipos, aliases e notas das declarações Win32
Cited libraries (Bibliotecas citadas) Ctrl+K do que o binário depende
Find VB programs (Localizar programas VB) Ctrl+L encontrar os executáveis VB de uma pasta
Find (Localizar) Ctrl+Shift+F busca de texto nas vistas servidas
Bookmarks (Marcadores) Ctrl+F2 marcar lugares e voltar a eles (F8 / Shift+F8)
Back / forward navigation (Navegação para trás / para a frente) Alt+← Alt+→ como em um navegador

Por que a cobertura é quantificada. O grafo de chamadas nativo vê as chamadas diretas; ele não vê as chamadas por tabelas virtuais nem por ponteiros de função. Em vez de apresentar uma lista parcial como completa, o VBReFormer mostra o que ele omite, contado. Você sabe então até que ponto confiar no resultado.

7. Renomear

É o gesto central do trabalho em um binário: o descompilador devolve a lógica, você devolve os nomes. F2 sobre um símbolo, ou a partir da lista de símbolos.

A caixa mostra três coisas que os descompiladores costumam esconder:

  • a origem do nome atual – dado por você, inferido pelo descompilador ou reconstruído;
  • as propostas do descompilador, cada uma com sua prioridade e a fonte de onde vem;
  • o nome original, ao qual você sempre pode voltar.

A renomeação é global. Renomeie um procedimento uma vez, e os pontos de chamada nos outros módulos acompanham – inclusive os que você ainda não abriu.

Uma renomeação recusada é sempre recusada com o seu motivo. Dois casos frequentes: o motor não anuncia a capacidade de renomeação neste documento, ou a vista atual só carrega fragmentos lexicais – o bastante para colorir o texto, não o bastante para designar uma entidade. Nos dois casos, a mensagem diz isso, em vez de não fazer nada.

8. Bytes e patches binários

Navigate ▸ Show bytes (Navegar ▸ Mostrar bytes, Ctrl+Shift+H) abre a vista hexadecimal anotada: ela não mostra apenas bytes, ela diz o que cada área representa. Go to address (Ir para o endereço, Ctrl+G) leva você diretamente até lá.

Modificar o executável

O modo “raw” permite gravar bytes e produzir um executável modificado. Ele é delimitado por quatro recusas, e cada uma protege alguma coisa:

recusa por quê
O arquivo analisado nunca é o destino o motor nunca o abre para gravação; a interface não desfaz essa garantia
Sobrescrever um arquivo existente exige confirmação “isto não pode ser desfeito”
A assinatura Authenticode será removida seu consentimento é pedido antes; você pode assinar de novo com seu próprio certificado
Um patch recusado não grava nada nenhum arquivo gravado pela metade

O estúdio web não oferece patches binários nem a vista hexadecimal: são duas funções específicas da edição desktop.

9. Recursos e designer

Os recursos do binário

Ícones, cursores, bitmaps, tabelas de strings, informações de versão: tudo o que um arquivo .res teria carregado. Cada entrada mostra seu tipo, seu tamanho e o que pode ser feito com ela, e a extração é possível entrada por entrada ou em bloco.

Um recurso que o produto não sabe desenhar continua listado e é mostrado como bytes: ele nunca é escondido. E se entradas do diretório não puderam ser seguidas, um aviso diz isso – você sabe então que a lista é mais curta do que o binário contém.

O designer de formulários

A superfície do formulário é desenhada do jeito que o VB6 a teria mostrado, a partir das propriedades lidas no binário, na ordem de desenho correta. A imagem do formulário pode ser exportada (Ctrl+I).

As propriedades são somente leitura: o VBReFormer sabe ler a superfície de um formulário, mas ainda não sabe regravá-la no executável compilado. Veja o capítulo 13.

10. Exportar o projeto

  1. Verifique primeiro o painel Diagnostics. Ele diz o que não pôde ser feito. Lê-lo antes da exportação evita que você procure depois por que um elemento está faltando.
  2. File ▸ Export the VB6 project (Arquivo ▸ Exportar o projeto VB6). Escolha uma pasta de destino vazia.
  3. Leia as notas de exportação. O VBReFormer escreve o que não conseguiu recuperar, e por quê. Algumas informações – referências externas, opções de compilação, o modo de inicialização – não estão em nenhuma estrutura do binário: não foram apagadas, nunca estiveram lá. Elas são sinalizadas em vez de inventadas.
  4. Abra o .vbp no Visual Basic 6. Os cabeçalhos que o IDE exige (VERSION, Attribute VB_Name) são gravados. Se uma referência estiver faltando, adicione-a em Project ▸ References (Projeto ▸ Referências).

Duas recusas de gravação que protegem você. Os arquivos do VB6 são gravados em ANSI 1252. O VBReFormer se recusa a gravar se esse conjunto de caracteres não estiver disponível na máquina – gravar em outro produziria um arquivo errado silenciosamente – ou se um caractere do seu código não existir nele, e nesse caso ele diz qual é e seu ponto de código.

11. As opções

configuração o que faz
Indentation width (largura da indentação) só se aplica ao código reconstruído: a desmontagem, a IR, o P-code, o bloco do designer e o .vbp não são formatados por este editor.
Code page (designer) (página de código do designer) a página na qual as legendas e os textos do designer são lidos. Um binário VB6 não declara a sua em lugar nenhum – medido em 236 binários. Se os rótulos de um formulário aparecem como caracteres incoerentes, é esta a configuração a mudar.
Group under With…End With (agrupar sob With…End With) desligado por padrão. A saída é totalmente qualificada (Frame1.Caption), porque o compilador dissolve os blocos With e reconstruí-los seria uma adivinhação. Ligue se preferir legibilidade a literalidade.
Syntax colouring (coloração de sintaxe) um papel, uma cor – os papéis vêm do motor, que diz o que cada fragmento é. Notação #RRGGBB; uma paleta inválida não é aplicada pela metade.
Interface language (idioma da interface) inglês, francês, espanhol – a mudança é imediata.

As configurações de renderização viajam com cada solicitação de exibição; elas nunca são definidas como estado de sessão. Mudar a indentação, portanto, não reanalisa nada.

12. Atalhos

atalho ação
Ctrl+O Abrir um binário VB6
F2 Renomear o símbolo sob o cursor
Shift+F12 Analisar referências
Ctrl+Shift+F Localizar no projeto
Ctrl+G Ir para o endereço
Ctrl+Shift+H Mostrar bytes
Ctrl+Shift+S Lista de símbolos
Ctrl+Shift+B Object Browser
Ctrl+Shift+P API Browser
Ctrl+Shift+G Grafo de fluxo de controle
Ctrl+Shift+A Grafo de chamadas
Ctrl+K Bibliotecas citadas
Ctrl+L Programas VB de uma pasta
Ctrl+F2 Ativar/desativar marcador
F8 / Shift+F8 Marcador seguinte / anterior
Ctrl+Shift+F2 Lista de marcadores
Alt+← / Alt+→ Navegação para trás / para a frente
Ctrl+I Salvar a imagem do formulário

13. Limites conhecidos

Modificar a interface de um executável compilado

O VBReFormer lê a superfície de um formulário e todas as suas propriedades – ele ainda não sabe regravá-las no executável. Substituir um recurso incorporado e adicionar uma propriedade oculta sem recompilar não estão disponíveis. Os patches binários – gravar bytes em um endereço – estão (capítulo 8).

Recursos .ctx de UserControl

Nenhum arquivo .ctx é gravado na exportação. Se o seu projeto contém UserControl com recursos persistidos, essa parte precisa ser reconstruída.

Windows anterior ao 10

Use o VBReFormer Online: um navegador basta, seja qual for o sistema.

O que nenhum descompilador ultrapassa

Comentários, nomes de variáveis locais, constantes nomeadas: não estão no arquivo. Veja o capítulo 5.

14. Perguntas frequentes

Uma função do menu não responde. Por quê? Abra Help ▸ About e veja a lista de capacidades servidas (Capabilities served). Se a função não está lá, não é a interface que recusa: o motor não a serve para este documento. As mensagens do aplicativo também dizem isso explicitamente.

O código exportado recompila como está? Muitas vezes: em uma bancada de 149 projetos, 121 recompilam sem nenhuma alteração. Os outros precisam de uma referência adicionada ou de alguns marcadores tratados.

Os rótulos do meu formulário estão ilegíveis. É a página de código. Um binário VB6 não declara em lugar nenhum a página dos seus textos de designer – defina-a nas Opções (capítulo 11).

Por que meus formulários são mais legíveis do que meus módulos? Porque o VB6 conserva os nomes dos controles e dos eventos para funcionar, enquanto resolve os procedimentos de módulo em simples endereços. Veja o capítulo 5.

Meu executável está empacotado (packer). Isso é um problema? Sim: ele precisa ser desempacotado antes, senão as estruturas do VB6 não ficam visíveis no arquivo.

É possível descompilar um .ocx ou uma .dll ActiveX? Sim, e o inventário de membros públicos costuma ser mais rico nesses casos, já que o COM exige nomeá-los.

Meu binário é enviado para algum lugar? A leitura do formato, os bytes, a desmontagem e os recursos são processados na sua máquina. A reconstrução do código é executada nos nossos servidores – é esse o sentido da edição Desktop + Cloud.

É legal? Depende da sua jurisdição e dos seus direitos sobre o binário. O uso previsto é recuperar o seu próprio código, ou um código sobre o qual você detém os direitos ou uma autorização.