Chave Perdida: Recuperando Código de Registro com Ataque de Texto Conhecido

Chave Perdida: Recuperando Código de Registro com Ataque de Texto Conhecido

Este artigo explora a recuperação de um código de registro de um aplicativo Delphi antigo. Analisaremos o algoritmo de criptografia, o gerador de números pseudoaleatórios e aplicaremos um ataque de texto conhecido para extrair o código sem força bruta ou patching.

MundiX News·19 de junho de 2026·3 min de leitura·👁 1 views

Ao investigar um aplicativo antigo desenvolvido em Delphi, nosso objetivo é desvendar o algoritmo de criptografia, analisar o funcionamento do gerador de números pseudoaleatórios e, finalmente, aplicar um ataque baseado em texto conhecido para extrair o código de registro correto. Essa abordagem nos permitirá obter o código sem a necessidade de tentativas de força bruta ou modificações diretas no aplicativo (patching).

Essencialmente, este artigo aborda um cenário incomum de implementação de proteção. Em vez de depender de uma simples comparação de número de série, a proteção se baseia na descriptografia de dados utilizando um código de registro. Um hacker experiente sabe que uma proteção de aplicativo robusta não deve ser quebrada com um simples patch de um byte. Independentemente do quão ofuscado ou virtualizado o código possa ser, se a proteção de um programa se resume à verificação de uma ou algumas condições específicas, encontrá-las e corrigi-las é apenas uma questão de tempo, habilidade do hacker e das ferramentas disponíveis.

A melhor estratégia para dificultar a vida de um engenheiro reverso é ofuscar o código ao máximo, adicionando verificações de integridade e outras funcionalidades que tornem a busca e o contorno dessas proteções mais trabalhosos e demorados do que o lucro potencial obtido com a quebra da proteção. Essa é a clássica guerra de escudo e espada, mas é uma espada de dois gumes. Contrariando o ditado popular "quebrar não é construir", um hacker, teoricamente, investe um esforço consideravelmente maior na engenharia reversa do que o desenvolvedor na proteção do aplicativo.

No entanto, existem casos em que a proteção é intrinsecamente impossível de ser quebrada. Como você já deve ter adivinhado, isso ocorre quando o hacker não possui uma informação crucial, vital para o funcionamento completo do programa. Exemplos incluem a falta de um módulo específico, um pedaço crítico de código, dados carregados de um servidor remoto ou, em último caso, um módulo que é descriptografado usando uma chave que o hacker não possui. Naturalmente, a impossibilidade de quebra de tal esquema é o cenário ideal, onde tudo é meticulosamente planejado: qualquer informação sobre o fragmento de quebra-cabeça ausente está indisponível para o hacker, o servidor remoto é bem protegido, o algoritmo de criptografia é assimétrico, e assim por diante. Mas nosso mundo não é perfeito, e os humanos cometem erros, portanto, toda proteção tem seus pontos fracos. Hoje, examinaremos exatamente um desses casos.

Assim, temos um aplicativo vintage que exibe dados gráficos durante sua operação, cujo conjunto é severamente limitado sem registro. O registro é realizado pela entrada de um código de registro, e este código não possui restrições: seu comprimento é desconhecido, o conjunto de caracteres permitidos é desconhecido, nenhuma validação é realizada, e pode-se digitar qualquer coisa. A correção do código inserido só pode ser verificada reiniciando o programa. Se o registro falhar, um aviso é exibido e, é claro, a maioria dos dados gráficos permanece inacessível. O único ponto otimista é que o código é o mesmo para todos os usuários e não está vinculado ao computador.

Primeiro, determinamos a natureza do nosso aplicativo, alimentando-o no DetectItEasy. O aplicativo é escrito em Delphi antigo, sem qualquer proteção:

PE32
Operation
system:
Windows (
XP) [
I386,
32-
bit, GUI]
Linker:
Turbo
linker (
2.25)
Compiler:
Borland
Object
Pascal(
Delphi) (
10.0)
Language:
Object
Pascal(Delphi)
Library:
Visual
Component
Library
Tool:
Borland
Delphi (3)
(Heur)
Protector:
Generic [
High
entropy]

