MASTG-KNOW-0089: Ofuscação.
O capítulo "Violação e Engenharia Reversa de Aplicativos Móveis" apresenta várias técnicas de ofuscação conhecidas que podem ser usadas em aplicativos móveis em geral.
Ofuscação de Nomes¶
O compilador padrão gera símbolos binários com base nos nomes de classes e funções do código-fonte. Portanto, se nenhuma ofuscação foi aplicada, os nomes dos símbolos permanecem significativos e podem ser facilmente lidos diretamente do binário do aplicativo. Por exemplo, uma função que detecta jailbreak pode ser localizada pesquisando por palavras-chave relevantes (por exemplo, "jailbreak"). A listagem abaixo mostra a função desmontada JailbreakDetectionViewController.jailbreakTest4Tapped do DVIA-v2.
__T07DVIA_v232JailbreakDetectionViewControllerC20jailbreakTest4TappedyypF:
stp x22, x21, [sp, #-0x30]!
mov rbp, rsp
Após a ofuscação, podemos observar que o nome do símbolo não é mais significativo, como mostrado na listagem abaixo.
__T07DVIA_v232zNNtWKQptikYUBNBgfFVMjSkvRdhhnbyyFySbyypF:
stp x22, x21, [sp, #-0x30]!
mov rbp, rsp
No entanto, isso se aplica apenas aos nomes de funções, classes e campos. O código real permanece inalterado, então um atacante ainda pode ler a versão desmontada da função e tentar entender sua finalidade (por exemplo, para recuperar a lógica de um algoritmo de segurança).
Substituição de Instruções¶
Esta técnica substitui operadores binários padrão, como adição ou subtração, por representações mais complexas. Por exemplo, uma adição x = a + b pode ser representada como x = -(-a) - (-b). No entanto, usar a mesma representação de substituição pode ser facilmente revertido, por isso é recomendado adicionar múltiplas técnicas de substituição para um único caso e introduzir um fator aleatório. Esta técnica é vulnerável à desofuscação, mas dependendo da complexidade e profundidade das substituições, aplicá-la ainda pode ser demorada.
Achatamento de Fluxo de Controle¶
O achatamento de fluxo de controle substitui o código original por uma representação mais complexa. A transformação quebra o corpo de uma função em blocos básicos e os coloca todos dentro de um único loop infinito com uma instrução switch que controla o fluxo do programa. Isso torna o fluxo do programa significativamente mais difícil de seguir, pois remove as construções condicionais naturais que geralmente tornam o código mais legível.

A imagem mostra como o achatamento de fluxo de controle altera o código. Consulte "Obfuscating C++ programs via control flow flattening" para mais informações.
Injeção de Código Morto¶
Esta técnica torna o fluxo de controle do programa mais complexo ao injetar código morto no programa. Código morto é um trecho de código que não afeta o comportamento original do programa, mas aumenta a sobrecarga do processo de engenharia reversa.
Criptografia de Strings¶
Aplicativos são frequentemente compilados com chaves embutidas, licenças, tokens e URLs de endpoint. Por padrão, todos eles são armazenados em texto simples na seção de dados do binário de um aplicativo. Esta técnica criptografa esses valores e injeta trechos de código no programa que descriptografarão esses dados antes de serem usados pelo programa.
Ferramentas Recomendadas¶
- SwiftShield pode ser usado para realizar ofuscação de nomes. Ele lê o código-fonte do projeto Xcode e substitui todos os nomes de classes, métodos e campos por valores aleatórios antes que o compilador seja usado.
- obfuscator-llvm opera na Representação Intermediária (IR) em vez do código-fonte. Pode ser usado para ofuscação de símbolos, criptografia de strings e achatamento de fluxo de controle. Como é baseado em IR, pode ocultar significativamente mais informações sobre o aplicativo em comparação com o SwiftShield.
Saiba mais sobre técnicas de ofuscação em iOS no artigo "Protecting Million-User iOS Apps with Obfuscation: Motivations, Pitfalls, and Experience".