Android DFIR Notes

When examining runtime permissions, check data/system/users/0/runtime-permissions.xml. This file reveals granted/denied permissions for installed apps. For example, a redacted package showed SMS access allowed but location permissions denied:

<pkg name="[REDACTED]">
    <item name="android.permission.READ_SMS" granted="true" flags="b00" />
    <item name="android.permission.ACCESS_FINE_LOCATION" granted="false" flags="300" />
    ... (other permissions redacted for brevity)
</pkg>

To determine malicious APK installation time, inspect the firstInstallTime (ft) field in system/packages.xml. Convert the hex value to decimal milliseconds for UTC timestamp. For instance:

  • Hex 1909fa201a8 → 1720665113000 ms → July 11, 2024 at 02:31:53 UTC.

The corresponding package entry shows critical permissions like WRITE_SMS and REQUEST_DELETE_PACKAGES granted:

<package name="[REDACTED]" ... ft="1909fa201a8" ...>
    ...
    <perms>
        <item name="android.permission.WRITE_SMS" granted="true" flags="0" />
        <item name="android.permission.REQUEST_DELETE_PACKAGES" granted="true" flags="0" />
        ... (other permissions)
    </perms>
</package>

App idle patterns can be traced via system/users/0/app_idle_stats.xml. The redacted package showed elapsedIdleTime="15700265" (≈4.3 hours) and screenIdleTime="7112575" (≈2 hours), indicating periods of background activity.

Notification logs in system/notification_log.db provide timestamps (when_ms), package identifiers (pkg), and context like muted status. For parsing Android logs, I recommend ALEAPP. For APK analysis, use apktool combined with smali2java – my typical workflow:

go run smali2java.go -path_to_smali="app_smali_directory"

Key redactions: Package names, code paths, and certificate keys removed to protect sensitive data. Forensic markers like timestamps and permission patterns are preserved for analysis context.