アップデート一覧に戻る
New releaseSep 11, 2026

ALEAPP v2026.3.3

Android ログ、イベント、Protobuf パーサー

共有

ALEAPP

Android Logs Events And Protobuf Parser(Androidログ・イベント・Protobufパーサー)

コントリビュートしたい場合はこちらまで: https://abrignoni.github.io

ブログ記事はこちら: https://leapps.org/blog

要件

Python 3.10 以上

依存関係

Python環境の依存関係は requirements.txt に記載されています。以下のコマンドでインストールしてください。 環境に合わせて py の部分が正しいことを確認してください(例: pypythonpython3 など)。

py -m pip install -r requirements.txt または pip3 install -r requirements.txt

Linux で実行する場合は、tkinter も別途インストールする必要があります:

sudo apt-get install python3-tk

実行可能ファイルへのコンパイル

Pythonがインストールされていないシステムで実行できるように、実行可能ファイルにコンパイルする方法です。

Windows OS

aleapp.exe を作成するには、以下を実行:

pyinstaller scripts\pyinstaller\aleapp.spec

aleappGUI.exe を作成するには、以下を実行:

pyinstaller scripts\pyinstaller\aleappGUI.spec

macOS

aleapp を作成するには、以下を実行:

pyinstaller scripts/pyinstaller/aleapp_macOS.spec

aleappGUI.app を作成するには、以下を実行:

pyinstaller scripts/pyinstaller/aleappGUI_macOS.spec

Linux

aleapp を作成するには、以下を実行:

pyinstaller scripts/pyinstaller/aleapp_Linux.spec

aleappGUI を作成するには、以下を実行:

pyinstaller scripts/pyinstaller/aleappGUI_Linux.spec

使用方法

CLI

$ python aleapp.py -t <zip | tar | fs | gz> -i <抽出データへのパス> -o <レポート出力先パス>

GUI

$ python aleappGUI.py

ヘルプ

$ python aleapp.py --help

アーティファクトプラグインへのコントリビュート

各プラグインはPythonソースファイルであり、scripts/artifacts フォルダに追加する必要があります。このフォルダはALEAPPが実行されるたびに動的に読み込まれます。

プラグインのソースファイルには、モジュールの先頭に __artifacts_v2__ という名前の辞書が含まれている必要があります。この辞書はプラグインが処理するアーティファクトを定義します。__artifacts_v2__ 辞書のキーは、ALEAPP内で一意である必要があるアーティファクトのIDである必要があります。値は以下のキーを含む辞書である必要があります:

  • name: アーティファクトの名前(文字列)。
  • description: アーティファクトの説明(文字列)。
  • author: プラグインの作者(文字列)。
  • version: アーティファクトのバージョン(文字列)。
  • date: アーティファクトの最終更新日(文字列)。
  • requirements: アーティファクトの処理に必要な要件(文字列)。
  • category: アーティファクトのカテゴリ(文字列)。
  • notes: 追加のメモ(文字列)。
  • paths: プラグインがアーティファクトに対して期待するデータのパスに一致するglob検索パターンを含むタプル(文字列)。
  • function: アーティファクト処理のエントリポイントとなる関数の名前(文字列)。

例:

__artifacts_v2__ = {
    "cool_artifact_1": {
        "name": "Cool Artifact 1",
        "description": "Extracts cool data from database files",
        "author": "@username",
        "version": "0.1",
        "date": "2022-10-25",
        "requirements": "none",
        "category": "Really cool artifacts",
        "notes": "",
        "paths": ('*/com.android.cooldata/databases/database*.db',),
        "function": "get_cool_data1"
    },
    "cool_artifact_2": {
        "name": "Cool Artifact 2",
        "description": "Extracts cool data from XML files",
        "author": "@username",
        "version": "0.1",
        "date": "2022-10-25",
        "requirements": "none",
        "category": "Really cool artifacts",
        "notes": "",
        "paths": ('*/com.android.cooldata/files/cool.xml',),
        "function": "get_cool_data2"
    }
}

__artifacts__ 辞書でエントリポイントとして参照される関数は、以下の引数を取る必要があります:

  • 処理対象として見つかったファイルのイテラブル(文字列として)
  • ALEAPPの出力フォルダのパス(文字列として)
  • ファイルを見つけたシーカー(FileSeekerBase型)
  • プラグインがテキストの折り返しを行うことが期待されているかどうかを示すブール値

例:

def get_cool_data1(files_found, report_folder, seeker, wrap_text):
    pass  # do processing here

プラグインは一般的に、ALEAPPのHTML出力形式、TSVで出力し、必要に応じてタイムラインにレコードを送信することが期待されます。この出力を生成するための関数は、artifact_report モジュールと ilapfuncs モジュールにあります。 大まかに言うと、例は次のようになります:

