Pular para o conteúdo principal

Ferramentas e Procedimentos

Acho importante apresentar as principais ferramentas que apoiam a engenharia reversa de apps iOS. Peguei essas informações na página The Apple Wiki, Reverse Engineering Tools, traduzi e organizei em duas frentes, análise estática e análise dinâmica, do mesmo jeito que a wiki original divide o assunto.

aviso

Gostaria de deixar avisado, que você não precisa ter e conhecer todas essas ferramentas. Eu as listei aqui para servir de consulta. Quando você se deparar com algum problema, este pode ser o local onde você procura ferramentas úteis.

Análise estática

ipsw

O ipsw, que vamos usar em detalhe nos próximos tópicos, é uma ferramenta praticamente completa, capaz de fazer boa parte do que todas as outras ferramentas desta seção fazem, e mais um pouco. É escrito em Go e roda em macOS, com suporte parcial em Linux.

Ferramentas de dump de classes e metadados

Antes de existir uma ferramenta como o ipsw, o processo de dump de classes Objective-C dependia de um conjunto maior de ferramentas específicas, que ainda valem a pena conhecer.

  • developer.limneos.net: site com headers de iOS já extraídos e disponíveis para consulta, cobrindo várias versões do sistema.
  • nst/iOS-Runtime-Headers: repositório no GitHub com o mesmo tipo de header, hospedado onde a busca do próprio GitHub facilita a pesquisa.
  • 0cyn/ktool: ferramenta multiplataforma para dump de classes Objective-C e geração de headers, rodando em Windows, macOS, Linux, iOS e Android. Além do dump, permite navegar por load commands e segments de um binário Mach-O, e inserir ou substituir load commands.
  • DerekSelander/dsdump: ferramenta compatível com macOS e iOS, com o diferencial de também conseguir dumpar metadados Swift, funcionando como uma versão melhorada do nm combinado com dump de classes ObjC e Swift.
  • class-dump, class_dump_z e classdump-dyld: dado um executável, geram arquivos de header com as interfaces das classes presentes nele. O classdump-dyld tem a vantagem de rodar direto no dispositivo, útil para dumpar frameworks privados sem precisar de um Mac com Xcode.

Descriptografia de apps da App Store

Apps baixados da App Store vêm criptografados por padrão, o que exige uma etapa de descriptografia antes de qualquer análise estática do binário. O flexdecrypt é notável por não exigir que o app seja executado para descriptografar o executável. Outras opções conhecidas são o Clutch e o dumpdecrypted.

Extração do dyld_shared_cache

Todas as bibliotecas do sistema, privadas e públicas, ficam combinadas em um único arquivo de cache para melhorar performance, o dyld_shared_cache. Para extrair conteúdo de um cache estático, a ferramenta recomendada é o DyldExtractor, que funciona em qualquer plataforma.

Desmontadores e decompiladores

Disassemblers são úteis quando é preciso uma análise mais profunda de um binário. Além de desmontar, gerando código assembly, algumas dessas ferramentas também decompilam, entregando um pseudocódigo em C próximo do original.

  • IDA Pro: talvez o desmontador mais tradicional do mercado, com décadas de desenvolvimento e suporte a uma quantidade enorme de arquiteturas de processador. Existe em versões pagas de diferentes preços, da versão completa até uma versão gratuita limitada a x86 e x86_64.
  • Hopper: alternativa mais barata ao IDA, com boa experiência de uso, mas com limitações reais para iOS, como debugging local restrito a x64 e um pseudocódigo mais difícil de editar.
  • Ghidra: ferramenta gratuita e poderosa, lançada pela NSA. O pseudocódigo gerado é comparável ao do IDA, e para quem não tem orçamento para licenças caras, o Ghidra já é suficiente para praticamente qualquer análise.
  • BinaryNinja: desmontador mais recente, com API em Python e C++ e boa capacidade de extensão via plugins.
  • jtool: utilitário de linha de comando para análise estática de caches Mach-O, objetos e arquivos.
  • otool: exibe partes específicas de arquivos objeto ou bibliotecas, e também consegue desmontar código, sendo um dos utilitários mais usados no dia a dia de análise de binários Mach-O.

strings e nm

O strings imprime todas as strings legíveis presentes em um binário, uma forma rápida de encontrar URLs, chaves hardcoded ou mensagens de erro reveladoras. O nm exibe a tabela de símbolos de um binário, mostrando funções e variáveis exportadas, o que ajuda a mapear a superfície de código antes de partir para um desmontador.

Análise dinâmica

As ferramentas a seguir servem para analisar um programa enquanto ele está em execução.

  • GDB e LLDB: debuggers clássicos, usados para entender o que causa um crash, obter backtraces em pontos específicos da execução e inspecionar o estado do processo em tempo real.
  • Cycript: permite rodar código próprio dentro de um processo já anexado, com uma sintaxe parecida com JavaScript. É útil tanto para inspecionar a hierarquia de views de um app quanto para prototipar hooks rapidamente, embora hoje em dia o Frida tenha assumido boa parte desse espaço.
  • objtree: mostra árvores completas de chamadas de métodos Objective-C dentro do escopo de uma função, no mesmo estilo do frida-trace.
  • xpcspy: intercepta comunicação entre processos feita via XPC.
  • Logify: a partir de um header de interface Objective-C, gera um arquivo Logos que loga automaticamente a chamada de cada método daquela classe no syslog, o que dá uma visão rápida de quando e com quais parâmetros cada método é chamado durante o uso normal do app.
  • InspectiveC: loga hierarquias de mensagens entre objetos, classes e seletores, útil para entender o funcionamento de um método sem precisar mergulhar direto no assembly.

Debug visual de interface

  • Reveal: app de macOS para debug de UI, com uma experiência parecida com o storyboard do Xcode e edição de layout em tempo real. Tem histórico de problemas de performance em versões recentes.
  • Lookin: alternativa gratuita ao Reveal, com performance melhor e mais recursos na maioria dos casos.
  • FLEX: ferramenta de debug e exploração embutida no próprio app, carregada dinamicamente, que permite inspecionar view hierarchy, dados e estado direto na tela do dispositivo.

Referências