
Analyseur de journaux, d'événements et de Protobuf Android

Si vous souhaitez contribuer, contactez-moi ici : https://abrignoni.github.io
Articles de blog ici : https://leapps.org/blog
Python 3.10 ou supérieur
Les dépendances pour votre environnement Python sont listées dans requirements.txt. Installez-les à l'aide de la commande ci-dessous. Assurez-vous que la partie py est correcte pour votre environnement, par exemple py, python ou python3, etc.
py -m pip install -r requirements.txt
ou
pip3 install -r requirements.txt
Pour exécuter sous Linux, vous devrez également installer tkinter séparément comme ceci :
sudo apt-get install python3-tk
Pour compiler en exécutable afin de pouvoir exécuter ceci sur un système sans Python installé.
Windows OS
Pour créer aleapp.exe, exécutez :
pyinstaller scripts\pyinstaller\aleapp.spec
Pour créer aleappGUI.exe, exécutez :
pyinstaller scripts\pyinstaller\aleappGUI.spec
macOS
Pour créer aleapp, exécutez :
pyinstaller scripts/pyinstaller/aleapp_macOS.spec
Pour créer aleappGUI.app, exécutez :
pyinstaller scripts/pyinstaller/aleappGUI_macOS.spec
Linux
Pour créer aleapp, exécutez :
pyinstaller scripts/pyinstaller/aleapp_Linux.spec
Pour créer aleappGUI, exécutez :
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
Chaque plugin est un fichier source Python qui doit être ajouté au dossier scripts/artifacts ; il sera chargé dynamiquement à chaque exécution d'ALEAPP.
Le fichier source du plugin doit contenir un dictionnaire nommé __artifacts_v2__ au tout début du module, qui définit les artefacts que le plugin traite. Les clés du dictionnaire __artifacts_v2__ doivent être des identifiants pour le ou les artefacts, lesquels doivent être uniques au sein d'ALEAPP. Les valeurs doivent être des dictionnaires contenant les clés suivantes :
name : Le nom de l'artefact sous forme de chaîne de caractères.description : Une description de l'artefact sous forme de chaîne de caractères.author : L'auteur du plugin sous forme de chaîne de caractères.version : La version de l'artefact sous forme de chaîne de caractères.date : La date de la dernière mise à jour de l'artefact sous forme de chaîne de caractères.requirements : Toute exigence pour traiter l'artefact sous forme de chaîne de caractères.category : La catégorie de l'artefact sous forme de chaîne de caractères.notes : Toute note supplémentaire sous forme de chaîne de caractères.paths : Un tuple de chaînes contenant des modèles de recherche glob pour correspondre au chemin des données attendues par le plugin pour l'artefact.function : Le nom de la fonction qui est le point d'entrée pour le traitement de l'artefact sous forme de chaîne de caractères.Par exemple :
__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"
}
}
Les fonctions référencées comme points d'entrée dans le dictionnaire __artifacts__ doivent prendre les arguments suivants :
Par exemple :
def get_cool_data1(files_found, report_folder, seeker, wrap_text):
pass # do processing here
Les plugins sont généralement censés fournir une sortie au format HTML d'ALEAPP, en TSV, et éventuellement soumettre des enregistrements à la chronologie (timeline). Les fonctions permettant de générer cette sortie se trouvent dans les modules artifact_report et ilapfuncs. À un niveau général, un exemple pourrait ressembler à :
__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)
Cet outil est le fruit d'un effort collaboratif de nombreuses personnes de la communauté DFIR.
Logo ALEAPP avec l'aimable autorisation de Derek Eiri.