From b904414bb08e27aac484cb862c225d7ac8e705a9 Mon Sep 17 00:00:00 2001 From: Janik Besendorf Date: Sat, 22 Aug 2026 14:16:23 +0200 Subject: [PATCH] Parse ADB binary XML keys --- src/mvt/android/artifacts/dumpsys_adb.py | 42 +++++++++++++++++++++- tests/android/test_artifact_dumpsys_adb.py | 13 +++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/mvt/android/artifacts/dumpsys_adb.py b/src/mvt/android/artifacts/dumpsys_adb.py index e5438c9..cbd80e2 100644 --- a/src/mvt/android/artifacts/dumpsys_adb.py +++ b/src/mvt/android/artifacts/dumpsys_adb.py @@ -6,6 +6,7 @@ import base64 import binascii import hashlib +import re from .artifact import AndroidArtifact @@ -98,6 +99,34 @@ class DumpsysADBArtifact(AndroidArtifact): return keystore + def parse_binary_xml(self, data: bytes) -> list[dict]: + """Recover ADB key records from Android binary XML (ABX). + + Some dumpstate implementations embed ABX in a text stream and replace + binary token bytes. The public key remains intact, while unavailable + numeric metadata is represented as ``None`` rather than corrupt text. + """ + keystore = [] + seen = set() + for match in re.finditer( + rb"(? dict: if b" " in user_key: @@ -118,7 +147,7 @@ class DumpsysADBArtifact(AndroidArtifact): return { "user": user.decode("utf-8"), "fingerprint": key_fingerprint_colon, - "key": key_base64, + "key": key_base64.decode("ascii", errors="replace"), } def check_indicators(self) -> None: @@ -175,12 +204,23 @@ class DumpsysADBArtifact(AndroidArtifact): # Keystore is in XML format on some devices and we need to parse it if keystore_data and keystore_data.startswith(b"