
Парсер журналов Android, событий и Protobuf

Если хотите внести свой вклад, пишите мне сюда: https://abrignoni.github.io
Посты в блоге здесь: https://leapps.org/blog
Python 3.10 или выше
Зависимости для вашего окружения Python перечислены в requirements.txt. Установите их с помощью приведённой ниже команды. Убедитесь,
что часть py корректна для вашего окружения, например py, python или python3 и т. д.
py -m pip install -r requirements.txt
или
pip3 install -r requirements.txt
Для запуска на Linux вам также потребуется установить tkinter отдельно, например так:
sudo apt-get install python3-tk
Для компиляции в исполняемый файл, чтобы запускать программу в системе без установленного Python.
ОС Windows
Чтобы создать aleapp.exe, выполните:
pyinstaller scripts\pyinstaller\aleapp.spec
Чтобы создать aleappGUI.exe, выполните:
pyinstaller scripts\pyinstaller\aleappGUI.spec
macOS
Чтобы создать aleapp, выполните:
pyinstaller scripts/pyinstaller/aleapp_macOS.spec
Чтобы создать aleappGUI.app, выполните:
pyinstaller scripts/pyinstaller/aleappGUI_macOS.spec
Linux
Чтобы создать aleapp, выполните:
pyinstaller scripts/pyinstaller/aleapp_Linux.spec
Чтобы создать aleappGUI, выполните:
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
Каждый плагин представляет собой исходный файл Python, который следует добавить в папку scripts/artifacts; он загружается динамически при каждом запуске ALEAPP.
Исходный файл плагина должен содержать словарь с именем __artifacts_v2__ в самом начале модуля, который определяет артефакты, обрабатываемые плагином. Ключи словаря __artifacts_v2__ должны быть идентификаторами артефакта(ов), уникальными в рамках ALEAPP. Значения должны быть словарями, содержащими следующие ключи:
name: название артефакта в виде строки.description: описание артефакта в виде строки.author: автор плагина в виде строки.version: версия артефакта в виде строки.date: дата последнего обновления артефакта в виде строки.requirements: любые требования для обработки артефакта в виде строки.category: категория артефакта в виде строки.notes: любые дополнительные примечания в виде строки.paths: кортеж строк, содержащих шаблоны поиска glob для сопоставления с путём данных, которые плагин ожидает для артефакта.function: имя функции, которая является точкой входа для обработки артефакта, в виде строки.Например:
__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"
}
}
Функции, указанные как точки входа в словаре __artifacts__, должны принимать следующие аргументы:
Например:
def get_cool_data1(files_found, report_folder, seeker, wrap_text):
pass # do processing here
Ожидается, что плагины, как правило, предоставляют вывод в формате HTML-отчёта ALEAPP, TSV и, при необходимости, отправляют записи в
хронологию (timeline). Функции для генерации такого вывода можно найти в модулях artifact_report и ilapfuncs.
В общих чертах пример может выглядеть так:
__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)
Этот инструмент является результатом совместных усилий многих людей из сообщества DFIR.
Логотип ALEAPP предоставлен Derek Eiri.