Skip to content

MASTG-KNOW-0033: Ofuscação

O capítulo "Adulteração e Engenharia Reversa de Aplicativos Móveis" apresenta várias técnicas de ofuscação bem conhecidas que podem ser usadas em aplicativos móveis em geral.

Aplicativos Android podem implementar algumas dessas técnicas de ofuscação usando diferentes ferramentas. Por exemplo, Proguard oferece uma maneira fácil de reduzir e ofuscar o código e remover informações de depuração desnecessárias do bytecode de aplicativos Java Android. Ele substitui identificadores, como nomes de classes, nomes de métodos e nomes de variáveis, por strings de caracteres sem significado. Este é um tipo de ofuscação de layout, que não impacta o desempenho do programa.

Descompilar classes Java é trivial, portanto, é recomendado sempre aplicar alguma ofuscação básica ao bytecode de produção.

Saiba mais sobre técnicas de ofuscação Android:

Usando o ProGuard

Desenvolvedores usam o arquivo build.gradle para ativar a ofuscação. No exemplo abaixo, você pode ver que minifyEnabled e proguardFiles estão definidos. Criar exceções para proteger algumas classes da ofuscação (com -keepclassmembers e -keep class) é comum. Portanto, auditar o arquivo de configuração do ProGuard para ver quais classes estão isentas é importante. O método getDefaultProguardFile('proguard-android.txt') obtém as configurações padrão do ProGuard da pasta <Android SDK>/tools/proguard/.

Mais informações sobre como reduzir, ofuscar e otimizar seu aplicativo podem ser encontradas na documentação do desenvolvedor Android.

Quando você compila seu projeto usando Android Studio 3.4 ou Android Gradle plugin 3.4.0 ou superior, o plugin não usa mais o ProGuard para realizar otimização de código em tempo de compilação. Em vez disso, o plugin usa o compilador R8. O R8 funciona com todos os seus arquivos de regras ProGuard existentes, portanto, atualizar o Android Gradle plugin para usar o R8 não deve exigir que você altere suas regras existentes.

O R8 é o novo redutor de código do Google e foi introduzido no Android Studio 3.3 beta. Por padrão, o R8 remove atributos que são úteis para depuração, incluindo números de linha, nomes de arquivos de origem e nomes de variáveis. O R8 é um redutor, otimizador, ofuscador e pré-verificador gratuito de arquivos de classe Java e é mais rápido que o ProGuard, veja também um post do blog do Android Developer para mais detalhes. Ele é distribuído com as ferramentas SDK do Android. Para ativar a redução para a build de release, adicione o seguinte ao build.gradle:

android {
    buildTypes {
        release {
            // Ativa a redução de código, ofuscação e otimização apenas
            // para o tipo de build de release do seu projeto.
            minifyEnabled true

            // Inclui os arquivos de regras ProGuard padrão que são empacotados com
            // o Android Gradle plugin. Para saber mais, vá para a seção sobre
            // arquivos de configuração do R8.
            proguardFiles getDefaultProguardFile(
                    'proguard-android-optimize.txt'),
                    'proguard-rules.pro'
        }
    }
    ...
}

O arquivo proguard-rules.pro é onde você define regras personalizadas do ProGuard. Com a flag -keep você pode manter certos códigos que não estão sendo removidos pelo R8, o que poderia produzir erros. Por exemplo, para manter classes comuns do Android, como em nosso arquivo de configuração de exemplo proguard-rules.pro:

...
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
...

Você pode definir isso de forma mais granular em classes ou bibliotecas específicas do seu projeto com a seguinte sintaxe:

-keep public class MyClass

A ofuscação geralmente tem um custo no desempenho em tempo de execução, portanto, geralmente é aplicada apenas a certas partes muito específicas do código, tipicamente aquelas que lidam com segurança e proteção em tempo de execução.