使用 Python Script 解析 Android APP 使用紀錄

「usagestats」

專案探討

2022-6-14 by 高田鑑識

前言

在一般的數位鑑識過程,都希望可藉由提取 APP 所產生的資料,如照片或聊天內容,找出關鍵證據。但行動裝置除了使用者操作 APP 時所產生的內包含著重要資料外,系統本身也會追蹤並記錄使用者與 APP 互動歷程,以提供最佳的使用者體驗。

本篇文章主要討論的是如何藉由 Android 系統記錄使用者 APP 使用行為,來分析在特定時間使用者曾經開過 (Move to foreground),或退出 (Move to background) 特定的 APP。該紀錄歷程檔案位於 usagestats 資料夾內,並由四個資料夾分別記錄使用者的每日,每周,每月與每年的 APP 使用歷程。資料夾內的檔案命名方式採 Unix Epoch time millisecond 格式,轉換後為該檔案的產生時間。

  1. daily
  2. weekly
  3. monthly
  4. yearly

由 Android 系統紀錄的 usagestats 內容 PA 並無支援解析,Android 10 之後因紀錄格式變更,直接開啟檔案也無法閱讀內容,以下會介紹如何透過 Python Script 轉換成可分析的 SQLite 資料庫結構。雖然這些數位痕跡 (Artifacts) 檔案並不包含直接性的證據,但藉由分析使用者 APP 的使用歷程記錄,或許是找出重要關鍵證據的方式之一。

Usagestats 檔案格式

Android 9 (Pie) 之前 usagestats 採用 XML 格式紀錄,但 Android 10 (Q) 之後採用 Protocol Buffer 格式。Protocol Buffers 是由 Google 所推出的一個跨平台、語言的「可擴展的序列化資料結構」,可以把它想像成是 XML,或者是 JSON 的資料結構,但是它的資料體積更小、傳輸更快。

Android Usagestats XML & Protobuf Parser 支援這兩種格式檔案轉換成 SQLite 與 HTML 格式報告。

準備事項

轉換會使用 Python 來執行 Android Usagestats XML & Protobuf Parser,請確保以下項目是否已安裝完畢:

  1. Python 3.0 以上版本
  2. Python 軟體包 ProtoBuf 必須為 3.20.0 版本
  3. 下載 Android Usagestats XML & Protobuf Parser

檢查與安裝 Python 軟體包可參考以下指令:

指令、pip list & install

Python Script 使用說明

從提取出的 Android 映像檔,透過 PA 匯出 usagestats 資料夾以下所有的檔案。

路徑、usagestats 資料夾路徑

若有 rooted 的測試用手機,可安裝 SSH for Magisk 模組,直接使用 rsync 指令匯出資料夾。(192.168.1.100 為手機的 Wi-Fi ip,請更換為測試用的手機 IP)

複製

指令、rsync 指令

Python Script 檔案位置

請解壓縮 Android-Usagestats-XML-Protobuf-master.zip 檔案,並與 usagestats 資料夾放在同一階層內。如下圖所示。

圖、Script 與 usagestats 資料夾位置

執行 Script

進到 DOS 指令模式後執行 usagestats_conv.py,不需帶任何參數。該 Script 會解析所有 usagestats 下的資料夾和檔案。若有不符合 XML 與 Protocol Buffer 格式的檔案在資料夾內也會提示。

指令、執行結果示意

執行完成後會產生兩個檔案。請注意,兩個檔案內的時區不同:

  1. usagestats.db: 資料表 data 內 lastime 欄位為 Unix Epoch 格式,時區為 UTC 0。
  2. Report.html: 報告內的時區為電腦的當地時區。

檔案、執行結果產生兩個檔案

DB Browser for SQLite

data 資料表內容

DB、data 資料表內容

資料庫欄位說明

Usage_type: 每個 XML 或 ProtoBuf 檔案都會宣告記錄的類型。該欄位的值可以是事件 (event),設定 (configuration) 與 APP package名稱。

Lastime: 為事件發生的時間。該欄位的值若為正數,代表從檔案產生後所經過的毫秒數。若為負數,則為 Epoch 時間。

Time_active: 某些活動或事件會被記錄它們的使用時間長度,單位為毫秒。

Package: APP 名稱。

Types: 該欄位為整數,不同數值對應不同活動類型。如 APP 移至後台 (move to background) 或移至前台 (move to foreground)。詳細資料可參考以下連結:

https://developer.android.com/reference/android/app/usage/UsageEvents.Event

Classs: 正在使用的 APP 名稱與相對應之模組。

Source: 資料來源,有以下四種 daily, weekly, monthly, and yearly。

Fullatt: 欄位內包含該筆紀錄的完整屬性,並採 JSON 以「鍵-值對(KeyValue Pair)」格式儲存所有資料。鑑識人員可以在 SQLite 使用 JSON_Extract  語法查詢欄位內的任何一筆 Key-Value Pair。

SQLite 語法

以下 SQLite 語法可在 DB Browse for SQLite 下產出一份報告,報告內的時區已從 UTC 改為本地時間。另外原 time_active 欄位為毫秒,報告內另新增加一個以秒為單位的欄位,以利閱讀。

複製

DB、SQLite 語法