Como ferramenta de análise do programa, escolhemos, como de costume, o Interactive Delphi Reconstructor (IDR). Ao descompilar o módulo EXE, encontramos imediatamente duas verificações de validade de registro, bem como uma mensagem sobre a necessidade de registro ao iniciar o aplicativo.

E também um aviso sobre a versão não registrada ao clicar com o mouse em uma imagem inacessível. Poderia parecer que este é o caso do "patch de um byte", mas não é. Ao aplicar um patch nas transições condicionais destacadas (ou mesmo nas variáveis verificadas antes delas), apenas as mensagens de aviso são desativadas; as funções necessárias e os dados gráficos ausentes continuam inacessíveis. Portanto, continuamos a investigar.

Analisando o código das capturas de tela anteriores, descobrimos que o indicador de ausência de registro é o valor padrão da chave de registro "0123456789", que é atribuído quando essa chave não está presente no registro. Paralelamente, encontramos uma validação simples da chave inserida para seu registro no registro ao fechar o formulário de registro. Como você pode ver, ela consiste em uma verificação primitiva do comprimento da chave, que deve ser de pelo menos 3 caracteres. Você provavelmente já adivinhou que o programa não registra com nenhuma chave com mais de 3 caracteres. Além disso, tal chave, embora vá para o registro, por algum motivo não é carregada do registro para o programa ao executar o método de carregamento Form1 da primeira captura de tela - no final, o código de registro padrão 0123456789 ainda será o resultado.

Tentamos entender por que isso acontece, analisando mais atentamente o código deste método. Logo após o carregamento do código do registro, com seus três primeiros caracteres, uma operação estranha é realizada. Agora está claro por que, antes de salvar o código no registro, ele era verificado quanto ao comprimento de três caracteres. Em pseudocódigo humano, isso se parece com:

dword_45291C = regcode[0] + regcode[2] + regcode[0] * regcode[1]

Procuramos onde a variável dword_45291C é usada posteriormente, e aqui começa a parte mais interessante da nossa missão. Acontece que esse valor inicializa a semente (RandSeed) do gerador de números pseudoaleatórios do Delphi System.@RandInt. Este é um gerador linear congruencial (LCG, o princípio de tal gerador é descrito em detalhes na Wikipedia). Ele representa a implementação interna da função Random do Delphi. A cada chamada, ele pega o valor atual da variável global System.RandSeed, multiplica-o por uma constante 134775813 e adiciona 1.

Mas o ponto crucial é para que, de fato, esse gerador pseudoaleatório é usado. Ele é usado dentro do carregador personalizado de imagens raster do aplicativo Unit1.TForm1.Image. Acontece que todos os dados raster do aplicativo são armazenados em um único banco de dados, onde as imagens ocultas do usuário não registrado são criptografadas com o código de registro. E como verificação de registro correto, uma imagem de teste criptografada é usada - com sua descriptografia correta, o programa é considerado registrado, e durante o processamento da exceção que ocorre em caso de falha ao carregar um JPEG descriptografado incorretamente, o código de registro é redefinido para o valor padrão.

Como não conhecemos apenas o código em si, mas também o conjunto de caracteres possíveis que o compõem, e até mesmo seu comprimento, a situação é bastante sombria. Se o desenvolvedor fez tudo corretamente, nesta fase a tarefa já deveria ser abandonada como infrutífera. No entanto, como você já adivinhou, a tarefa ainda tem uma solução. Chega de lamentar, vamos em vez disso olhar atentamente para o algoritmo de descriptografia:

c
do
{
  ReadBuffer((int)v3, (int)v23, 1);
  LOBYTE(v23[0]) ^= RegCode[v19];
  LOBYTE(v23[0]) ^= 9u;
  LOBYTE(v23[0]) ^= RandInt(0xFFu);
  WriteBuffer(*((int*)((char*)v23 + 1)), (int)v23, 1);
  if ((unsigned __int8)RegCodeLength == v19)
    v19 = 0;
  ++v19;
  --v11;
}
while (v11);

