
Analizador de registros, eventos y protobuf de Android

Si quieres contribuir, contáctame aquí: https://abrignoni.github.io
Publicaciones del blog aquí: https://leapps.org/blog
Python 3.10 o superior
Las dependencias para tu entorno de Python se enumeran en requirements.txt. Instálalas usando el siguiente comando. Asegúrate de que la parte py sea la correcta para tu entorno, por ejemplo py, python o python3, etc.
py -m pip install -r requirements.txt
o
pip3 install -r requirements.txt
Para ejecutar en Linux, también necesitarás instalar tkinter por separado de la siguiente manera:
sudo apt-get install python3-tk
Para compilar a un ejecutable y poder ejecutarlo en un sistema sin Python instalado.
Windows OS
Para crear aleapp.exe, ejecuta:
pyinstaller scripts\pyinstaller\aleapp.spec
Para crear aleappGUI.exe, ejecuta:
pyinstaller scripts\pyinstaller\aleappGUI.spec
macOS
Para crear aleapp, ejecuta:
pyinstaller scripts/pyinstaller/aleapp_macOS.spec
Para crear aleappGUI.app, ejecuta:
pyinstaller scripts/pyinstaller/aleappGUI_macOS.spec
Linux
Para crear aleapp, ejecuta:
pyinstaller scripts/pyinstaller/aleapp_Linux.spec
Para crear aleappGUI, ejecuta:
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
Cada plugin es un archivo fuente de Python que debe agregarse a la carpeta scripts/artifacts, la cual se cargará dinámicamente cada vez que se ejecute ALEAPP.
El archivo fuente del plugin debe contener un diccionario llamado __artifacts_v2__ al comienzo del módulo, que define los artefactos que procesa el plugin. Las claves del diccionario __artifacts_v2__ deben ser ID únicos para los artefactos dentro de ALEAPP. Los valores deben ser diccionarios que contengan las siguientes claves:
name: El nombre del artefacto como cadena.description: Una descripción del artefacto como cadena.author: El autor del plugin como cadena.version: La versión del artefacto como cadena.date: La fecha de la última actualización del artefacto como cadena.requirements: Cualquier requisito para procesar el artefacto como cadena.category: La categoría del artefacto como cadena.notes: Cualquier nota adicional como cadena.paths: Una tupla de cadenas que contienen patrones de búsqueda glob para coincidir con la ruta de los datos que el plugin espera para el artefacto.function: El nombre de la función que es el punto de entrada para el procesamiento del artefacto como cadena.Por ejemplo:
__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"
}
}
Las funciones referenciadas como puntos de entrada en el diccionario __artifacts__ deben aceptar los siguientes argumentos:
Por ejemplo:
def get_cool_data1(files_found, report_folder, seeker, wrap_text):
pass # do processing here
Generalmente se espera que los plugins proporcionen resultados en el formato de salida HTML de ALEAPP, TSV y, opcionalmente, envíen registros a la línea de tiempo. Las funciones para generar esta salida se pueden encontrar en los módulos artifact_report y ilapfuncs.
A alto nivel, un ejemplo podría parecerse a:
__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)
Esta herramienta es el resultado de un esfuerzo colaborativo de muchas personas en la comunidad DFIR.
Logotipo de ALEAPP cortesía de Derek Eiri.