
Analisador de Logs, Eventos e Protobuf do Android

Se quiser contribuir, fale comigo aqui: https://abrignoni.github.io
Postagens do blog aqui: https://leapps.org/blog
Python 3.10 ou superior
As dependências para o seu ambiente Python estão listadas em requirements.txt. Instale-as usando o comando abaixo. Garanta
que a parte py esteja correta para o seu ambiente, por exemplo, py, python ou python3, etc.
py -m pip install -r requirements.txt
ou
pip3 install -r requirements.txt
Para executar no Linux, você também precisará instalar o tkinter separadamente da seguinte forma:
sudo apt-get install python3-tk
Para compilar para um executável e poder executá-lo em um sistema sem Python instalado.
Windows OS
Para criar o aleapp.exe, execute:
pyinstaller scripts\pyinstaller\aleapp.spec
Para criar o aleappGUI.exe, execute:
pyinstaller scripts\pyinstaller\aleappGUI.spec
macOS
Para criar o aleapp, execute:
pyinstaller scripts/pyinstaller/aleapp_macOS.spec
Para criar o aleappGUI.app, execute:
pyinstaller scripts/pyinstaller/aleappGUI_macOS.spec
Linux
Para criar o aleapp, execute:
pyinstaller scripts/pyinstaller/aleapp_Linux.spec
Para criar o aleappGUI, execute:
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 é um arquivo-fonte Python que deve ser adicionado à pasta scripts/artifacts, sendo carregado dinamicamente toda vez que o ALEAPP é executado.
O arquivo-fonte do plugin deve conter um dicionário chamado __artifacts_v2__ logo no início do módulo, que define os artefatos que o plugin processa. As chaves no dicionário __artifacts_v2__ devem ser IDs para o(s) artefato(s), que devem ser únicos dentro do ALEAPP. Os valores devem ser dicionários contendo as seguintes chaves:
name: O nome do artefato como uma string.description: Uma descrição do artefato como uma string.author: O autor do plugin como uma string.version: A versão do artefato como uma string.date: A data da última atualização do artefato como uma string.requirements: Quaisquer requisitos para processar o artefato como uma string.category: A categoria do artefato como uma string.notes: Quaisquer notas adicionais como uma string.paths: Uma tupla de strings contendo padrões de busca glob para corresponder ao caminho dos dados que o plugin espera para o artefato.function: O nome da função que é o ponto de entrada para o processamento do artefato como uma string.Por exemplo:
__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"
}
}
As funções referenciadas como pontos de entrada no dicionário __artifacts__ devem receber os seguintes argumentos:
Por exemplo:
def get_cool_data1(files_found, report_folder, seeker, wrap_text):
pass # do processing here
Espera-se que os plugins forneçam saída no formato HTML do ALEAPP, TSV e, opcionalmente, enviem registros para a linha do tempo. As funções para gerar essa saída podem ser encontradas nos módulos artifact_report e ilapfuncs. Em um nível geral, um exemplo pode se parecer com:
__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 ferramenta é o resultado de um esforço colaborativo de muitas pessoas na comunidade DFIR.
Logotipo do ALEAPP cortesia de Derek Eiri.