Solution de vidalan pour Ordiphone 0

forensics mémoire android

4 juin 2025

Nettoyage du dump

Nous allons extraire les caractères textuels avec la commande strings.

strings lime.dump > lime_to_string

Analyse des timestamps et dates

Ensuite, nous pouvons filtrer les timestamps et les dates (voir le code en annexe 1).

Plusieurs lignes peuvent attirer l’œil :

  • Lignes 70121: system_app_strictmode@1616526769876.txt.gz (Date trouvée: 1616526769876 -> 2021-03-23 19:12:49 UTC)

  • Ligne 1594546: type=1400 audit(1616526815.693:11968): avc: denied { module_load } for pid=4752 comm="insmod" path="/storage/emulated/0/lime.ko" dev="sdcardfs" ino=57349 scontext=u:r:su:s0 tcontext=u:object_r:sdcardfs:s0 tclass=system permissive=1 (Date trouvée: 1616526815 -> 2021-03-23 19:13:35 UTC)

La ligne 70121, ainsi que les autres similaires en “@<timestamp>.txt.gz”, semblent être des opérations d’extraction de données de log, mais ne sont pas des dumps de mémoire.

Très proche, la ligne 1594546 contient trois indices : LiME, “avc: denied” et “permissive=1”.

Il parait probable que LiME soit Linux Memory Extractor, et la règle SELinux pourrait indiquer une compromission.

Il semble donc possible de suspecter un lien entre ce comportement et la version personnalisée du noyau : Linux version 4.4.124+ (forensics@fcsc2021) (gcc version 4.9.x 20150123 (prerelease) (GCC) ) #3 SMP PREEMPT Sun Mar 21 19:15:33 CET 2021


Conversion de la date

Il ne reste plus qu’à convertir la date : 2021-03-23 19:13.

echo  -n 2021-03-23 19:13 | sha256sum
b7dc08558ee16d1acbf54db67263c1d92e9a9d9603e6a1345550c825527adc06  -

ATTENTION: Il est impératif d’utiliser l’argument -n avec echo, sinon un caractère \n sera ajouté et rendra le hash invalide.


Annexe 1 : Script Python pour le filtrage des dates

import datetime
import re

def filter_dates_in_file(filepath):
    # Définir la date de début pour le filtrage (1er janvier 2020 00:00:00 UTC)
    min_datetime_2020 = datetime.datetime(2020, 1, 1, 0, 0, 0, tzinfo=datetime.timezone.utc)

    # Définir la date de fin pour le filtrage (1er janvier 2022 00:00:00 UTC)
    max_datetime_2022 = datetime.datetime(2022, 1, 1, 0, 0, 0, tzinfo=datetime.timezone.utc)

    with open(filepath, 'r') as f:
        # Lire le fichier ligne par ligne pour conserver les numéros de ligne
        for line_num, line_content in enumerate(f, 1):
            # Trouver tous les motifs YYYY-MM-DD ou les timestamps numériques sur la ligne
            # Nous nous concentrons uniquement sur ces formats pour l'affichage et le filtrage.
            # L'ordre dans la regex est important si un motif peut chevaucher l'autre.
            # Ici, les deux sont distincts.
            date_patterns_on_line = re.findall(r'\b\d{4}-\d{2}-\d{2}\b|\b[0-9]{10,}\b', line_content)

            found_valid_entry_on_line = False

            # Traiter les dates et timestamps pour le filtrage
            for found_str in date_patterns_on_line:
                dt_object = None
                try:
                    # Tente de parser comme un timestamp numérique
                    if re.fullmatch(r'[0-9]{10,}', found_str):
                        ts_int = int(found_str)
                        if len(found_str) == 13: # Millisecondes
                            dt_object = datetime.datetime.fromtimestamp(ts_int / 1000, tz=datetime.timezone.utc)
                        elif len(found_str) == 10: # Secondes
                            dt_object = datetime.datetime.fromtimestamp(ts_int, tz=datetime.timezone.utc)
                    # Tente de parser comme une date YYYY-MM-DD
                    elif re.fullmatch(r'\d{4}-\d{2}-\d{2}', found_str):
                        dt_object = datetime.datetime.strptime(found_str, '%Y-%m-%d')
                        dt_object = dt_object.replace(tzinfo=datetime.timezone.utc)
                except ValueError:
                    # Gérer les chaînes qui ne sont pas des dates/timestamps valides
                    continue

                if dt_object: # Si un objet datetime valide a été créé
                    # Vérifier si la date est entre 2020 (inclus) et 2022 (exclus)
                    if min_datetime_2020 <= dt_object < max_datetime_2022:
                        if not found_valid_entry_on_line:
                            print(f"Ligne {line_num}:")
                            print(f"    {line_content.strip()}")
                            found_valid_entry_on_line = True
                        print(f"    (Date trouvée: {found_str} -> {dt_object.strftime('%Y-%m-%d %H:%M:%S UTC')})")

            if found_valid_entry_on_line:
                print("") # Ajoute une ligne vide pour une meilleure lisibilité

filter_dates_in_file('toStrg')