電子データフォレンジック Android APK 分析

どれも比較的基礎的な知識であり、学習記録を残すことが目的ですので、不足があれば修正していただいて結構です。

1. Android APKの概念


APK(Android アプリケーション パッケージ)とは、Android アプリケーション パッケージを指します。Android システム内のファイル形式であり、Android アプリケーション ファイルをパッケージ化するために使用されます。APK ファイルには、静的リソース ファイル (assets)、ライブラリ ファイル (lib)、署名ファイル (META-INF)、コンパイル済みリソース ファイル (res)、構成マニフェスト ファイル (AndroidManifest.xml) など、アプリケーションのすべてのファイルが含まれています。コア コード ファイル (classes.dex)、リソース マッピング ファイル (resources.arsc) など。

アセット: 静的リソース ファイル (写真、ビデオなど) はこのフォルダーにはコンパイルされません。
lib: .so ライブラリ、システム ライブラリ、自己パッケージ化ライブラリ。暗号化/トークン生成方法を .so ファイル
META-INF: 署名情報に入れる人もいます。
res: リソース ファイル (静的テキスト、画像、キー リソース) 中国語、コンパイルされます。例: 中国語の
AndroidManifest.xml: 構成情報 (キー)、たとえばアクセス許可の変更
class.dex: Android dalvik 仮想マシンの実行可能ファイル
resource.arsc: リソースのインデックス/対応するファイル

2. 構成リストファイルの概要


AndroidManifest.xml ファイルは、構成マニフェスト ファイルであり、アプリケーションのマニフェスト情報を記述するコンパイル済みファイルです。パッケージ名、アプリケーション名、権限、4 つの主要な Android コンポーネント、バージョンなどの重要な情報がすべてここにリストされます。

アプリケーションをパッケージ化すると、AndroidManifest.xml ファイルが自動的に生成され、APK ファイルにパッケージ化されます。アプリをインストールすると、Android システムはこのファイルを読み取り、アプリの基本情報と権限要件を判断します。

開発者は、ネットワークへのアクセス、ファイルへのアクセス、カメラへのアクセスなど、アプリケーションによって使用される権限を AndroidManifest.xml ファイルで宣言できます。アプリケーションがインストールされると、ユーザーはこれらのアクセス許可の説明を確認し、アプリケーションにこれらのアクセス許可の使用を許可するかどうかを決定します。

AndroidManifest.xml ファイルは、アクティビティ、サービス、ブロードキャスト レシーバーなど、アプリケーションの主要コンポーネントを宣言するためにも使用されます。これらのコンポーネントは、Android アプリケーションの 4 つの主要コンポーネントの一部であり、アプリケーションの機能の実装を担当します。

3. 静的リソースファイル

静的リソース ファイルとは、主にアセット フォルダーに保存されているファイルを指します。アセット フォルダーは、APK ファイルにパッケージ化されているコンパイルされていないアセットのディレクトリであり、アプリケーションのインストール後にアクセスできます。アセット フォルダー内のファイルは解凍されません。つまり、ファイルへのアクセスは速くなりますが、インストール パッケージ内でより多くのスペースを占めることになります。通常、開発者は、アプリケーション内で頻繁に変更されない静的ファイル、構成ファイル、生データ、またはその他のファイルをアセット フォルダーに配置します。これにより、アプリのダウンロード サイズが小さくなり、ファイルへのアクセスが高速になります。静的リソースのアセットフォルダーには、いくつかの画像 (jpg、png、gif など) が保存される場合があります。また、js ファイルも保存される場合があります。

4. ライブラリファイル

ライブラリファイルとは主にlibフォルダ内のファイルを指し、このフォルダ内にはアプリの実行に必要なダイナミックリンクライブラリのバイナリファイルが格納されています。さまざまな Android システム プロセッサ バージョンに適応するために、lib フォルダ内の so ライブラリもさまざまなプロセッサ バージョンのフォルダに応じて配置されます。図 3 の例では、armeabi、armeabi-v7a、x86 フォルダーの 3 つのフォルダーに分割されており、それぞれ arm5 アーキテクチャ、arm7 アーキテクチャ、および Intel32 アーキテクチャに適合した Android システムの CPU プロセッサ バージョンを格納するために使用されます。たとえば、スマートフォンが Android システムの arm7 アーキテクチャ CPU プロセッサ バージョンを使用している場合、APP は実行中に armeabi-v7a フォルダ内のダイナミック リンク ライブラリ ファイルを呼び出してプログラムを実行します。

