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
isDebuggableeisDebuggerConnectedpara 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.