O restante do conteúdo está disponível apenas para membros. Materiais das edições mais recentes se tornam disponíveis individualmente apenas dois meses após a publicação. Para continuar a leitura, é necessário se tornar um membro da comunidade "Xakep.ru". Junte-se à comunidade "Xakep.ru"! A adesão à comunidade durante o período especificado lhe dará acesso a TODO o material "Xaker", permitirá o download de edições em PDF, desativará a publicidade no site e aumentará seu desconto acumulado pessoal! Saiba mais. Já sou membro do "Xakep.ru". ← Anterior Grupo ShinyHunters declarou que roubou dados da Kodak.

🛡️⚡

Pare de pesquisar. Comece a hackear.

O MundiX é seu copiloto de pentest com IA: comandos exatos, análise de outputs e próximo passo na kill chain — em segundos.

Testar grátis por 7 dias →

Sem cartão para começar · Planos a partir de R$49/mês

📤 Compartilhar & Baixar

🧰 Ferramentas recomendadas

Divulgação: alguns links são patrocinados. Podemos receber comissão se você comprar — sem custo extra para você. Só indicamos o que faz sentido para a comunidade.

Aprendendo Kali Linux: Teste de segurança, pentest e hacking ético

Aprendendo Kali Linux: Teste de segurança, pentest e hacking ético

Com centenas de ferramentas pré-instaladas, a distribuição Kali Linux facilita o trabalho de os profissionais de segurança começarem a fazer testes de segurança rapidamente. No entanto, com mais de 600 ferramentas em seu arsenal, o Kali Linux também pode ser desafiador. A nova edição deste prático livro abrange as atualizações nas ferramentas e inclui uma melhor abordagem da análise forense e da engenharia reversa. Ric Messier, autor, não fica apenas no teste de segurança, mas também faz uma abordagem sobre a execução de análise forense, incluindo a análise em disco e na memória, assim como alguma análise básica de malware. • Explore as diversas ferramentas disponíveis no Kali Linux • Entenda o valor do teste de segurança e examine os tipos de teste disponíveis • Aprenda os aspectos básicos do pentest em todo o ciclo de vida do ataque • Instale o Kali Linux em vários sistemas, tanto físicos quanto virtuais • Descubra como usar diferentes ferramentas destinadas à segurança • Estruture um teste de segurança baseado nas ferramentas do Kali Linux • Estenda as ferramentas do Kali para criar técnicas de ataque avançadas • Use o Kali Linux para ajudar a criar relatórios quando o teste terminar “A abordagem concisa, clara e baseada na experiência adotada por Ric Messier para a introdução do Kali Linux e dos testes de cibersegurança é incomparável. Este livro é uma leitura excelente e acessível para iniciantes e um recurso valioso para qualquer pessoa.” —Alexander Arlt, Consultor sênior de segurança, Google

Ver na Amazon
Gshield 2 em 1 Hub Extensor Conector USB-C + USB-A e Adaptador de Rede Ethernet LAN RJ45 com 3 Entradas USB 3.0 até 5 Gbps em Liga de Alumínio para Computador e Notebook, Cinza

Gshield 2 em 1 Hub Extensor Conector USB-C + USB-A e Adaptador de Rede Ethernet LAN RJ45 com 3 Entradas USB 3.0 até 5 Gbps em Liga de Alumínio para Computador e Notebook, Cinza

Compatível com portas USB-C e USB-A, ideal para ampliar a conectividade de dispositivos como MacBook Pro e outros com portas USB-C. Inclui um adaptador USB-A extra, proporcionando uma conexão Ethernet estável e veloz de até 1 Gbps, perfeita para filmes, jogos online e videoconferências. Oferece três portas USB 3.0 com velocidades de transferência de até 5 Gbps, permitindo conectar mouse, teclado, discos rígidos e outros periféricos. Fabricado em alumínio durável, garantindo longa vida útil e resistência ao uso diário. Design compacto e leve, ideal para viagens de negócios e uso diário, facilitando o transporte e armazenamento. Funciona com Windows 10/8.1/8, Mac OS e Chrome OS, oferecendo versatilidade incomparável para diversas necessidades de conectividade. Assegura uma conectividade estável e rápida, perfeita para tarefas exigentes como transferência de dados, streaming e mais.

