- Introduction
- Android Application Fundamentals
- Getting Started with Reverse Android Apps
- Exercise 1
Reverse Engineering Android Apps – Reverse Engineering Android Apps (Android) DEXバイトコード
- Exercise 2
- Exercise 3
- Exercise 4
- 実習5
- 実習6
- Exercise 7
Build an App
私がリバース エンジニアを目指す人々に最もお勧めすることの 1 つがあります。 どんなものであれ、リバースしたいものを作ってみることです。 Androidの場合、幸運なことに、最初のアプリケーションを作るために利用できる無料のリソースがたくさんあります。 もし、あなたがAndroidのアプリケーションを作ったことがないのであれば、そこから始めることをお勧めします。 チュートリアルやビデオの中から、興味をひかれるものを選んで、さっそく作ってみてください。 開発者がどのように何かを構築しているかを理解すると、それをリバース エンジニアリングする方法をより簡単に理解できるようになります。 アプリを構築したり、Android アプリ開発の基本的な原則を学んだりしましたね。 ここでは、重要なポイントのいくつかを復習します。 Android 開発者のドキュメントにあるこの「アプリケーションの基礎」ページは、素晴らしい復習になります。
- Android のアプリケーションは APK ファイル形式になっています。 APKは基本的にZIPファイルです。 (拡張子を .zip に変更し、unzip で開いて中身を見ることができます。)
- APK Contents (Not exhaustive)
- AndroidManifest.xml
- META-INF/
- 証明書はここにあります!
- classes.dex
- DEXファイル形式のアプリケーション用のDalvikバイトコードです。 これは、アプリケーションがデフォルトで実行する Java (または Kotlin) コードです。
- lib/
- アプリケーション用のネイティブ ライブラリ (デフォルトではここにあります)! lib/ ディレクトリの下には、CPU ごとのディレクトリがあります。 例: armeabi、mips、
- assets/
- アプリで必要とされるその他のファイル。
- 追加のネイティブ ライブラリまたは DEX ファイルがここに含まれることもあります。 これは、マルウェアの作成者が、ネイティブまたは Dalvik の追加コードをデフォルトの場所に含めないことで、「隠蔽」しようとする場合に特に起こります。
Dalvik & Smali
ほとんどの Android アプリは Java で書かれています。 Kotlinもサポートされており、Javaと相互運用が可能です。 簡単に説明するために、このワークショップの残りの部分では、私が「Java」と言及する場合、「JavaまたはKotlin」を意味すると考えてください。 デスクトップアプリケーションのようにJavaコードをJava Virtual Machine(JVM)で実行するのではなく、Androidでは、JavaはDalvik Executable(DEX)バイトコード形式にコンパイルされます。 Androidの以前のバージョンでは、バイトコードはDalvik仮想マシンによって翻訳されていました。 開発者が Java で記述し、コードが DEX バイトコードにコンパイルされた場合、リバース エンジニアリングのために、逆の作業を行います。
Smali は、Dalvik バイトコードの人間が読めるバージョンです。 技術的には、Smali と baksmali はツール (それぞれアセンブラとディスアセンブラ) の名前ですが、Android では、命令のことを指して「Smali」と呼ぶことがよくあります。 コンパイルされたC/C++のコードに対してリバースエンジニアリングやコンピュータアーキテクチャを行ったことがある方ならお分かりでしょう。 SMALI はアセンブリ言語のようなものです。上位レベルのソース コードとバイトコードの間にあります。
次の Hello World Java コードでは、
public static void printHelloWorld() {System.out.println("Hello World")}
Smali コードは次のようになります。
.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
Smali 命令セット はここで利用可能です。
ほとんどの場合、Android アプリケーションをリバース エンジニアリングする場合、Smali で作業する必要はないでしょう。 ほとんどのアプリケーションは、Java を逆コンパイルした、さらに高いレベルに引き上げることができます。 すべてのツールと同様に、Java デコンパイラーにもバグがある可能性があります。 私からの提案は、逆コンパイルされた Java 出力が疑わしい場合はいつでも、Smali の出力を見てください。 コードが何をしているかを把握するために、命令参照で一行ずつ作業します。
DEXからSmaliを取得するには、https://github.com/JesusFreke/smali/wikiで利用できるbaksmaliツール(ディスアセンブラ)を使用できます。 Smali ツールを使用すると、DEX に戻って Smali をアセンブルできます。
Application Entry Points
リバース エンジニアリングの最も重要なポイントの 1 つは、どこから分析を開始するかを知ることで、コード実行のエントリ ポイントはその重要な一部です。
Launcher Activity
ほとんどの人が Android アプリケーションへのエントリ ポイントとして考えているものはランチャーのアクティビティです。 ランチャーアクティビティは、ユーザーがアプリケーションのアイコンをクリックしたときに開始されるアクティビティです。 ランチャーアクティビティは、アプリケーションのマニフェストを見ることで判断できます。 ランチャー アクティビティには、次の MAIN および LAUNCHER インテントが記載されています。
すべてのアプリケーションがランチャー アクティビティを持つわけではないこと、特に UI のないアプリケーションであることに留意してください。 UI のない (したがってランチャー アクティビティのない) アプリケーションの例としては、ボイスメールなど、バックグラウンドでサービスを実行するプリインストールされたアプリケーションなどがあります。 サービスを開始する方法は無数にあり、したがって、アプリケーションのエントリ ポイントになります。
サービスを開始するために
startService
API が呼び出されると、サービス内のonStart
メソッドが実行されます。Broadcast Receivers
ブロードキャストはメッセージング システムと考えることができ、ブロードキャスト受信者はリスナーである。 アプリケーションが特定のブロードキャストに対してレシーバーを登録した場合、システムがブロードキャストを送信すると、そのレシーバー内のコードが実行されます。 アプリが受信者を登録する方法は 2 つあります。アプリの Manifest に登録するか、
registerReceiver()
API 呼び出しを使用してアプリのコードに動的に登録します。いずれの場合も、受信者を登録するには、受信者のインテント フィルターが設定されます。
受信機が登録されている特定の放送が送信されると、BroadcastReceiver クラスの
onReceive
が実行されます。Exported Components (Services & Activities)
サービスおよびアクティビティを「エクスポート」して、デバイスの他のプロセスがサービスを開始したりアクティビティを開始することも可能です。 コンポーネントは、以下のようにマニフェストで要素を設定することによりエクスポートされます。 デフォルトでは、マニフェストでこの要素が true に設定されているか、アクティビティまたはサービスに対してインテント フィルタが定義されていない限り、
android:exported="false"
です。<service android:name=".ExampleExportedService" android:exported="true"/><activity android:name=".ExampleExportedActivity" android:exported="true"/>
Application Subclass
Android アプリケーションでは、アプリケーションのサブクラスを定義することができます。 アプリケーションは Application のカスタム サブクラスを定義することができますが、定義する必要はありません。
アプリケーションのサブクラスで
attachBaseContext
メソッドが定義されている場合、onCreate
メソッドの前に最初に呼び出されます。NEXT > 3.Getting Started with Reversing Android Apps