Importante
Este projeto está arquivado e não é mais mantido.
Algumas das perguntas mais comuns são respondidas em Perguntas frequentes e solução de problemas.
Uma ferramenta de ofuscação de caixa preta para aplicativos Android.
Obfuscapk é uma ferramenta modular Python para ofuscar aplicativos Android sem a necessidade de seu código-fonte, já que apktool
é usado para descompilar o arquivo apk original e construir um novo aplicativo, após aplicar algumas técnicas de ofuscação no código smali
descompilado, recursos e manifesto. O aplicativo ofuscado mantém a mesma funcionalidade do original, mas as diferenças internas às vezes tornam o novo aplicativo muito diferente do original (por exemplo, software antivírus baseado em assinatura).
Obfuscapk está adicionando suporte para Android App Bundles (arquivos aab) usando BundleDecompiler (consulte #121). Para usar este novo recurso, baixe a versão mais recente do BundleDecompiler disponível aqui, salve-a como BundleDecompiler.jar
em um diretório incluído no PATH
(por exemplo, no Ubuntu, /usr/local/bin
ou /usr/bin
) e faça certifique-se de que o sinalizador executável esteja definido.
Importante
O BundleDecompiler ainda não funciona no Windows, portanto, a ofuscação do pacote de aplicativos não é suportada pelo Obfuscapk na plataforma Windows. Além disso, o suporte ao pacote de aplicativos ainda está em desenvolvimento inicial, portanto, se você enfrentou algum problema ou deseja nos ajudar a melhorar, consulte contribuir.
Mais detalhes sobre o Obfuscapk podem ser encontrados no artigo "Obfuscapk: uma ferramenta de ofuscação de caixa preta de código aberto para aplicativos Android". Você pode citar o artigo da seguinte maneira:
@article { aonzo2020obfuscapk ,
title = " Obfuscapk: An open-source black-box obfuscation tool for Android apps " ,
journal = " SoftwareX " ,
volume = " 11 " ,
pages = " 100403 " ,
year = " 2020 " ,
issn = " 2352-7110 " ,
doi = " https://doi.org/10.1016/j.softx.2020.100403 " ,
url = " https://www.sciencedirect.com/science/article/pii/S2352711019302791 " ,
author = " Simone Aonzo and Gabriel Claudiu Georgiu and Luca Verderame and Alessio Merlo " ,
keywords = " Android, Obfuscation, Program analysis "
}
Obfuscapk foi projetado para ser modular e fácil de estender, por isso é construído usando um sistema de plugins. Conseqüentemente, todo ofuscador é um plugin que herda de uma classe base abstrata e precisa implementar o método obfuscate
. Quando a ferramenta começa a processar um novo arquivo de aplicativo Android, ela cria um objeto de ofuscação para armazenar todas as informações necessárias (por exemplo, a localização do código smali
descompilado) e o estado interno das operações (por exemplo, a lista de ofuscadores já usados). . Em seguida, o objeto ofuscação é passado, como parâmetro para o método obfuscate
, para todos os plugins/ofuscadores ativos (em sequência) para serem processados e modificados. A lista e a ordem dos plugins ativos são especificadas através de opções de linha de comando.
A ferramenta é facilmente extensível com novos ofuscadores: basta adicionar o código fonte que implementa a técnica de ofuscação e os metadados do plugin (um arquivo <obfuscator-name>.obfuscator
) no diretório src/obfuscapk/obfuscators
(pegue um ofuscador simples existente como Nop
como exemplo inicial). A ferramenta detectará automaticamente o novo plugin, portanto nenhuma configuração adicional será necessária (o novo plugin será tratado como todos os outros plugins incluídos na ferramenta).
Existem duas maneiras de obter uma cópia funcional do Obfuscapk em seu próprio computador: usando Docker ou usando diretamente o código-fonte em um ambiente Python 3
. Em ambos os casos, a primeira coisa a fazer é obter uma cópia local deste repositório, então abra um terminal no diretório onde deseja salvar o projeto e clone o repositório:
$ git clone https://github.com/ClaudiuGeorgiu/Obfuscapk.git
Esta é a forma sugerida de instalação do Obfuscapk, pois o único requisito é ter uma versão recente do Docker instalada:
$ docker --version
Docker version 20.10.21, build baeda1f
A imagem oficial do Obfuscapk Docker está disponível no Docker Hub (construída automaticamente a partir deste repositório):
$ # Download the Docker image.
$ docker pull claudiugeorgiu/obfuscapk
$ # Give it a shorter name.
$ docker tag claudiugeorgiu/obfuscapk obfuscapk
Se você baixou a imagem oficial do Docker Hub, você está pronto para usar a ferramenta, então vá em frente e verifique as instruções de uso, caso contrário, execute o seguinte comando no diretório Obfuscapk/src/
criado anteriormente (a pasta que contém o Dockerfile
) para construir o Imagem do Docker:
$ # Make sure to run the command in Obfuscapk/src/ directory.
$ # It will take some time to download and install all the dependencies.
$ docker build -t obfuscapk .
Quando a imagem Docker estiver pronta, faça um teste rápido para verificar se tudo foi instalado corretamente:
$ docker run --rm -it obfuscapk --help
usage: python3 -m obfuscapk.cli [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB]
...
O Obfuscapk agora está pronto para ser usado, consulte as instruções de uso para obter mais informações.
Certifique-se de ter uma versão recente de apktool
, apksigner
e zipalign
instalada e disponível na linha de comando:
$ apktool
Apktool v2.9.0 - a tool for reengineering Android apk files
...
$ apksigner
Usage: apksigner < command > [options]
apksigner --version
apksigner --help
...
$ zipalign
Zip alignment utility
Copyright (C) 2009 The Android Open Source Project
...
Para suportar a ofuscação de pacotes de aplicativos, você também precisa do BundleDecompiler, então baixe a versão mais recente disponível aqui, salve-a como BundleDecompiler.jar
em um diretório incluído no PATH
(por exemplo, no Ubuntu, /usr/local/bin
ou /usr/bin
) e certifique-se de que o sinalizador executável esteja definido.
Para usar BundleDecompiler e apktool
você também precisa de uma versão recente do Java. zipalign
e apksigner
estão incluídos no Android SDK. A localização dos executáveis também pode ser especificada através das seguintes variáveis de ambiente: APKTOOL_PATH
, BUNDLE_DECOMPILER_PATH
, APKSIGNER_PATH
e ZIPALIGN_PATH
(por exemplo, no Ubuntu, execute export APKTOOL_PATH=/custom/location/apktool
antes de executar o Obfuscapk no mesmo terminal).
Além das ferramentas acima, o único requisito deste projeto é uma instalação funcional Python 3
(pelo menos 3.7
) (junto com seu gerenciador de pacotes pip
).
Execute os seguintes comandos no diretório principal do projeto ( Obfuscapk/
) para instalar as dependências necessárias:
$ # Make sure to run the commands in Obfuscapk/ directory.
$ # The usage of a virtual environment is highly recommended.
$ python3 -m venv venv
$ source venv/bin/activate
$ # Install Obfuscapk's requirements.
$ python3 -m pip install -r src/requirements.txt
Após a instalação dos requisitos, faça um teste rápido para verificar se tudo funciona corretamente:
$ cd src/
$ # The following command has to be executed always from Obfuscapk/src/ directory
$ # or by adding Obfuscapk/src/ directory to PYTHONPATH environment variable.
$ python3 -m obfuscapk.cli --help
usage: python3 -m obfuscapk.cli [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB]
...
O Obfuscapk agora está pronto para ser usado, consulte as instruções de uso para obter mais informações.
A partir de agora, o Obfuscapk será considerado um executável disponível como obfuscapk
, portanto você precisa adaptar os comandos de acordo com a forma como instalou a ferramenta:
Imagem Docker : um diretório local contendo o aplicativo a ser ofuscado deve ser montado em /workdir
no contêiner (por exemplo, o diretório atual "${PWD}"
), então o comando:
$ obfuscapk [params...]
torna-se:
$ docker run --rm -it -u $( id -u ) : $( id -g ) -v " ${PWD} " : " /workdir " obfuscapk [params...]
Da fonte : cada instrução deve ser executada a partir do diretório Obfuscapk/src/
(ou adicionando o diretório Obfuscapk/src/
à variável de ambiente PYTHONPATH
) e o comando:
$ obfuscapk [params...]
torna-se:
$ python3 -m obfuscapk.cli [params...]
Vamos começar examinando a mensagem de ajuda:
$ obfuscapk --help
obfuscapk [-h] -o OBFUSCATOR [-w DIR] [-d OUT_APK_OR_AAB] [-i] [-p] [-k VT_API_KEY]
[--keystore-file KEYSTORE_FILE] [--keystore-password KEYSTORE_PASSWORD]
[--key-alias KEY_ALIAS] [--key-password KEY_PASSWORD] [--use-aapt2]
< APK_OR_BUNDLE_FILE >
Existem dois parâmetros obrigatórios: <APK_OR_BUNDLE_FILE>
, o caminho (relativo ou absoluto) para o arquivo apk ou pacote de aplicativos a ser ofuscado e a lista com os nomes das técnicas de ofuscação a serem aplicadas (especificadas com uma opção -o
que pode ser usada múltiplas vezes, por exemplo, -o Rebuild -o NewAlignment -o NewSignature
). Os outros argumentos opcionais são os seguintes:
-w DIR
é usado para definir o diretório de trabalho onde salvar os arquivos intermediários (gerados por apktool
). Se não for especificado, um diretório denominado obfuscation_working_dir
será criado no mesmo diretório que o aplicativo de entrada. Isso pode ser útil para fins de depuração, mas se não for necessário, pode ser definido como um diretório temporário (por exemplo, -w /tmp/
).
-d OUT_APK_OR_AAB
é usado para definir o caminho do arquivo de destino: o arquivo apk gerado pelo processo de ofuscação (por exemplo, -d /home/user/Desktop/obfuscated.apk
ou -d /home/user/Desktop/obfuscated.aab
). Se não for especificado, o arquivo ofuscado final será salvo dentro do diretório de trabalho. Nota: os arquivos existentes serão substituídos sem qualquer aviso.
-i
é um sinalizador para ignorar bibliotecas conhecidas de terceiros durante o processo de ofuscação, para usar menos recursos, para aumentar o desempenho e para reduzir o risco de erros. A lista de bibliotecas a serem ignoradas foi adaptada do projeto LiteRadar.
-p
é um sinalizador para mostrar barras de progresso durante as operações de ofuscação. Ao usar a ferramenta em operações em lote/compilações automáticas, é conveniente ter as barras de progresso desabilitadas, caso contrário, este sinalizador deve ser habilitado para ver o progresso da ofuscação.
-k VT_API_KEY
é necessário apenas ao usar o ofuscador VirusTotal
, para definir a chave de API a ser usada na comunicação com o Virus Total.
--keystore-file KEYSTORE_FILE
, --keystore-password KEYSTORE_PASSWORD
, --key-alias KEY_ALIAS
e --key-password KEY_PASSWORD
podem ser usados para especificar um keystore personalizado (necessário para a assinatura do apk). Se --keystore-file
for usado, --keystore-password
e --key-alias
também deverão ser especificados, enquanto --key-password
será necessário apenas se a chave escolhida tiver uma senha diferente da senha do keystore. Por padrão (quando --keystore-file
não é especificado), um keystore incluído no Obfuscapk é usado para as operações de assinatura.
--ignore-packages-file IGNORE_PACKAGES_FILE
é um caminho para um arquivo que inclui nomes de pacotes a serem ignorados. Todas as classes dentro desses pacotes não serão ofuscadas quando esta opção for usada. O arquivo deve ter um nome de pacote por linha, conforme mostrado no exemplo abaixo:
com.mycompany.dontobfuscate
com.mycompany.ignore
...
--use-aapt2
é um sinalizador para usar a opção aapt2 ao reconstruir um aplicativo com apktool
.
Vamos considerar agora um exemplo simples de trabalho para ver como o Obfuscapk funciona:
$ # original.apk is a valid Android apk file.
$ obfuscapk -o RandomManifest -o Rebuild -o NewAlignment -o NewSignature original.apk
Ao executar o comando acima, isto é o que acontece nos bastidores:
como nenhum diretório de trabalho foi especificado, um novo diretório de trabalho ( obfuscation_working_dir
) é criado no mesmo local que original.apk
(isso pode ser útil para inspecionar os arquivos/manifestos/recursos smali
em caso de erros)
algumas verificações são realizadas para garantir que todos os arquivos/executáveis necessários estejam disponíveis e prontos para serem usados
o processo de ofuscação real começa: os ofuscadores especificados são executados (em ordem) um por um até que não haja mais nenhum ofuscador ou até que um erro seja encontrado
ao executar o primeiro ofuscador, original.apk
é descompilado com apktool
e os resultados são armazenados no diretório de trabalho
como o primeiro ofuscador é RandomManifest
, as entradas no manifesto descompilado do Android são reordenadas aleatoriamente (sem quebrar as estruturas xml
)
Rebuild
ofuscator simplesmente reconstrói o aplicativo (agora com o manifesto modificado) usando apktool
e, como nenhum arquivo de saída foi especificado, o arquivo apk resultante é salvo no diretório de trabalho criado antes
O ofuscador NewAlignment
usa a ferramenta zipalign
para alinhar o arquivo apk resultante
O ofuscador NewSignature
assina o arquivo apk recém-criado com um certificado personalizado contido em um keystore empacotado com Obfuscapk (embora um keystore diferente possa ser especificado com o parâmetro --keystore-file
)
quando todos os ofuscadores foram executados sem erros, o arquivo apk ofuscado resultante pode ser encontrado em obfuscation_working_dir/original_obfuscated.apk
, assinado, alinhado e pronto para ser instalado em um dispositivo/emulador
Como visto no exemplo anterior, os ofuscadores Rebuild
, NewAlignment
e NewSignature
são sempre necessários para concluir uma operação de ofuscação, para construir o apk ofuscado final. Elas não são técnicas de ofuscação reais, mas são necessárias no processo de construção, por isso estão incluídas na lista de ofuscadores para manter a arquitetura geral modular.
Não está funcionando como esperado? Consulte Perguntas frequentes e solução de problemas.
Os ofuscadores incluídos no Obfuscapk podem ser divididos em diferentes categorias, dependendo das operações que realizam:
Trivial : como o nome sugere, esta categoria inclui operações simples (que não modificam muito o aplicativo original), como assinar o arquivo apk com uma nova assinatura.
Renomear : operações que alteram os nomes dos identificadores utilizados (classes, campos, métodos).
Criptografia : empacotamento de código/recursos criptografados e descriptografá-los durante a execução do aplicativo. Quando o Obfuscapk é iniciado, ele gera automaticamente uma chave secreta aleatória (32 caracteres, usando letras e dígitos ASCII) que será usada para criptografia.
Código : todas as operações que envolvem a modificação do código fonte descompilado.
Recursos : operações nos arquivos de recursos (como modificar o manifesto).
Outro
Os ofuscadores atualmente incluídos no Obfuscapk são brevemente apresentados abaixo (em ordem alfabética). Consulte o código-fonte do projeto para obter mais detalhes.
Dica
Nem todos os ofuscadores abaixo correspondem a técnicas reais de ofuscação (por exemplo, Rebuild
, NewAlignment
, NewSignature
e VirusTotal
), mas são implementados como ofuscadores para manter a arquitetura modular e fácil de estender com novas funcionalidades.
Usa reflexão para invocar APIs perigosas do Android Framework. Para descobrir se um método pertence ao Android Framework, Obfuscapk refere-se ao mapeamento descoberto por Backes et al.
? Código-fonte do AdvancedReflection
Insira código indesejado. Nesse caso, o código lixo é composto por cálculos aritméticos e uma instrução de desvio dependendo do resultado desses cálculos, elaborada de forma que o desvio nunca seja realizado.
? Código-fonte do ArithmeticBranch
Criptografe arquivos de ativos.
? Código-fonte do AssetEncryption
Esta técnica modifica o gráfico do fluxo de controle sem impactar a semântica do código: ela adiciona novos métodos que invocam os originais. Por exemplo, uma invocação ao método m1 será substituída por um novo método wrapper m2 , que, quando invocado, chama o método original m1 .
? Código-fonte CallIndirection
Altere o nome do pacote e renomeie as classes (mesmo no arquivo de manifesto).
? Código fonte ClassRename
Criptografe strings constantes no código.
? Código-fonte ConstStringEncryption
Remova informações de depuração.
? Código fonte de DebugRemoval
Renomeie os campos.
? Código-fonte FieldRename
Dado um método, ele insere uma instrução
goto
apontando para o final do método e outragoto
apontando para a instrução após o primeirogoto
; ele modifica o gráfico de fluxo de controle adicionando dois novos nós.
? Ir para o código fonte
Criptografe bibliotecas nativas.
? Código-fonte do LibEncryption
Ele explora o recurso de sobrecarga da linguagem de programação Java para atribuir o mesmo nome a métodos diferentes, mas usando argumentos diferentes. Dado um método já existente, esta técnica cria um novo método void com o mesmo nome e argumentos, mas também adiciona novos argumentos aleatórios. Então, o corpo do novo método é preenchido com instruções aritméticas aleatórias.
? Código-fonte do MethodOverload
Renomeie métodos.
? MétodoRenomear código-fonte
Realinhe o aplicativo.
? Código fonte do NewAlignment
Assine novamente o aplicativo com uma nova assinatura personalizada.
? Código-fonte NewSignature
Insira código indesejado. Nop, abreviação de no-operation , é uma instrução dedicada que não faz nada. Esta técnica apenas insere instruções
nop
aleatórias em cada implementação de método.
? Código-fonte não
Reordene aleatoriamente as entradas no arquivo de manifesto.
? Código-fonte do RandomManifest
Recrie o aplicativo.
? Reconstruir código-fonte
Esta técnica analisa o código existente procurando invocações de métodos do aplicativo, ignorando as chamadas ao framework Android (veja
AdvancedReflection
). Se encontrar uma instrução com uma invocação de método adequada (ou seja, sem métodos construtores, visibilidade pública, registros livres suficientes, etc.), tal invocação será redirecionada para um método personalizado que invocará o método original usando as APIs do Reflection.
? Código fonte de reflexão
Esta técnica consiste em alterar a ordem dos blocos básicos do código. Quando uma instrução de ramificação é encontrada, a condição é invertida (por exemplo, ramificação se for menor que , torna-se ramificação se for maior ou igual a ) e os blocos básicos alvo são reordenados de acordo. Além disso, ele também reorganiza aleatoriamente o código, abusando das instruções
goto
.
? Reordenar o código-fonte
Criptografe strings em recursos (somente aquelas chamadas dentro do código).
? Código-fonte ResStringEncryption
Envie o aplicativo original e ofuscado para o Virus Total. Você deve fornecer a chave API do VT (consulte a opção
-k
).
? Código-fonte do VirusTotal
Você está livre para usar este código sob a licença do MIT.
Este software foi desenvolvido para fins de pesquisa no Laboratório de Segurança de Computadores (CSecLab), hospedado no DIBRIS, Universidade de Gênova.