Retour aux mises à jour
New releaseSep 11, 2026

ALEAPP v2026.3.3

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

Partager

ALEAPP

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)

Données de test et sample_data pour votre PR

Catégories