Android システムには 2 種類のライブラリ ファイルがあり、1 つは共有ライブラリ ファイル (Shared Libraries)、もう 1 つはネイティブ ライブラリ ファイル (Native Libraries) です。共有ライブラリ ファイルは、複数のアプリケーションで使用できるライブラリであり、システム ディレクトリに保存されます。Android システムでは、共有ライブラリ ファイルには .so 接尾辞が付き、一般的な共有ライブラリ ファイルには libc.so および libm.so が含まれます。

lib フォルダーにはローカル ライブラリ ファイルが保存されます。ネイティブ ライブラリは、アプリケーションによって特別に使用されるライブラリであり、APK ファイルにパッケージ化され、アプリケーションのインストール後にプライベート ディレクトリに配置されます。Android システムでは、ローカル ライブラリ ファイルにもサフィックス .so が付いています。armeabi-v7a の so ファイルの例を図 4 に示します。Android アプリケーションの場合、ローカル ライブラリ ファイルは多くの場合、アプリケーションに固有であり、他のアプリケーションでは使用されません。たとえば、アプリケーションはネイティブ ライブラリを使用して特定のハードウェア アクセス機能をカプセル化したり、ネイティブ ライブラリを使用して暗号化および復号化操作を実行したりする場合があります。

5. 署名書類

署名ファイルは、META-INF フォルダーに保存されているファイルを指します。META-INF フォルダーは、Android システム内の特別なフォルダーであり、アプリケーションの署名情報を保存するために使用されます。META-INF フォルダには、CERT.RSA、CERT.SF、MANIFEST.MF という 3 つの共通ファイルがあります。META-INF フォルダの例を図 5 に示します。CERT.RSA と CERT.SF の 2 つのファイルは、アプリケーションの署名情報を保存するために使用されます。アプリケーションがインストールされると、Android システムはこれら 2 つのファイルをチェックして、アプリケーションの整合性とセキュリティを確認します。MANIFEST.MF ファイルは、アプリケーション内のすべてのファイルのマニフェスト情報を保存するために使用されます。

アプリケーションをパッケージ化するときに、これらのファイルが自動的に生成され、APK ファイルにパッケージ化されます。通常、これらのファイルを手動で変更する必要はありませんが、アプリケーションのバージョン番号を更新したり、権限要件を変更したりするために、これらのファイルを編集する必要がある場合があります。

META-INF フォルダーは、APK のインストール時に検証資格情報として使用される署名証明書の保存に使用され、APK を悪意のある改ざんから保護するために使用され、APK の著作権と所有権の宣言でもあります。たとえば、インストール パッケージ内のファイルを変更すると、Android システムが計算した署名情報と APK ファイルに保存されている署名情報に不一致が発生し、最終的にはインストールできなくなり、署名の競合が発生します。

6. リソースファイルをコンパイルする

コンパイルされたリソース ファイルとは、主に res フォルダーに保存されているファイルを指します。res フォルダーにはリソース ファイルも格納されますが、assets フォルダーとは異なり、コンパイルされたリソース ファイルがここにあります。直接開くと文字化けが表示される場合があります。res フォルダーには多くのサブフォルダーがあり、各サブフォルダーは特定の種類のリソース ファイルを保存するために使用されます。res フォルダーの例を図 6 に示します。主なフォルダーには、ドローアブル フォルダー、レイアウト フォルダー、および値フォルダーが含まれます。

ドローアブル フォルダーは、ビットマップ ファイル (.png、.jpg、.gif など) やベクター ファイル (.svg) などの画像リソース ファイルを保存するために使用されます。

レイアウト フォルダーは、アプリケーションのインターフェイス構造を記述するレイアウト ファイルを保存するために使用されます。

値フォルダーは、アプリケーションで使用される定数値と色情報を保存するために使用される値リソース ファイルを保存するために使用されます。

Android システムでは、すべてのリソース ファイルを res フォルダーに保存し、特定のファイル名とフォルダー名を使用する必要があります。この利点は、Android システムが各リソース ファイルに一意のリソース ID を自動的に割り当てるため、Android システムがこれらのリソースを簡単に参照できることです。

7. コアコードファイル

コア コード ファイルは主に、classes.dex ファイルを参照します。class.dex ファイルは Android システムの重要なコード ファイルであり、Dalvik 実行可能ファイルの略称です。Dalvik は Android システム内の仮想マシンであり、Android システム内でアプリケーション コードを実行します。class.dex ファイルは、Dalvik 仮想マシン上で実行されるコア コード ファイルであり、その逆コンパイル言語は smali コード言語であり、smali コードは Java コードに変換できます。大きな APK ファイルの場合、複数の dex ファイルが表示されますが、実際の APP の実行プロセスでは、複数の dex ファイルが 1 つの dex ファイルにマージされて操作されます。APK をパッケージ化するときに複数の dex が保存される理由は、各 dex ファイルのサイズが制限されているためです。

