
Parser für Android-Logs, Ereignisse und Protobuf

Wenn du einen Beitrag leisten möchtest, melde dich hier: https://abrignoni.github.io
Blogbeiträge hier: https://leapps.org/blog
Python 3.10 oder höher
Die Abhängigkeiten für deine Python-Umgebung sind in requirements.txt aufgelistet. 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 außerdem tkinter separat installieren, z. B. so:
sudo apt-get install python3-tk
Um eine ausführbare Datei zu erstellen, mit der du dies auf einem System ohne installiertes Python ausführen kannst.
Windows-Betriebssystem
Um aleapp.exe zu erstellen, führe Folgendes aus:
pyinstaller scripts\pyinstaller\aleapp.spec
Um aleappGUI.exe zu erstellen, führe Folgendes aus:
pyinstaller scripts\pyinstaller\aleappGUI.spec
macOS
Um aleapp zu erstellen, führe Folgendes aus:
pyinstaller scripts/pyinstaller/aleapp_macOS.spec
Um aleappGUI.app zu erstellen, führe Folgendes aus:
pyinstaller scripts/pyinstaller/aleappGUI_macOS.spec
Linux
Um aleapp zu erstellen, führe Folgendes aus:
pyinstaller scripts/pyinstaller/aleapp_Linux.spec
Um aleappGUI zu erstellen, führe Folgendes aus:
pyinstaller scripts/pyinstaller/aleappGUI_Linux.spec
$ python aleapp.py -t <zip | tar | fs | gz> -i <path_to_extraction> -o <path_for_report_output>
$ python aleappGUI.py
$ python aleapp.py --help
Jedes Plugin ist eine Python-Quelldatei, die in den Ordner scripts/artifacts eingefügt werden sollte und bei jedem Ausführen von ALEAPP dynamisch geladen wird.
Die Plugin-Quelldatei muss ganz am Anfang des Moduls ein Wörterbuch namens __artifacts_v2__ enthalten, das die Artefakte definiert, die das Plugin verarbeitet. Die Schlüssel im __artifacts_v2__-Wörterbuch sollten IDs für das/die Artefakt(e) sein, die innerhalb von ALEAPP eindeutig sein müssen. Die Werte sollten Wörterbücher sein, die die folgenden Schlüssel enthalten:
name: Der Name des Artefakts als Zeichenkette.description: Eine Beschreibung des Artefakts als Zeichenkette.author: Der Autor des Plugins als Zeichenkette.version: Die Version des Artefakts als Zeichenkette.date: Das Datum der letzten Aktualisierung des Artefakts als Zeichenkette.requirements: Alle Anforderungen zur Verarbeitung des Artefakts als Zeichenkette.category: Die Kategorie des Artefakts als Zeichenkette.notes: Zusätzliche Hinweise als Zeichenkette.paths: Ein Tupel von Zeichenketten, die Glob-Suchmuster enthalten, um den Pfad der Daten abzugleichen, die das Plugin für das Artefakt erwartet.function: Der Name der Funktion, die der Einstiegspunkt für die Verarbeitung des Artefakts ist, als Zeichenkette.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 Funktionen, die als Einstiegspunkte im __artifacts__-Wörterbuch referenziert werden, müssen die folgenden Argumente entgegennehmen:
Zum Beispiel:
def get_cool_data1(files_found, report_folder, seeker, wrap_text):
pass # do processing here
Von Plugins wird im Allgemeinen erwartet, dass sie Ausgaben im HTML-Ausgabeformat von ALEAPP, als TSV und optional Datensätze an die Timeline übermitteln. Funktionen zur Erzeugung dieser Ausgabe findest du in den Modulen artifact_report und ilapfuncs. Auf hoher Ebene könnte ein Beispiel wie folgt 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)
Dieses Tool ist das Ergebnis einer gemeinschaftlichen Arbeit vieler Menschen in der DFIR-Community.
ALEAPP-Logo mit freundlicher Genehmigung von Derek Eiri.