Skip to content

MASTG-TEST-0046: Teste de Detecção Anti-Debugging

Bypass da Detecção de Debugger

Não existe uma forma genérica de contornar a proteção anti-debugging: o melhor método depende do(s) mecanismo(s) específico(s) usado(s) para prevenir ou detectar a depuração e das outras defesas no esquema geral de proteção. Por exemplo, se não houver verificações de integridade ou se você já as tiver desativado, fazer o patch do aplicativo pode ser o método mais fácil. Em outros casos, um framework de hooking ou módulos do kernel podem ser preferíveis.

Os métodos a seguir descrevem diferentes abordagens para contornar a detecção de debugger:

  • Aplicar patch na funcionalidade anti-debugging: desative o comportamento indesejado simplesmente sobrescrevendo-o com instruções NOP. Observe que patches mais complexos podem ser necessários se o mecanismo anti-debugging for bem elaborado.
  • Usar Frida ou Xposed para fazer hook em APIs nas camadas Java e nativa: manipule os valores de retorno de funções como isDebuggable e isDebuggerConnected para ocultar o debugger.
  • Alterar o ambiente: o Android é um ambiente aberto. Se nada mais funcionar, você pode modificar o sistema operacional para subverter as premissas que os desenvolvedores assumiram ao criar os mecanismos anti-debugging.

Exemplo de Bypass: Aplicativo UnCrackable para Android Nível 2

Ao lidar com aplicativos ofuscados, você frequentemente descobrirá que os desenvolvedores propositalmente "escondem" dados e funcionalidades em bibliotecas nativas. Você encontrará um exemplo disso em Android UnCrackable L2.

À primeira vista, o código parece com o desafio anterior. Uma classe chamada CodeCheck é responsável por verificar o código inserido pelo usuário. A verificação real parece ocorrer no método bar, que é declarado como um método nativo.

package sg.vantagepoint.uncrackable2;

public class CodeCheck {
    public CodeCheck() {
        super();
    }

    public boolean a(String arg2) {
        return this.bar(arg2.getBytes());
    }

    private native boolean bar(byte[] arg1) {
    }
}

    static {
        System.loadLibrary("foo");
    }

Consulte as diferentes soluções propostas para o Android Crackme Nível 2 no GitHub.

Avaliação de Eficácia

Verifique a presença de mecanismos anti-debugging, incluindo os seguintes critérios:

  • A conexão de debuggers baseados em jdb e ptrace falha ou faz com que o aplicativo termine ou funcione incorretamente.
  • Múltiplos métodos de detecção estão espalhados pelo código-fonte do aplicativo (em oposição a estarem todos em um único método ou função).
  • As defesas anti-debugging operam em múltiplas camadas de API (Java, funções de bibliotecas nativas, chamadas de sistema/assembler).
  • Os mecanismos são de alguma forma originais (em oposição a serem copiados e colados do StackOverflow ou outras fontes).

Trabalhe na contornagem das defesas anti-debugging e responda às seguintes perguntas:

  • Os mecanismos podem ser contornados trivialmente (por exemplo, fazendo hook em uma única função de API)?
  • Qual é a dificuldade de identificar o código anti-debugging por meio de análise estática e dinâmica?
  • Você precisou escrever código personalizado para desativar as defesas? Quanto tempo foi necessário?
  • Qual é a sua avaliação subjetiva da dificuldade de contornar os mecanismos?

Se os mecanismos anti-debugging estiverem ausentes ou forem facilmente contornados, faça sugestões alinhadas com os critérios de eficácia acima. Essas sugestões podem incluir adicionar mais mecanismos de detecção e uma melhor integração dos mecanismos existentes com outras defesas.