Em muitos casos, é desejável criar softwares com proteção ...
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
A alternativa correta é a C, que aborda técnicas de proteção contra engenharia reversa, sendo elas: transformações no controle de fluxo, transformações de dados, ofuscação e encriptação de código.
As transformações no controle de fluxo dificultam o entendimento do caminho que o programa executa, ao alterar a sequência de execução de blocos de código e inserir estruturas de controle que complica a análise por humanos ou ferramentas automatizadas.
Transformações de dados consistem em alterar a forma como os dados são representados no programa, como, por exemplo, dividir variáveis em múltiplas outras, para causar confusão naqueles que tentam compreender a estrutura de dados utilizada.
A ofuscação de código é uma técnica que modifica o código-fonte ou binário do software para torná-lo mais difícil de ser compreendido ou analisado, tanto visualmente quanto por ferramentas de descompilação.
Finalmente, a encriptação de código é um método que criptografa partes do código ou o código inteiro. A execução desse código criptografado geralmente envolve um processo de decriptação em tempo de execução, que protege a lógica do software de ser facilmente extraída ou modificada.
Esses conceitos são essenciais no âmbito de segurança de software, principalmente no contexto de proteger o código-fonte contra análises não autorizadas ou mal-intencionadas, e são frequentemente cobrados em concursos públicos na área de desenvolvimento de software.
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
3.1 Eliminação de Informação Simbólica (Eliminating Symbolic Information – ESI)
A abordagem mais óbvia para confundir quem está lendo diretamente um código disassemblado é eliminar toda e qualquer informação textual do programa.
Se as strings no código assembly não estivessem transparentes, ou seja, se fossem diferentes da forma como vemos no programa em execução, o trabalho seria realmente bem mais difícil e demorado.
Em um binário executável que acessa diretamente o hardware, não-bytecode, podemos simplesmente esconder toda a informação do programa. Já em programas baseados em bytecodes os executáveis muitas vezes contém uma grande quantidade de informação simbólica, como nome de classes, nome de membro de classes e a tabela de objetos instanciados. Estas informações podem ser extremamente úteis para quem disassemblar o código pois com base nelas é possível localizar pontos-chave do código.
http://www.sawp.com.br/blog/?p=131
3.2 Ofuscação e Encriptação de Código (Code Obfuscation and Encryption – COE)
Encriptação e ofuscação são técnicas utilizadas para reduzir a vulnerabilidade de crackear programas. Normalmente são utilizadas quando a ESI não é suficiente para proteção anticracking.
Consiste em modificar o layout do programa, a lógica e os dados de forma que reorganize o código, tornando-o menos legível, mas mantendo a funcionalidade para o usuário final.
COE difere-se da Eliminação Simbólica por alterar a estrutura do código em sí e não dos nomes dos componentes constantes.
3.3 Técnicas Ativas de Antidebuggin (Active AntiDebugger Techniques ? AADT)
Considerando que as atividades de cracking são feitas em grande parte com o uso de debuggers a possibilidade de incorporar no programa algum código que complique o processo de depuração é desejável para o aumento na proteção do código.
Técnicas AADT são altamente efetivas quando combinadas com encriptação de código. Pois, ao encriptar o programa, força os crackers executá-lo dentro de um debugger e o código AADT não permite sua depuração.
Existem dezenas de truques utilizados para antidebuggin. Mas quase todos são dependentes de plataforma ou altamente dependente de sistemas operacionais.
As implementações de AADT oferecem alguns riscos e algumas vezes costumam gerar exceções não tratáveis e causar mal funcionamento do programa quando detecta um debugger no sistema, mesmo se o programa não estiver anexado ao debugger.
http://www.sawp.com.br/blog/?p=131
3.4 Confundindo Disassemblers (Confusing Disassemblers – CD)
Enganar disassemblers para inibir a atividade de crackers não é uma forma muito resistente de antireversing. Entretanto, é a mais popular.
A estratégia é simples: Nas arquiteturas de processadores que usam instruções de tamanho variável (como IA-32) é possível enganar o disassembler inserindo dados impróprios no começo da instrução. Isto faz com que o disassembler perca a sincronização e disassemble o resto do código incorretamente (colocando 1 bit a direita ou a esquerda, o conjunto de bits seguintes implicarão na perda da instrução).
3.5 Transformações no Controle de Fluxo (Control Flow Transformations – CFT)
Transformações no controle de fluxo consistem em alterar a ordem e o fluxo de um programa para reduzir a legibilidade do código ao gerar assembly. Podendo ser definida em 3 categorias: computação de transformações, agregação de transformações e ordenação de transformações.
A Computação de Transformações modifica a estrutura de fluxo original para trazer uma funcionalidade equivalente ao usuário final, mas tornando mais difícil de se reverter o código. Isso pode ser feito removendo o fluxo de informação do programa e adicionando outra declaração de controle de fluxo que complicaria o entendimento para quem for ler o código em baixo nível.
A Agregação de Transformações destrói a estrutura de alto nível do programa, quebrando a abstração de linguagem de alto nível em tempo de programação. A idéia básica é desfazer essa abstração de modo que após a compilação ser feita a funcionalidade do programa se mantenha, mas quando o código seja desassemblado a estrutura pareça absurda.
Por fim Ordenação de Transformadas são as menos poderosas e consistem em randomizar a ordem das operações em um programa na esperança de reduzir a legibilidade do programa.
3.6 Transformações de Dados ( Data Transformations – DT )
Transformações de dados focam em encriptar tanto os dados quanto a estrutura do programa. Essa associação é interessante pois identificar uma importante estrutura de dados é um dos passos fundamentais para entender como o programa funciona.
http://www.sawp.com.br/blog/?p=131
Gabarito C
Desenvolver software com proteção contra engenharia reversa é crucial para proteger a propriedade intelectual, evitar a análise de malware e dificultar a exploração de vulnerabilidades. As técnicas listadas visam tornar o processo de análise do código binário ou de máquina mais complexo e demorado para um engenheiro reverso.
Vamos detalhar as técnicas mencionadas:
- Transformações no Controle de Fluxo:
- Esta técnica visa obscurecer o fluxo lógico de execução de um programa. Isso pode ser feito adicionando saltos condicionais complexos, introduzindo caminhos de execução irreais, usando instruções de lixo (junk code) ou empilhamento de chamadas de função que tornam difícil seguir a ordem real das operações. O objetivo é confundir os descompiladores e as ferramentas de análise de fluxo.
- Transformações de Dados:
- Envolve a modificação da representação dos dados dentro do programa para torná-la menos óbvia. Isso pode incluir a criptografia de strings ou constantes, o uso de estruturas de dados complexas e não padronizadas, ou a fragmentação de dados para que não sejam facilmente reconhecíveis em sua forma original. A ideia é dificultar a identificação de informações sensíveis ou a compreensão do propósito dos dados.
- Ofuscação:
- A ofuscação é um termo guarda-chuva para diversas técnicas que tornam o código mais difícil de ser lido e compreendido por humanos ou ferramentas automatizadas, sem alterar sua funcionalidade. Exemplos incluem renomeação de variáveis, funções e classes para nomes sem sentido (, , ), remoção de metadados, compressão de código e minificação.
- Encriptação de Código:
- Esta técnica, também conhecida como empacotamento (packing) ou criptografia de tempo de execução, envolve criptografar partes ou a totalidade do código executável. O código permanece criptografado no disco e só é descriptografado e executado em tempo de execução, muitas vezes em memória. Isso dificulta a análise estática do binário, pois o código real só se revela durante a execução, e mesmo assim, pode ser ofuscado ou fragmentado.
Essas técnicas, quando combinadas, podem criar uma barreira significativa para a engenharia reversa, aumentando o tempo e os recursos necessários para que um adversário compreenda e explore o software.
Retroceder Nunca Render-se Jamais !
Força e Fé !
Fortuna Audaces Sequitur !
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo