Aplicativo de engenharia reversa para Android 101

  1. Introdução
  2. Fundamentos do Aplicativo Andróide
  3. Aplicações de engenharia reversa para Android
    • Exercício 1
  4. Aplicações de engenharia reversa para Android – DEX Bytecode
    • Exercício 2
    • Exercício 3
    • Exercício 4
  5. Aplicações Android de engenharia inversa – Bibliotecas nativas
    • Exercício 5
    • Exercício 6
  6. Engenharia reversa Android Apps – Obfuscao
    • Exercicio 7
  7. Conclusao

Build an App

Uma das minhas maiores sugest?es para pessoas que procuram fazer engenharia reversa, o que quer que sejam, é tentar construir o que você quer reverter. No caso do Android, você tem sorte porque há muitos recursos gratuitos disponíveis para construir sua primeira aplicação. Se você nunca construiu um aplicativo Android antes, sugiro que você comece por aí. Escolha qualquer um dos tutoriais e vídeos disponíveis que despertam o seu interesse e comece a construir. Quando você entende como um desenvolvedor constrói algo, fica muito mais fácil entender como fazer engenharia reversa.

Fundamentals Review

Great! Você construiu um aplicativo ou aprendeu princípios básicos de desenvolvimento de aplicativos Android. Aqui está uma revisão de alguns dos pontos importantes. Esta página “Fundamentos do aplicativo” nos documentos dos desenvolvedores do Android é uma ótima revisão.

  • As aplicações Android estão no formato de arquivo APK. O APK é basicamente um arquivo ZIP. (Você pode renomear a extensão do arquivo para .zip e usar unzip para abrir e ver seu conteúdo.)
  • APK Contents (Not exhaustive)
    • AndroidManifest.xml
    • META-INF/
      • Certificado vive aqui!
    • classes.dex
      • Dalvik bytecode para aplicação no formato de arquivo DEX. Este é o código Java (ou Kotlin) que a aplicação irá executar por padrão.
    • lib/
      • Bibliotecas nativas para a aplicação, por padrão, vivem aqui! Sob o diretório lib/, existem os diretórios específicos da cpu. Ex: armeabi, mips,
    • assets/
      • Outros arquivos que podem ser necessários para o app.
      • Bibliotecas nativas adicionais ou arquivos DEX podem ser incluídos aqui. Isto pode acontecer especialmente quando autores de malware querem tentar “esconder” código adicional, nativo ou Dalvik, não o incluindo nos locais padrão.

Dalvik & Smali

A maioria dos aplicativos Android são escritos em Java. Kotlin também é suportado e interoperável com Java. Para facilitar, para o resto deste workshop, quando eu me refiro a “Java”, você pode assumir que eu quero dizer “Java ou Kotlin”. Em vez do código Java ser executado em Java Virtual Machine (JVM) como aplicações desktop, no Android, o Java é compilado para o formato bytecode Dalvik Executable (DEX). Para versões anteriores do Android, o bytecode foi traduzido pela máquina virtual Dalvik. Para versões mais recentes do Android, é usado o Android Runtime (ART).
Se os desenvolvedores, escrevem em Java e o código é compilado para DEX bytecode, para engenharia reversa, trabalhamos na direção oposta.

Smali é a versão legível para humanos do bytecode Dalvik. Tecnicamente, Smali e baksmali são o nome das ferramentas (assembler e disassembler, respectivamente), mas no Android, usamos frequentemente o termo “Smali” para nos referirmos às instruções. Se você já fez engenharia reversa ou arquitetura de computador em código C/C++ compilado. SMALI é como a linguagem assembly: entre o código fonte de nível superior e o bytecode.

Para o seguinte Olá Mundo código Java:

public static void printHelloWorld() {System.out.println("Hello World")}

O código Smali seria:

.method public static printHelloWorld()V.registers 2sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;const-string v1, "Hello World"invoke-virtual {v0,v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)Vreturn-void.end method

O conjunto de instruções Smali está disponível aqui.

A maioria das vezes quando aplicações Android de engenharia reversa, você não precisará trabalhar em Smali. A maioria das aplicações pode ser elevada a um nível ainda mais elevado, descompilado Java. Como todas as ferramentas, os descompiladores Java podem ter bugs. Minha sugestão para você é que sempre que a saída do Java descompilado parecer questionável, olhe para a saída Smali. Trabalhe linha por linha com a referência da instrução para descobrir o que o código está fazendo.

Para obter o Smali do DEX, você pode usar a ferramenta baksmali (disassembler) disponível em https://github.com/JesusFreke/smali/wiki. A ferramenta smali permitirá que você monte o smali de volta ao DEX.

Pontos de entrada da aplicação

Um dos pontos mais importantes da engenharia reversa é saber onde começar sua análise e pontos de entrada para execução do código é uma parte importante disso.

Atividade do lançador

Atividade do lançador é o que a maioria das pessoas pensa como o ponto de entrada para uma aplicação Android. A atividade do lançador é a atividade que é iniciada quando um usuário clica no ícone de um aplicativo. Você pode determinar a atividade do lançador olhando para o manifesto do aplicativo. A atividade de lançamento terá as seguintes intenções PRINCIPAIS e LOCALIZADORAS listadas.

Cutem em mente que nem todas as aplicações terão uma atividade de lançamento, especialmente as aplicações sem uma IU. Exemplos de aplicações sem uma IU (e portanto uma atividade de lançador) são aplicações pré-instaladas que executam serviços em segundo plano, tais como correio de voz.

<activity android:name=".LauncherActivity"><intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter></activity>

Serviços

Serviços executados em segundo plano sem uma IU. Há uma miríade de maneiras que eles podem ser iniciados e, portanto, são um ponto de entrada para aplicações. A forma padrão de um serviço ser iniciado como um ponto de entrada para uma aplicação é através de Intents.

Quando a startService API é chamada para iniciar um serviço, o método onStart no serviço é executado.

Receptores de Broadcast

Broadcasts podem ser pensados num sistema de mensagens e os receptores de broadcast são os ouvintes. Se uma aplicação registou um receptor para uma emissão específica, o código nesse receptor é executado quando o sistema envia a emissão. Existem 2 formas de um aplicativo registrar um receptor: no Manifesto do aplicativo ou registrado dinamicamente no código do aplicativo usando a chamada API registerReceiver()

Em ambos os casos, para registrar o receptor, os filtros de intenção para o receptor são definidos. Estes filtros de intenção são as transmissões que devem acionar o receptor.

Quando as transmissões específicas para as quais o receptor está registrado são enviadas, onReceive na classe BroadcastReceiver é executado.

Componentes Exportados (Serviços & Atividades)

Serviços e Atividades também podem ser “exportados”, o que permite que outros processos no dispositivo iniciem o serviço ou iniciem a atividade. Os componentes são exportados através da definição de um elemento no manifesto, como abaixo. Por padrão, android:exported="false" a menos que este elemento esteja definido como verdadeiro no manifesto ou que os filtros de intenção estejam definidos para a Atividade ou Serviço.

<service android:name=".ExampleExportedService" android:exported="true"/><activity android:name=".ExampleExportedActivity" android:exported="true"/>

Subclasse de Aplicação

Aplicações Androide podem definir uma subclasse de Aplicação. As aplicações podem, mas não têm de definir uma subclasse personalizada de Aplicação. Se um aplicativo Android define uma subclasse de Aplicativo, essa classe é instanciada antes de qualquer outra classe no aplicativo.

Se o método attachBaseContext estiver definido na subclasse Aplicativo, ele é chamado primeiro, antes do método onCreate.

NEXT > 3. Começando com a inversão de aplicativos Android

Deixe uma resposta

O seu endereço de email não será publicado.