Android日志在APP取证中的应用
Android日志在APP取证中的应用
在移动设备取证领域,Android系统因其广泛的用户基础和开放性架构,成为数据获取与行为还原的重点平台。系统日志和应用日志作为一种原始的、未加工的动态记录数据,往往保留了关键的操作痕迹、崩溃信息、用户行为以及系统状态,是案件研判、行为溯源和证据链构建的重要依据。
无论是追踪恶意软件的行为、还原用户操作序列,还是分析系统异常或应用崩溃的原因,Android日志都提供了一种非侵入式、实时性强的技术手段。对于取证技术人员而言,掌握日志分类、获取方式、存储结构、解析方式,是进行有效电子数据取证的基础。
通过系统化的日志分析,取证人员通常可以获得多方面的取证价值,如行为还原:通过应用和系统日志重建用户操作序列、应用响应流程和系统事件链。异常检测:识别崩溃、ANR、权限异常等事件,分析是否为恶意行为或设备异常所致。环境推断:通过日志中的版本、设备信息、API调用等判断运行环境真实性及其兼容性。证据提取:从中提取URL、参数、身份标识、时间戳等关键证据,支撑案件研判。时间线构建:结合日志时间戳与其他设备日志(如通话记录、短信)交叉验证,构建完整行为时间线。
一、应用日志
开发者可以在应用代码中主动嵌入日志记录功能,以便在应用出现崩溃或其他重大问题时进行日志上报,方便分析和改进应用。常用的日志方法如下Log.v(String tag, String msg);详细信息日志、Log.d(String tag, String msg);调试信息日志、Log.i(String tag, String msg);普通信息日志、Log.w(String tag, String msg);警告信息日志、Log.e(String tag, String msg);错误信息日志,这些日志通常会写入应用拥有访问权限的目录下,可通过第三方工具Android Studio或者adb进行查看,截图如下所示:

图1 Android Studio查看日志
图2 adb logcat查看日志
内部存储:/data/data/<packageName>/files(可通过 Context.getFilesDir() 获取)、外部存储:/storage/emulated/0/Android/data/<packageName>/files(可通过 Context.getExternalFilesDir()获取),需要注意的是只有主动调用Context.getExternalFilesDir()方法获取外部存储后才能在文件路径中查看,部分截图如下所示:

图3 apk 
图4 外部存储
图5 内部存储
在对Apk进行分析的过程中,我们可以通过adb以及android studio或者第三方工具对Apk的日志进行查看,通过日志查看Apk的运行行为,有时日志也会打印出Apk的调试信息如url、版本号、参数,同时可以直接通过日志打印堆栈快速定位逻辑代码,一定程度上降低了取证难度。
二、系统日志
logcat 是 Android 系统的日志框架,提供了一个环形缓冲区,所有运行在系统上的组件(包括系统服务、内核以及所有应用)都可以通过 Android Logging API 向这个缓冲区写入不同优先级的日志消息。 Android 日志系统为日志消息保留了多个环形缓冲区,如main:主日志缓冲区,存储大多数应用日志、system:系统日志缓冲区,存储系统相关的日志信息、radio:无线电缓冲区,存储与无线电相关的日志信息、events:事件缓冲区,存储系统事件相关的日志信息、crash:崩溃日志缓冲区,存储崩溃相关的日志信息、可以使用如下adb命令查看特定缓冲区的日志adb logcat -b <buffer>,截图如下所示:
图6 main缓冲区
日志消息本身并不直接存储为持久的文件系统文件,而是存在于内存中的环形缓冲区中。缓冲区的大小是有限的,当缓冲区满时,最旧的日志会被覆盖,设备重启后会清空所有的缓冲区,可以通过adb或者手机设备开启开发者模式后查看,截图如下所示:

图7 缓冲区大小(adb查看)
图8 缓冲区大小(开发者模式查看)
缓冲区的日志记录了应用、系统服务、内核信息等,对于电子数据取证也具有比较重要的作用,取得设备应该在保证设备不关机并且条件允许的情况下尽快提取日志文件为后续做准备,尤其是main和events缓冲区。
三、系统为应用生成的日志
ANR追踪
当应用发生 ANR(Application Not Responding)时,系统会自动生成日志,记录主线程阻塞时的所有线程的完整堆栈信息、CPU使用率以及锁的状态。该日志存放在 /data/anr/traces.txt,需要注意的是,可能在同一目录下会有名为 anr_<timestamp>.txt 的文件,这是历史记录文件。可以使用如下adb命令获取该文件:adb pull /data/anr/traces.txt,部分截图如下所示:
图9 ANR追踪日志
四、诊断日志
当应用崩溃时,系统会在 /data/system/dropbox 目录下生成日志文件,文件名通常为 data_app_crash@<timestamp>.txt,主要内容包括崩溃堆栈信息、进程状态和时间戳。可以使用如下adb命令访问该目录:adb shell ls /data/system/dropbox、adb shell cat /data/system/dropbox/data_app_crash@<timestamp>.txt,部分截图如下所示:

图10 崩溃日志
五、取证建议
优先采集内存中的日志(logcat、events),因为这些数据会在设备重启后被覆盖或者清空,采用adb工具对日志文件进行转储,如实时转储:adb logcat -v time -b all | tee logcat_live.txt、导出全部缓冲区:adb logcat -d -v time -b all > logcat_dump.txt、获取ANR:adb pull /data/anr/traces.txt dump.txt。
为每个导出的日志文件计算SHA256哈希值并记录、将原始日志和解析结果分别存档,在分析的时候采用关键词与模式搜索,如tag、pid、包名(线程名)、url等快速定位相关日志,以日志时间线为切入点结合网络抓包、文件系统时间戳、通话记录、短信记录等相关信息验证事件的关系。
六、示例
在对Apk取证的过程中,得益于模拟器一键root以及高度自定义的软硬件环境,模拟器动态运行分析的环节也是必不可少的,我们将可疑Apk提取出来,正常在雷电模拟器上安装运行,后发现无法在模拟器上运行,一打开就会崩溃闪退,首先使用Android Studio进行日志分析,截图如下所示:
图11 Androidstudio报错日志
通过对日志分析可以得出,该问题是因为找不到某个方法导致的报错,同样也能查看到出现报错的方法的调用堆栈信息,通过对堆栈的信息分析可以知道问题出在错误地在 Activity 上调用了 registerActivityLifecycleCallbacks() 方法,后将Apk安装到真机上进行测试,发现真机可以正常运行,那问题就很明显了,模拟器的Android版本不支持在Activity上调用registerActivityLifecycleCallbacks()方法,后将Apk放入jadx进行检查,如图所示:

图12 jadx反编译结果
MinSdkVersion=31 这个sdk的版本对应的Android版本为Android12 查看模拟器的版本为Android9,所以导致了无法找到方法的报错从而Apk崩溃闪退,我们选择一个Android12版本的模拟器即可正常运行,截图如下所示:

图13 Android12版本模拟器运行结果
七、总结
Android 日志是移动设备取证中的关键动态证据源。通过系统与应用日志,可以还原用户与应用的行为序列、定位崩溃或异常的根因、提取网络与身份凭证线索,并将日志时间戳与其它数据源(通话、短信、网络抓包、文件时间戳)交叉验证以构建完整事件时间线。取证操作应优先采集挥发性日志、记录采集元数据并做哈希保全;同时将日志解析结果与服务器端/文件系统证据关联,以提高结论的可验证性与法庭采信度。