Zurück zu den Updates
New releaseSep 11, 2026

ALEAPP v2026.3.3

Parser für Android-Logs, Ereignisse und Protobuf

Teilen

ALEAPP

Android Logs Events And Protobuf Parser

Wenn du beitragen möchtest, melde dich hier bei mir: https://abrignoni.github.io

Blogbeiträge hier: https://leapps.org/blog

Anforderungen

Python 3.10 oder höher

Abhängigkeiten

Die Abhängigkeiten für deine Python-Umgebung sind in requirements.txt aufgeführt. Installiere sie mit dem folgenden Befehl. Stelle sicher, dass der py-Teil für deine Umgebung korrekt ist, z. B. py, python oder python3 usw.

py -m pip install -r requirements.txt oder pip3 install -r requirements.txt

Um unter Linux ausgeführt zu werden, musst du zusätzlich tkinter separat installieren, und zwar so:

sudo apt-get install python3-tk

Kompilieren zu einer ausführbaren Datei

Um zu einer ausführbaren Datei zu kompilieren, damit du dies auf einem System ohne installiertes Python ausführen kannst.

Windows OS

Um aleapp.exe zu erstellen, führe aus:

pyinstaller scripts\pyinstaller\aleapp.spec

Um aleappGUI.exe zu erstellen, führe aus:

pyinstaller scripts\pyinstaller\aleappGUI.spec

macOS

Um aleapp zu erstellen, führe aus:

pyinstaller scripts/pyinstaller/aleapp_macOS.spec

Um aleappGUI.app zu erstellen, führe aus:

pyinstaller scripts/pyinstaller/aleappGUI_macOS.spec

Linux

Um aleapp zu erstellen, führe aus:

pyinstaller scripts/pyinstaller/aleapp_Linux.spec

Um aleappGUI zu erstellen, führe aus:

pyinstaller scripts/pyinstaller/aleappGUI_Linux.spec

Verwendung

CLI

$ python aleapp.py -t <zip | tar | fs | gz | raw> -i <path_to_extraction> -o <path_for_report_output>

raw liest ein Disk-Image (.img, .dd, .bin oder ein beliebiges nummeriertes .001-Segment eines geteilten Satzes) oder eine EnCase/EWF-.E01-Akquisition und die daneben liegenden Segmente direkt vor Ort: kein Mounten und keine Administratorrechte. Seine NTFS-, FAT32-, exFAT-, ext2/3/4-, F2FS-, HFS+-, APFS-, QNX6-, QNX4-, ETFS-, EFS-, SquashFS-, JFFS2-, UBI/UBIFS-, YAFFS- und QNX-IFS- Volumes werden direkt durchsucht, und nur die Dateien, die ein Artefakt anfordert, werden aus dem Image gelesen. Die GUI wählt raw von selbst für diese Erweiterungen. Siehe admin/docs/raw_image_input.md.

tar liest auch ein xz-komprimiertes Tar-Archiv (.tar.xz), und die GUI wählt tar für diese Erweiterung. Ein komprimiertes Tar-Archiv, einschließlich .tar.gz, wird einmal in den Report-Ordner entpackt, bevor eine Datei gelesen wird, sodass der Lauf dort freien Speicherplatz für das unkomprimierte Tar-Archiv benötigt. Die Kopie wird gelöscht, wenn der Lauf endet, und das Lauf-Protokoll gibt an, wie lange der Schritt gedauert hat.

GUI

$ python aleappGUI.py

Hilfe

$ python aleapp.py --help

Artefakt-Plugins beitragen

Jedes Plugin ist eine Python-Quelldatei, die dem Ordner scripts/artifacts hinzugefügt werden sollte und bei jedem Lauf von ALEAPP dynamisch geladen wird.

Die Plugin-Quelldatei muss ganz am Anfang des Moduls ein Dictionary namens __artifacts_v2__ enthalten, das die Artefakte definiert, die das Plugin verarbeitet. Die Schlüssel im __artifacts_v2__-Dictionary sollten IDs für das/die Artefakt(e) sein, die innerhalb von ALEAPP eindeutig sein müssen. Die Werte sollten Dictionaries sein, die die folgenden Schlüssel enthalten:

  • name: Der Name des Artefakts als String.
  • description: Eine Beschreibung des Artefakts als String.
  • author: Der Autor des Plugins als String.
  • version: Die Version des Artefakts als String.
  • date: Das Datum der letzten Aktualisierung des Artefakts als String.
  • requirements: Alle Anforderungen für die Verarbeitung des Artefakts als String.
  • category: Die Kategorie des Artefakts als String.
  • notes: Alle zusätzlichen Hinweise als String.
  • paths: Ein Tupel von Strings mit Glob-Suchmustern, die auf den Pfad der Daten passen, die das Plugin für das Artefakt erwartet.
  • function: Der Name der Funktion, die der Einstiegspunkt für die Verarbeitung des Artefakts ist, als String.

Zum Beispiel:

__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"
    }
}

Die als Einstiegspunkte im __artifacts__-Dictionary referenzierten Funktionen müssen die folgenden Argumente entgegennehmen:

  • Ein Iterable der gefundenen Dateien, die verarbeitet werden sollen (als Strings)
  • Den Pfad von ALEAPPs Ausgabeordner (als String)
  • Den Seeker (vom Typ FileSeekerBase), der die Dateien gefunden hat
  • Einen Boolean-Wert, der angibt, ob das Plugin voraussichtlich Text umbrechen soll

Zum Beispiel:

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

Plugins werden im Allgemeinen erwartet, Ausgaben im HTML-Ausgabeformat von ALEAPP, als TSV und optional als Einträge in der Timeline bereitzustellen. Funktionen zum Erzeugen dieser Ausgabe finden sich in den Modulen artifact_report und ilapfuncs. Auf hoher Ebene könnte ein Beispiel so aussehen:

__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)

Testdaten und sample_data für deinen PR

Kategorien