O programa ficará mais lento quão maior for o descuido na implantação dessas técnicas devido aos efeitos adversos, tais como o uso excessivo da CPU com instruções que não tem funcionalidade nenhuma para o usuário, o aumento significativo do código e a perda de desempenho no sistema. Todavia, ao implementar este tipo de proteção devemos usar as técnicas de forma que as reações colaterais sejam minimizadas. Neste artigo, discutimos quais são os custos ao se implementar uma técnica que desfavoreça a engenharia reversa, o nível de proteção máximo que se pode ser obtido e qual preço desta segurança.
Control Flow Transformation (CFT) consiste em alterar a estrutura de um programa para tornar seu código difícil para a leitura humana sem prejudicar a sua funcionalidade original. Como veremos aqui, está intimamente relaciona com a ofuscação de código.
As técnicas que se aplicam à categoria das CFTs são: Inlining, Intervalar Código, Estruturas Opacas, GoTo Hell’s Code e Exceção Proposital.
Uma técnica sofisticada de enganar disassemblers consiste em usar um trecho do programa para alterar os bits das outras partes do programa, que desejamos proteger. A estratégia usada é deslocar os bits de um trecho do programa para que este pedaço pareça possuir outras instruções. Desta forma, o decompilador irá interpretar essas instruções e fornecer informações erradas ao atacante.
No post “A Fórmula do Crack” discutimos alguma coisa sobre debuggers. Como é o processo de debuggin em user-mode e kernel-mode, como cada um deles trabalha quando um usuário anexa um processo à eles, quando fixa um breakpoints em uma instrução etc.
O que não foi discutido é a forma como o debugger atua: quando o usuário escolhe pontos de parada para conferir o andamento da execução do programa é comum o debugger substituir a(s) instrução(ões) por uma instrução própria, que só ele entenda.
Também conhecidas como Code Obfuscation and Encryption (COE), são técnicas utilizadas para prevenir a Análise Estática de Código. Diferente da Eliminação Simbólica (Eliminating Symbolic Information – ESI), a COE é aplicada após a compilação do programa, modificando o binário original antes de ser entregue ao cliente.
Os compiladores costumam gerar informações simbólicas – para representar as lincagens – quando convertem as relações de importação e exportação de tabelas e extensões. Um programa com grande uso de DLLs, onde cada uma exporta uma grande quantidade de funções, necessitará de uma lista relacionando onde estão as funções exportadas, normalmente indicando o que elas fazem, o que é de grande serventia para os crackers. Neste artigo, apresento algumas das informações que podem ser usadas como pontos de referência para engenharia reversa.
Quando disassemblamos um binário para crackearmos, muitas vezes nos deparamos com um código que parece não fazer sentido. Isso ocorre por que o programa possivelmente foi implantado com alguma proteção contra engenharia reversa.