
ALEAPP v2026.3.3
Analyseur de journaux, d'événements et de Protobuf Android

Android Logs Events And Protobuf Parser
Si vous souhaitez contribuer, contactez-moi ici : https://abrignoni.github.io
Articles de blog ici : https://leapps.org/blog
Prérequis
Python 3.10 ou supérieur
Dépendances
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 ex. 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 suit :
sudo apt-get install python3-tk
Compiler en exécutable
Pour compiler en exécutable afin de pouvoir l'exécuter 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
Utilisation
CLI
$ python aleapp.py -t <zip | tar | fs | gz | raw> -i <path_to_extraction> -o <path_for_report_output>
raw lit une image disque (.img, .dd, .bin, ou tout segment numéroté .001 d'un
ensemble fractionné), ou une acquisition EnCase/EWF .E01 et les segments qui l'accompagnent, sur
place : sans montage et sans droits administrateur. Ses volumes NTFS, FAT32, exFAT, ext2/3/4,
F2FS, HFS+, APFS, QNX6, QNX4, ETFS, EFS, SquashFS, JFFS2, UBI/UBIFS, YAFFS et QNX IFS
sont parcourus directement, et
seuls les fichiers demandés par un artefact sont lus depuis l'image. L'interface graphique sélectionne
raw d'elle-même pour ces extensions. Voir admin/docs/raw_image_input.md.
tar lit également une archive tar compressée en xz (.tar.xz), et l'interface graphique sélectionne tar pour cette
extension. Une archive tar compressée, .tar.gz inclus, est décompressée une fois dans le dossier de rapport
avant que tout fichier ne soit lu, donc l'exécution nécessite de l'espace libre à cet endroit pour l'archive tar non compressée. La
copie est supprimée à la fin de l'exécution, et le journal d'exécution indique combien de temps l'étape a pris.
GUI
$ python aleappGUI.py
Aide
$ python aleapp.py --help
Contribuer des plugins d'artefacts
Chaque plugin est un fichier source Python qui doit être ajouté au dossier scripts/artifacts, lequel 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(s) artefact(s) qui 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.description: Une description de l'artefact sous forme de chaîne.author: L'auteur du plugin sous forme de chaîne.version: La version de l'artefact sous forme de chaîne.date: La date de la dernière mise à jour de l'artefact sous forme de chaîne.requirements: Toute exigence pour le traitement de l'artefact sous forme de chaîne.category: La catégorie de l'artefact sous forme de chaîne.notes: Toute note supplémentaire sous forme de chaîne.paths: Un tuple de chaînes contenant des motifs de recherche glob pour correspondre au chemin des données que le plugin attend 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.
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 :
- Un itérable des fichiers trouvés qui doivent être traités (sous forme de chaînes)
- Le chemin du dossier de sortie d'ALEAPP (sous forme de chaîne)
- Le seeker (de type FileSeekerBase) qui a trouvé les fichiers
- Une valeur booléenne indiquant si le plugin est censé encapsuler le texte
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, TSV, et éventuellement soumettre des enregistrements à
la timeline. Les fonctions pour générer cette sortie se trouvent dans les modules artifact_report et ilapfuncs.
À un niveau élevé, 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)