Concrete Logo
Hamburger button

Ofuscação de código: ProGuard x DexGuard

  • Blog
  • 17 de Outubro de 2018

Todos nós sabemos (ou eu espero que sim) o quão importante é a questão da segurança nas aplicações mobile, certo? Também sabemos que existem várias formas de aumentar a segurança do seu app. Neste post, vou focar nas diferenças entre as duas principais ferramentas que usam a ofuscação de código para este fim: a ProGuard e a DexGuard.

A ofuscação do código consiste basicamente em transformar o código real em outro menos legível ao ser humano. Isso porque por meio do APK é possível usar ferramentas de engenharia reversa, ter acesso ao código fonte e, assim, roubar a propriedade intelectual, achar pontos de vulnerabilidade no código e ainda roubar informações relevantes, como API Keys.

De forma bem simplista, o ProGuard é uma ferramenta que pode ser utilizada gratuitamente, enquanto o DexGuard tem uma licença paga, e a base das duas é a mesma. Por isso é bem fácil fazer o update do ProGuard para DexGuard. Mas como decidir por qual usar na hora de implementar no seu projeto?!?

Para ajudar nesta questão, vamos às principais diferenças:

ProGuard é um otimizador genérico para Java bytecode.
DexGuard é uma ferramenta especializada para aplicativos Android.

O ProGuard permite que você diminua, otimize e ofusque aplicativos móveis e desktop, atuando de forma mais genérica e ampla, enquanto o DexGuard é projetado especificamente para proteger e otimizar aplicativos Android, oferecendo uma proteção em várias camadas e pronto para evoluir como o meio em que os apps são utilizados. Ele ainda oferece funcionalidades que ajudam a plataforma como configuração para o Android Runtime e bibliotecas comuns (Google play services, Dagger, Realm, SQLCipher, etc.).

ProGuard oferece proteção básica contra análise estática.
DexGuard protege aplicativos contra análise estática e dinâmica.

As formas mais usadas na engenharia reversa para hackear um app são obter o código-fonte usando descompiladores (análise estática) e monitorar o comportamento da aplicação em tempo de execução (análise dinâmica). O ProGuard oferece proteção somente contra a análise estática (Fig. 1), enquanto o DexGuard, além de fortalecer o código com técnicas de ofuscação e criptografia, também oferece mecanismos de segurança em tempo de execução, permitindo que o app reaja quando uma atividade suspeita é detectada (Fig. 2).

ProGuard oferece ofuscação mínima.
DexGuard aplica múltiplas camadas de criptografia e ofuscação.

Ambas as ferramentas ofuscam o código de aplicações Android, mas a ProGuard faz isso de forma básica, ofuscando os nomes das classes, campos e métodos. DexGuard não apenas ofusca os mesmos nomes, mas também as expressões aritméticas e lógicas, criptografa strings e classes e adiciona reflections para APIs sensíveis ao acesso. O resultado é um aplicativo bem mais protegido.

ProGuard foca no bytecode.
DexGuard processa todos os componentes do aplicativo.

Enquanto a ação do ProGuard é restrita ao bytecode de aplicativos Java, 0 DexGuard oferece proteção completa, ofuscando e criptografando bibliotecas nativas, arquivos manifest, recursos, arquivos de recursos e arquivos asset.

ProGuard é uma ferramenta com código aberto (open source).
DexGuard é um produto comercial, de nível empresarial.

ProGuard pode ser utilizado gratuitamente tanto em aplicativos comerciais como não comerciais. DexGuard é um produto comercial, a licença permite que você use e tenha acesso ao suporte que a empresa oferece.

E agora, qual usar no meu projeto?

Cada projeto tem seus desafios e necessidades específicas, mas alguns pontos devem ajudar na hora da escolha. Tais como:

• A necessidade do projeto é de um ofuscador básico? Então o ProGuard é uma ótima opção, pois age como um otimizador que remove o código não utilizado e faz uma ofuscação básica, trocando nomes de classes e métodos por letras;
• A necessidade é de um ofuscador mais robusto, que faça criptografia também? Neste caso o DexGuard é uma ótima opção, uma vez que oferece nível de ofuscação avançado, cria bytecode válido pra JVM/ART, e não tem código fonte correspondente, ou seja, se você tentar descompilar, não vai ser possível. É possível inclusive adicionar o seu próprio algoritmo de criptografia pra fazer a ofuscação. Além disso, ele inclui uma biblioteca de utilitários de segurança, que inclui opções de pinning HTTP e detecção de ambiente inseguro (root, debug, emulador, tampering, etc.).

Vale lembrar também que, a partir do Android Studio 3.3, o Google vai oferecer o R8, uma nova ferramenta para ofuscação e redução de código, que substitui o ProGuard, com otimizações para Kotlin. Aguardemos!

Se você quiser mais, pode dar uma olhada nestes links:

Tem alguma dúvida ou observação? Aproveite os campos abaixo. Até a próxima!