Ver na Amazon
Hacking APIs: Breaking Web Application Programming Interfaces

Hacking APIs: Breaking Web Application Programming Interfaces

Hacking APIs is a crash course on web API security testing that will prepare you to penetration-test APIs, reap high rewards on bug bounty programs, and make your own APIs more secure. You'll learn how REST and GraphQL APIs work in the wild and set up a streamlined API testing lab with Burp Suite and Postman. Then you'll master tools useful for reconnaissance, endpoint analysis, and fuzzing, such as Kiterunner and OWASP Amass. Next, you'll learn to perform common attacks, like those targeting an API's authentication mechanisms and the injection vulnerabilities commonly found in web applications. You'll also learn techniques for bypassing protections against these attacks. In the book's nine guided labs, which target intentionally vulnerable APIs, you'll practice: Enumerating APIs users and endpoints using fuzzing techniques Using Postman to discover an excessive data exposure vulnerability Performing a JSON Web Token attack against an API authentication process Combining multiple API attack techniques to perform a NoSQL injection Attacking a GraphQL API to uncover a broken object level authorization vulnerability

Ver oferta
Gray Hat Hacking: The Ethical Hacker's Handbook, Sixth Edition

Gray Hat Hacking: The Ethical Hacker's Handbook, Sixth Edition

Up-to-date strategies for thwarting the latest, most insidious network attacks This fully updated, industry-standard security resource shows, step by step, how to fortify computer networks by learning and applying effective ethical hacking techniques. Based on curricula developed by the authors at major security conferences and colleges, the book features actionable planning and analysis methods as well as practical steps for identifying and combating both targeted and opportunistic attacks. Gray Hat Hacking: The Ethical Hacker's Handbook, Sixth Edition clearly explains the enemy's devious weapons, skills, and tactics and offers field-tested remedies, case studies, and testing labs. You will get complete coverage of Internet of Things, mobile, and Cloud security along with penetration testing, malware analysis, and reverse engineering techniques. State-of-the-art malware, ransomware, and system exploits are thoroughly explained. Fully revised content includes 7 new chapters covering the latest threats Includes proof-of-concept code stored on the GitHub repository Authors train attendees at major security conferences, including RSA, Black Hat, Defcon, and B-Sides

Ver na Amazon
Bloqueador USB de privacidade de porta USB para PC, notebook, bloco de laptop,

Bloqueador USB de privacidade de porta USB para PC, notebook, bloco de laptop,

Proteção de privacidade aprimorada: protege o link de transmissão de dados para evitar roubo de informações, fornecendo proteção de segurança robusta que protege a privacidade do usuário durante transferências de arquivos e garante uma conexão segura para interações de dispositivos sem preocupações em vários ambientes Uso a longo prazo: a camada protetora resistente ao desgaste, combinada com um corpo de metal resistente, oferece gerenciamento de calor confiável e qualidade duradoura durante o uso diário Entrega eficiente de energia: a tecnologia de chip inteligente garante a identificação automática dos requisitos de energia, fornecendo carregamento eficiente alinhando-se com vários protocolos de carregamento rápido para maior conveniência Proteção contra sobrecarga: evitando riscos de sobrecarga, este bloqueador de dados USB protege a vida útil da bateria e garante um desempenho estável, mantendo um fluxo estável de energia para melhorar a longevidade do dispositivo de forma eficaz Prático de transportar: com atenção à portabilidade, este bloqueador de dados USB oferece um design compacto que é leve e fácil de transportar, melhorando a conveniência do usuário e operação eficiente

Ver na Amazon

📩 Newsletter MundiX

Receba novidades de cibersegurança + um checklist de pentest grátis. Sem spam.

Ao assinar você concorda em receber e-mails. Cancele quando quiser.