
ALEAPP v2026.3.3
Parser für Android-Logs, Ereignisse und Protobuf

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)