.dex ファイルには、Java コンパイラによってコンパイルされたマシンコードである Java バイトコードが保存されます。.dex ファイル自体は、バイトコードを格納するために特別な形式を使用するバイナリ ファイルです。

Android アプリケーションをパッケージ化すると、.dex ファイルが自動的に生成され、APK ファイルにパッケージ化されます。アプリケーションをインストールすると、.dex ファイルが解凍されてプライベート ディレクトリに配置され、Dalvik 仮想マシンによってロードされて実行されます。

.dex ファイルの利点は、Java バイトコード ファイルをより小さく圧縮できるため、アプリケーションのダウンロード サイズを小さくできることです。ただし、.dex ファイルの欠点は、共有ライブラリ ファイルよりもアクセスが若干遅いことです。したがって、Androidシステムでは、アプリケーションの機能を実装するために可能な限り共有ライブラリファイルを使用するのが一般的です。

8. リソースマッピングファイル

resource.arsc ファイルは Android システムの特別なファイルで、アプリケーションのリソース テーブルを保存するために使用されます。リソース テーブルは、アプリケーションのリソース ID とリソース タイプの間のマッピング関係を含むバイナリ ファイルです。

Android システムでは、すべてのリソース ファイルを res フォルダーに保存し、特定のファイル名とフォルダー名を使用する必要があります。アプリケーションをコンパイルすると、コンパイラーは res フォルダー内のリソース ファイルをリソース テーブルにコンパイルし、そのリソース テーブルを APK ファイルにパッケージ化します。

resource.arsc ファイルの利点は、リソース テーブル ファイルをより小さく圧縮できるため、アプリケーションのリソース ファイルを小さくできることです。ただし、resources.arsc ファイルの欠点は、通常のテキスト ファイルよりもアクセスが若干遅いことです。したがって、Android システムでは、アプリケーションのリソース情報を保存するために通常のテキスト ファイルが一般的に使用されます。

resource.arsc ファイルは単なる補助ファイルであり、それ自体には実際の意味はないことに注意してください。アプリケーションは通常、リソース ID を使用してこのリソース マッピング テーブル内の対応するリソースを検索し、対応するパラメーターを取得します。

9. APKの静的解析


1. jadx または jeb による静的分析。jadx の方が推奨されます。これはグローバルに検索され、自動的にコンパイルされます。 2.
静的分析を通じて、manifest.xml ファイルに注意してください。これはエントリ ファイルに似ています。パッケージ名 (パッケージ名を含む)。ユーザー権限の場合、キーワード MAIN および LAUNCHER を使用して、上位レベルのアクティビティと main 関数のエントリ アドレスを見つけることができます。さらに詳しい分析は main 関数で実行する必要があります。
 

10. APKの動的分析

1. ルート化された携帯電話を準備する必要があります。Android の最適なバージョンは 6 または 7 です。

2. 動的分析、パケット キャプチャ ツールは fiddler を推奨します。これは、fiddler は HTTPS 暗号化の前に動作し、モバイル APK パケット キャプチャ分析により適しているためです; 3. Jadx 分析、
main 関数を見つけて、最初に oncreat メソッドを見つけます。

11. APKのパッケージ化と解凍

1. 1 つはハード シェル、もう 1 つは動的シェルです。

2. HOOK テクノロジーはフック機能です。

12.フリーダフックのapk分析


1. すべてのツール:
ida 逆コンパイル ツール
Python
Frida
adb
jadx_gui
db sqlite アプリ用ブラウザ データベース表示ツール
Thunderbolt シミュレーター 4.x (最初に実マシンをルート)
復号化ツールまたは Web サイト
2. コンピューター ベースのサーバー: frida Python javascript ベースのフック フレームワーク
    - Python 環境は 3.7 以降を推奨
    - Frida モジュールをインストールします pip install frida== 15.0.8
    - frida-tools モジュールをインストールします pip install frida-tools==10.0.0
    Frida と frida-tools の対応関係は github で見つけることができます。上記の関係は互いに対応しています。
3. 携帯電話ベースのクライアント:
    ----携帯電話またはシミュレータに frida_server をインストールし、GitHub でダウンロードします
。github.com/frida/frida/releases で対応するバージョンを見つけます。----adb シェルを次の場所に追加します。プログラム。権限:
       chmod 777 Frida_server
      ./frida_server

おすすめ

転載: blog.csdn.net/weixin_47401101/article/details/130308187