__artifacts_v2__ = {
    "cool_artifact_1": {
        "name": "Cool Artifact 1",
        "description": "Extracts cool data from database files",
        "author": "@username",  # Replace with the actual author's username or name
        "version": "0.1",  # Version number
        "date": "2022-10-25",  # Date of the latest version
        "requirements": "none",
        "category": "Really cool artifacts",
        "notes": "",
        "paths": ('*/com.android.cooldata/databases/database*.db',),
        "function": "get_cool_data1"
    }
}

import datetime
from scripts.artifact_report import ArtifactHtmlReport
import scripts.ilapfuncs

def get_cool_data1(files_found, report_folder, seeker, wrap_text):
    # let's pretend we actually got this data from somewhere:
    rows = [
     (datetime.datetime.now(), "Cool data col 1, value 1", "Cool data col 1, value 2", "Cool data col 1, value 3"),
     (datetime.datetime.now(), "Cool data col 2, value 1", "Cool data col 2, value 2", "Cool data col 2, value 3"),
    ]

    headers = ["Timestamp", "Data 1", "Data 2", "Data 3"]

    # HTML output:
    report = ArtifactHtmlReport("Cool stuff")
    report_name = "Cool DFIR Data"
    report.start_artifact_report(report_folder, report_name)
    report.add_script()
    report.write_artifact_data_table(headers, rows, files_found[0])  # assuming only the first file was processed
    report.end_artifact_report()

    # TSV output:
    scripts.ilapfuncs.tsv(report_folder, headers, rows, report_name, files_found[0])  # assuming first file only

    # Timeline:
    scripts.ilapfuncs.timeline(report_folder, report_name, rows, headers)

PR用のテストデータとsample_data

アーティファクトを追加または変更するPRは、実際の抽出データから切り出した小さなテストフィクスチャと、モジュールが生成した出力を記録する sample_data 値の2つが揃っていると、レビューとマージが最も容易になります。スクリプトが両方を生成します。以下が全体の流れです。

何よりも先に1つのルール: ここにコミットするものはすべて公開されます。自分でデータを入れたテストデバイス、公開研究用イメージ、手動でサニタイズしたファイルなど、共有が許可されているデータのみを使用してください。実際の事件データは絶対に使用しないでください。

1. 抽出データからフィクスチャを切り出す

python admin/test/scripts/make_test_data.py <module> --case 1 --input <extraction.zip>

これにより、モジュールの paths パターンに一致するファイルが抽出データから取り出され、ケースファイル admin/test/cases/testdata.<module>.json と、各アーティファクトごとの小さなzipが admin/test/cases/data/<module>/ の下に書き込まれます。

サイズのルール: zipあたり10 MB未満の場合はPRにコミットします。10〜25 MBの場合はケースファイルをコミットし、zipをPRコメントに添付します。それより大きい場合はPRでその旨を伝え、メンテナーが受け渡しを手配します。

2. 期待される出力を記録する

TZ=UTC python admin/test/scripts/test_module.py <module> -a all -c all

これにより、フィクスチャに対してモジュールが実行され、出力のスナップショットが admin/test/results/<module>/ の下に書き込まれます。スナップショットもコミットしてください。これがマージ後にモジュールを保護するベースラインになります。TZ=UTC の部分は維持してください: コミットされたスナップショットはUTCであり、CIはUTCで実行されます。

3. CIが実行するのと同じ比較を実行する

python admin/test/scripts/run_test_cases.py --module <module>

4. sample_data 値を生成する

python admin/scripts/validate_sample_data.py --emit <extraction.zip> --key <image_name>

これにより、抽出データに対してALEAPPがエンドツーエンドで実行され、ブランチで変更されたモジュール用の貼り付け可能な sample_data ブロックが出力されます。それらをモジュールの __artifacts_v2__ に貼り付け、イメージで確認したアプリ名とバージョンを追加します。カウントがゼロの場合は、記録する前にソースファイルが本当に空であることを確認してください。

5. すべてをコミットしてPRを開く

モジュール、ケースファイル、フィクスチャzip、記録されたスナップショットをまとめてコミットします。詳細は admin/docs/testing/create_module_test_cases.md にあります。

抽出データを共有できない場合は、それでもPRを開き、その旨を伝えてください。フィクスチャは公開研究用イメージから切り出せる場合もあれば、実際のファイルを手動でサニタイズできる場合もあります。その間もレビューは止まりません。

謝辞

このツールは、DFIRコミュニティの多くの人々の協力的な努力の結果です。

ALEAPPロゴはDerek Eiri氏の提供によるものです。

カテゴリ