O que é Ofuscação?
On Outubro 25, 2021 by adminO que é Ofuscação de Código?
A Ofuscação de Código é o processo de modificação de um executável para que ele não seja mais útil a um hacker, mas permaneça totalmente funcional. Embora o processo possa modificar as instruções do método real ou metadados, ele não altera a saída do programa. Para ser claro, com tempo e esforço suficientes, quase todo o código pode ser modificado de forma inversa. Entretanto, em algumas plataformas como Java, Android, iOS ou .NET (por exemplo, Xamarin, C#, VB.NET, F#) os descompiladores livres podem facilmente reverter o código fonte de um executável ou biblioteca em praticamente nenhum tempo e sem esforço. A ofuscação automatizada do código torna a engenharia reversa um programa difícil e economicamente inviável.
Porquê usar um Obuscador de Código?
Por tornar um aplicativo muito mais difícil de engenharia reversa, você pode proteger contra roubo de segredo comercial (propriedade intelectual), acesso não autorizado, contornar licenças ou outros controles e descoberta de vulnerabilidades.
Como funciona a ofuscação?
A ofuscação de código consiste em muitas técnicas diferentes que podem se complementar umas às outras para criar uma defesa em camadas. É mais eficaz para linguagens que criam alguma forma de instruções de nível intermediário, como Java ou as linguagens .NET como C#, VB.NET, Managed C++, F#, etc. Alguns exemplos típicos de ofuscação e técnicas de segurança de aplicações incluem:
Rename Obfuscation
Renaming altera o nome dos métodos e variáveis. Torna a fonte descompilada mais difícil para um humano compreender, mas não altera a execução do programa. Os novos nomes podem utilizar diferentes esquemas como “a”, “b”, “c”, ou números, caracteres não imprimíveis ou caracteres invisíveis. E os nomes podem ser sobrecarregados desde que tenham um escopo diferente. A ofuscação de nomes é uma transformação básica que é usada pela maioria dos obfuscadores .NET (C#, etc.), iOS, Java e Android.
Criptação de cordas
Em um executável gerenciado, todas as cordas são claramente descobertos e legíveis. Mesmo quando métodos e variáveis são renomeados, strings podem ser usadas para localizar seções críticas de código procurando por referências de strings dentro do binário. Isto inclui mensagens (especialmente mensagens de erro) que são exibidas para o usuário. Para fornecer uma barreira eficaz contra este tipo de ataque, a encriptação de strings esconde as strings no executável e só restaura o seu valor original quando necessário. Decriptar strings em tempo de execução tipicamente incorre em uma leve penalidade de performance em tempo de execução.
Control Flow Obfuscation
Control Flow Obfuscation sintetiza construções condicionais, ramificações e iterativas que produzem lógicas executáveis válidas, mas produzem resultados semânticos não-determinísticos quando descompiladas. Mais simplesmente dito, faz com que o código descompilado pareça lógica spaghetti, o que é muito difícil para um hacker de compreender. Estas técnicas podem afetar a performance em tempo de execução de um método.
Transformação do Padrão de Instrução
Converte instruções comuns criadas pelo compilador para outras construções menos óbvias. Estas são instruções em linguagem de máquina perfeitamente legais que podem não mapear de forma limpa para linguagens de alto nível, tais como Java ou C#. Um exemplo é o cache transiente de variáveis que alavanca a natureza baseada em pilha dos tempos de execução Java e .NET.
Inserção de código dummy
Inserção de código no executável que não afeta a lógica do programa, mas quebra descompiladores ou torna o código de engenharia reversa muito mais difícil de analisar.
Retirada de Código e Metadados não utilizados
Remover informação de depuração, metadados não essenciais e código usado de aplicações torna-os menores e reduz a informação disponível para um atacante. Este procedimento pode melhorar ligeiramente a performance em tempo de execução.
Ligação binária/Fusão
Esta transformação combina múltiplos executáveis/librários de entrada em um ou mais binários de saída. Linking pode ser usado para tornar seu aplicativo menor, especialmente quando usado com renomeamento e poda, Pode simplificar cenários de implantação e pode reduzir informações disponíveis para hackers.
Inserção de Predicados Opacos
Obfuscates adicionando ramos condicionais que sempre avaliam a resultados conhecidos – resultados que não podem ser facilmente determinados via análise estática. Esta é uma maneira de introduzir código potencialmente incorreto que nunca será executado, mas é confuso para atacantes que tentam entender a saída descompilada.
Anti-Tamper
Um obfuscador pode injetar auto-proteção no seu código para verificar se a sua aplicação não foi adulterada de nenhuma maneira. Se a adulteração for detectada, ele pode desligar o aplicativo, limitar a funcionalidade, invocar falhas aleatórias (para disfarçar o motivo da falha), ou executar qualquer outra ação personalizada. Ele também pode enviar uma mensagem para um serviço para fornecer detalhes sobre a violação detectada.
Anti-Debug
Quando um hacker está tentando piratear ou falsificar sua aplicação, roubar seus dados, ou alterar o comportamento de um software de infra-estrutura crítica, eles quase certamente começarão com engenharia reversa e passarão através de sua aplicação com um depurador. Um obfuscator pode se auto-proteger injetando código para detectar se sua aplicação de produção está sendo executada dentro de um depurador. Se um depurador for usado, ele pode corromper dados sensíveis (protegendo-os contra roubo), invocar falhas aleatórias (para disfarçar que a falha foi resultado de uma verificação de depuração), ou executar qualquer outra ação personalizada. Ele também pode enviar uma mensagem para um serviço para fornecer um sinal de aviso.
Devo ofuscar minha aplicação?
Ponderar fortemente a utilização de ofuscação e auto-proteção da aplicação em tempo de execução se você lançar um software que roda em um ambiente não confiável e tem propriedade intelectual, fornece acesso a informações confidenciais, ou tem funcionalidade gated. A ofuscação torna muito mais difficult para os atacantes reverem o código e analisarem o aplicativo. Também torna difícil para os hackers depurarem e manipularem o seu aplicativo. O objetivo final é adicionar uma camada de proteção para torná-lo difficult para extrair ou descobrir informações úteis, tais como segredos comerciais (IP), credenciais ou vulnerabilidades de segurança de uma aplicação. Também deve tornar mais difícil modificar a lógica da aplicação ou reembalar uma aplicação com código malicioso.
Deixe uma resposta