MASTG-TOOL-0068: SwiftShield
SwiftShield é uma ferramenta que gera nomes irreversíveis e criptografados para os objetos do seu projeto iOS (incluindo seus Pods e Storyboards). Isso eleva a dificuldade para reverse engineers e produzirá saídas menos úteis ao utilizar ferramentas de reverse engineering como class-dump e Frida.
Aviso: O SwiftShield sobrescreve irreversivelmente todos os seus arquivos de origem. Idealmente, você deve executá-lo apenas no seu servidor de CI e em builds de release.
Um projeto Swift de exemplo é usado para demonstrar o uso do SwiftShield.
- Faça o checkout de sushi2k/SwiftSecurity.
- Abra o projeto no Xcode e certifique-se de que o projeto está compilando com sucesso (Product / Build ou Tecla-Apple + B).
- Baixe a versão mais recente do SwiftShield e descompacte-a.
- Vá para o diretório onde você baixou o SwiftShield e copie o executável swiftshield para
/usr/local/bin:
cp swiftshield/swiftshield /usr/local/bin/
- No seu terminal, vá para o diretório SwiftSecurity (que você fez checkout no passo 1) e execute o comando swiftshield (que você baixou no passo 3):
$ cd SwiftSecurity
$ swiftshield -automatic -project-root . -automatic-project-file SwiftSecurity.xcodeproj -automatic-project-scheme SwiftSecurity
SwiftShield 3.4.0
Modo automático
Construindo projeto para coletar módulos e argumentos do compilador...
-- Indexando ReverseEngineeringToolsChecker.swift --
Declaração encontrada de ReverseEngineeringToolsChecker (s:13SwiftSecurity30ReverseEngineeringToolsCheckerC)
Declaração encontrada de amIReverseEngineered (s:13SwiftSecurity30ReverseEngineeringToolsCheckerC20amIReverseEngineeredSbyFZ)
Declaração encontrada de checkDYLD (s:13SwiftSecurity30ReverseEngineeringToolsCheckerC9checkDYLD33_D6FE91E9C9AEC4D13973F8ABFC1AC788LLSbyFZ)
Declaração encontrada de checkExistenceOfSuspiciousFiles (s:13SwiftSecurity30ReverseEngineeringToolsCheckerC31checkExistenceOfSuspiciousFiles33_D6FE91E9C9AEC4D13973F8ABFC1AC788LLSbyFZ)
...
O SwiftShield agora está detectando nomes de classes e métodos e substituindo seus identificadores por valores criptografados.
No código-fonte original você pode ver todos os identificadores de classes e métodos:

O SwiftShield agora substituiu todos eles por valores criptografados que não deixam rastro do nome original ou da intenção da classe/método:

Após executar swiftshield, um novo diretório será criado chamado swiftshield-output. Neste diretório, outro diretório é criado com um timestamp no nome da pasta. Este diretório contém um arquivo de texto chamado conversionMap.txt, que mapeia as strings criptografadas para seus valores originais.
$ cat conversionMap.txt
//
// Mapa de Conversão do SwiftShield
// Modo automático para SwiftSecurity, 2020-01-02 13.51.03
// Desofusque logs de crash (ou qualquer arquivo de texto) executando:
// swiftshield -deobfuscate ARQUIVO_CRASH -deobfuscate_map ESTE_ARQUIVO
//
ViewController ===> hTOUoUmUcEZUqhVHRrjrMUnYqbdqWByU
viewDidLoad ===> DLaNRaFbfmdTDuJCPFXrGhsWhoQyKLnO
sceneDidBecomeActive ===> SUANAnWpkyaIWlGUqwXitCoQSYeVilGe
AppDelegate ===> KftEWsJcctNEmGuvwZGPbusIxEFOVcIb
Deny_Debugger ===> lKEITOpOvLWCFgSCKZdUtpuqiwlvxSjx
Button_Emulator ===> akcVscrZFdBBYqYrcmhhyXAevNdXOKeG
Isso é necessário para desofuscar logs de crash criptografados.
Outro projeto de exemplo está disponível no repositório Github do SwiftShield, que pode ser usado para testar a execução do SwiftShield.