基于LiME工具的Android手机动态内存提取
刘亚1, 康艳荣2,*, 赵露2, 于文浩3, 张国臣2
1.中国人民公安大学,北京 100038
2.公安部物证鉴定中心,北京 100038
3.中国政法大学,北京 100088
* 通讯作者: 康艳荣,副研究员,硕士,研究方向为数据挖掘、电子物证。 E-mail: katherinekangyr@163.com

作者简介: 刘亚,在读硕士生,研究方向为电子物证检验。 E-mail: liuya9012@gmail.com

摘要

本文以手机内核源码为研究对象,利用LiME工具对不同Android版本内核的手机进行动态内存提取,详细分析了其内核校验机制,并阐述了如何通过修改内核配置和内核源码的方式,编译出可用的内存提取模块,建立了手机动态内存提取方法,为国内Android手机动态内存取证提供了一个新思路。实验表明,此方法能够成功提取多个品牌、型号手机的动态内存,可以解决普遍的Android手机动态内存提取问题。

关键词: 电子物证; Android手机; 动态内存; 内核模块
中图分类号:DF793.2 文献标志码:A 文章编号:1008-3650(2015)06-0431-04 doi: 10.16467/j.1008-3650.2015.06.001
Volatile Memory Acquisition from Android Devices with LiME Forensics
LIU Ya1, KANG Yanrong2,*, ZHAO Lu2, YU Wenhao3, ZHANG Guochen2
1. People’s Public Security University of China, Beijing 100038, China
2. Institute of Forensic Science, Ministry of Public Security, Beijing 100038, China
3. China University of Political science and Law, Beijing 100088, China
Abstract

Volatile memory acquisition from cell phone has gained popularity in recent years, because its analysis yields a wealth of information not available in non-volatile storage. Such aspects as the executing and terminated processes, application data, network connections, some user names and passwords, are important for investigation storage in the volatile memory. In this paper, we introduce a novel idea for cell phone forensics by analyzing a set of kernel source of android phone, and establishing an acquisition method that could extract volatile memory from phones with different kernel version. On Linux, kernel modules must be compiled against the relevant version of kernel headers and configuration so that it can be executed on the target system. During the module installation, the kernel starts to analyze two special sections in the module of .modinfo and_versions, and will refuse to load if this module contains incompatible version magic. Aiming at different Android kernel versions for different mobile phone, we analyzed the kernel verification mechanism, and explained how to modify the kernel configuration mode and kernel source code, to compile the available memory extraction module. The results show that this method can successfully extract volatile memory from multiple brands and models of Android mobile phones.

Keyword: digital forensics; Android phone; volatile memory; kernel module

随着Android市场份额的日益增长, 对Android平台手机进行取证和分析也成为司法鉴定机构的关注热点, 目前关于Android取证研究大多数是关于Android文件系统分析、Android程序分析、手机外置内存的提取分析等。手机动态内存(也称RAM、随机访问存储器)包含了大量的断电后不可恢复的有价值信息, 包括手机中正在运行和已结束的进程的数据、打开的文件、网络活动、内存映射等。这些数据并不会保存在手机内置的闪存或外围存储卡里, 可能成为潜在的证据信息动态, 因此内存的提取分析是至关重要的。动态内存取证和分析方面的研究还比较少。2008年, Anderson[1]最早提出Crash项目, 主要面向实时Linux系统进行取证, 并不适用大多数的Android设备。2010年, Cannon[2]提出的一种新机制来转储Android应用程序的内存, 通过向应用程序发送一个特别信号(SIGUSR1), 在/ data/misc中获取特定pid进程的内存转储, 这个方法只适用于Android版本为2.1以下的移动设备。Sylve等[3]发布了一个实用的内存获取工具DMD(现称LiME Forensics), 首次对Android设备的动态内存进行获取和深度分析, 但实验的手机系统版本仅限于Linux2.6的内核, 没有进一步分析转储的内存来发现敏感的数据。在LiME的基础上, Muller等[4]提出FROST技术, 一种在低温状态下提取Android手机随机访问内存的方法。Stü ttgen等指出传统物理内存提取方法存在的不足, 提出了一种通过PTE(page table entry, 也称页面表入口)获取物理内存的新技术, 但该技术不适用于Android设备[5]。2014年, Stü ttgen等又提出了获取Linux物理内存新方法, 通过重定向模块内部的操作, 使得内存提取模块可以绕过内核版本的校验而在不同的Linux版本运行, 解决了内存提取工具频繁的重编译问题, 该技术尚未支持Android设备[6]。在国内, 手机取证的研究主要集中在SIM卡、SD卡和flash闪存数据的提取分析, 尚无有关此类研究的报道。LiME是一个可以从Linux或基于Linux的设备获取动态内存的可装载内核模块, 在提取过程中, LiME可以将用户空间和内核空间的交互影响降到最小, 从而降低对内存的覆盖, 比较其他基于Linux内存的提取工具, LiME的法律效应评价是最好的[7]

1 材料和方法
1.1 环境配置

(1)打开手机USB调试模式, 确保手机已取得最高的系统权限, 才能装载内核模块。目前关于Android手机的root技术已比较成熟, 应选取成熟且对手机内部交互影响最小的工具, 将其对手机动态内存的影响降到最低。(2)准备合适的Linux系统。本文采用32位Ubuntu 12.04, 研究表明64位的Linux系统或非Debian系的Linux发行版, 在交叉编译模块时会出现未知问题。(3)配置Android SDK与NDK, 通过adb调试桥连接手机。(4)配置合适的交叉编译工具链, 本文配置为arm-eabi-4.4.3与arm-linux-androideabi-4.6, 研究表明交叉编译工具或版本的不同均会影响编译的成功率。(5)获取最新的LiME工具, LiME通过Subversion(一个开放源代码的版本控制系统)发布, 可在Linux终端下通过SVN进行同步。(6)获取目标设备的内核源代码, 可在各手机厂商的官方网站下载。

1.2 绕过内核检查

Android手机系统内核会对模块进行检查, 故须绕过目标手机内核检查机制, 才能使用LiME模块提取动态内存。

1.2.1 vermagic检查机制

对于Linux2.6的内核, 内核检查机制主要是vermagic字符串匹配检查。Vermagic格式定义如下所示:

#define VERMAGIC_STRING \

UTS_RELEASE “ “ \

MODULE_VERMAGIC_SMP \

MODULE_VERMAGIC_PREEMPT \

MODULE_VERMAGIC_MODULE_UNLOAD \

MODULE_VERMAGIC_MODVERSIONS \

MODULE_ARCH_VERMAGIC

Vermagic字符串可通过内核配置文件.config和Makefile中的宏定义进行设置, 各字段定义见表1

表 1 vermagic各字段定义 Table 1 Definition of each section in vermagic

绕过目标手机内核的vermagic检查, 可以从目标手机中找到现有的模块作参考, vermagic信息存放在内核模块中的.modinfo段中, 在Linux终端下输入命令modinfo < module> 可查看模块vermagic信息, 根据此信息再对内核配置文件作相应的修改, 使参考模块的vermagic信息与源码中的内核配置信息完全一致, 即可通过目标手机的vermagic检查机制。如下所示是HTC S710d中的一个模块信息:

# modinfo bcm4329.ko

filename: bcm4329.ko

license: GPL v2

alias: sdio:c* v02D0d0000*

depends:

vermagic: 2.6.35.10-g9dc9c50 preempt mod_unload ARMv7

parm: clockoverride:SDIO card clock override (int)

……

1.2.2 modversions检查机制

某些使用linux3.0及以上版本内核的手机, 具有vermagic和modversions两种检查机制。modversions是模块的版本校验机制。通过对模块的反汇编发现, 启用此校验的模块多了_versions段。通过分析源码目录下的kernel/module.c文件, 可知该检查机制在模块编译前通过宏定义CONFIG_MODVERSIONS启用, 并在模块的vermagic字符串中引入MODULE_VERMAGIC_MODVERSIONS字段。经分析, 当启用了modversions检查机制后, 在模块的_versions段数据中会出现module_layout字段值, 若模块中的module_layout值与目标手机系统中的module_layo-ut值不匹配, 就会出现拒绝装载的提示信息, 因此禁用CONFIG_MODVERSIONS可关闭内核中的模块版本校验机制。若在内核配置中禁用CONFIG_MODVERSIONS宏定义后, 则会改变内核模块的VERMAGIC_STRING值, 提取时会出现vermagic校验失败的错误。因此绕过手机中的module_layout校验可通过伪造vermagic中的MODULE_VERMAGIC_MODVERSIONS值。MODULE_VERMAGIC_MOD-VERSIONS值可在内核源码目录的include/linux/vermagic.h文件中伪造, 如下所示:

#ifdef CONFIG_MODVERSIONS

#define MODULE_VERMAGIC_MODVERSIONS “ mod-versions “

#else

#define MODULE_VERMAGIC_MODVERSIONS “ mod-versions “

#endif

2 Android手机动态内存提取实验

本文以多个品牌、机型作为实验对象, 对不同Android内核版本的手机进行动态内存提取(见表2)。本文以HTC S710d(内核源码为ace-gb-crc-2.6.35-2ec1b80)为实例说明。

表 2 实验所用机型及其提取实验结果 Table 2 Tested phones and its testing results
2.1 编译内核源码

2.1.1 配置交叉编译工具

编译内核源码之前, 对根目录下的Makefile文件进行相关配置。打开Makefile文件, 定位到# Cro-ss compiling and selecting different set of gcc/bin-utils段, 定义如下所示的KBuild变量来配置交叉编译工具链:

SUBARCH := arm

ARCH := arm

CROSS_COMPILE := < path to toolchain compiler> /arm-eabi-

2.1.2 配置内核

Android手机的内核功能配置文件一般位于系统中的/ proc/config.gz, 但大多数Android手机没有提供此配置文件, 在此不讨论配置文件, 仅进行通用的内核功能配置。在Linux终端下切换到源码目录, 输入make menuconfig命令进入内核功能配置, 见图1。进入Enable loadable module support, 并选择Forced module loading 、Module unloading和子选项Forced module unloading , 保存退出后在源码根目录生成.config隐藏文件。若源码提供默认的配置文件, 也可直接使用该默认配置进行编译。.config为内核配置文件, 对其中的宏定义进行配置可实现不同的功能。

图 1 内核功能配置Fig.1 Configuration of kernel function

2.1.3 交叉编译

现对源码进行编译, 在终端里输入命令“ make KERNELRELEASE=< UTS_RELEASE> modules_prepare” 进行交叉编译。如无提示错误信息, 编译完成后如下所示:

# make KERNELRELEASE=2.6.35.10-g9dc9c50 modules_prepare

CHK include/linux/version.h

HOSTCC scripts/basic/fixdep

HOSTCC scripts/basic/docproc

……

CC arch/arm/kernel/asm-offsets.s

GEN include/generated/asm-offsets.h

CALL scripts/checksyscalls.sh

2.2 编译LiME模块

进入LiME主目录, 修改Makefile文件与以下所示结构匹配:

obj-m := lime.o

lime-objs := main.o tcp.o disk.o

KDIR := < path/to/kernel-source>

PWD := $(shell pwd)

CCPATH := < path/to/android-ndk/toolchains>

default:

$(MAKE) ARCH=arm CROSS_COMPILE=

$(CCPATH)/arm-linux-androideabi- -C

$(KDIR_GOLDFISH) EXTRA_CFLAGS=-fno-pic M=

$(PWD) modules

在终端下输入make命令进行编译, 编译完成后在主目录下生成一个lime.ko的文件。通过modinfo命令查看其信息, 确认与目标手机参考模块的信息完全一致, 如下所示:

# modinfo lime.ko

filename: lime.ko

license: GPL

depends:

vermagic: 2.6.35.10-g9dc9c50 preempt mod_unload ARMv7

parm: path:charp

parm: dio:int

parm: format:charp

2.3 提取内存

通过USB数据线连接手机, 在终端下输入adb devices确认手机成功连接, 见图2

图 2 连接手机Fig.2 Phone connection

在终端输入命令“ adb push lime.ko /sdcard/lime.ko” 将lime.ko文件拷贝至手机SD卡目录。提取动态内存文件有TCP通道和SD卡转储两种方式。TCP通道方式是通过adb命令在手机与计算机之间建立一条端口传输的通道, 一般选用较高的端口避免与系统端口相冲突。由于通过TCP方式提取会对动态内存中网络缓存数据有一定的覆盖率, 在不希望网络数据丢失的情况下, 可通过SD卡转储的方式提取。SD卡转储方式是将动态内存文件直接写入手机SD卡里, 由于这种方式会直接覆盖掉SD卡中的数据, 一般先将手机中的SD卡进行镜像操作, 再通过此方式提取动态内存。以下所示为通过SD卡转储方式提取HTC S710d的动态内存:

# adb shell

$ su

# insmod /sdcard/lime.ko “ path=/sdcard/lime.dump format=lime”

提取完成后, 输入命令“ adb pull /sdcard/lime.dump./s710d.dump” 从手机SD卡中拷贝至计算机端。

3 结果和讨论

通过LiME工具提取的手机动态内存情况见表2图3。可以看出, 成功提取的动态内存大小比手机系统额定的动态内存少, 这是因为多种原因造成的, 一方面手机中的显卡GPU要与手机系统共用RAM, 不同的机型分占的RAM大小也不一样, 另一方面Android系统启动时RAMFS也需要占用一定的RAM空间。总体来说, 大部分机型都能成功提取到80%以上的动态内存, 其中包含了大量的有价值数据, 因此对实际取证工作有一定的积极帮助。

图 3 手机动态内存提取比例Fig.3 Average proportion of memory acquisition

本文就Android手机的动态内存取证技术进行了探讨, 利用LiME工具, 详细阐述了使用LiME的一些关键技术, 包括提取前的准备工作、手机内核源码的交叉编译, 以及如何提取内存数据等。通过不同品牌、型号手机的实验证实, 本文介绍的取证技术能够有效提取到Android手机的动态内存数据。

The authors have declared that no competing interests exist.

参考文献
[1] Anderson D. Crash Available. http://people.redhat.com/anderson/crash_whitepaper/. [本文引用:1]
[2] Cannon T. Android Reverse. http://thomascannon.net/projects/android-reversing/. [本文引用:1]
[3] Sylve J, Case A, Marziale L, et al. Acquisition and analysis of volatile memory from Android devices. Digital Investigation, 2012, 8: 175-184. [本文引用:1]
[4] Müller T, Spreitzenbarth M, Felix C. Freiling: FROST. 2012. [本文引用:1]
[5] Stüttgen J, Cohen M. Anti-forensic resilient memory acquisition. Digital Investigation, 2013, 10: S105-S115. [本文引用:1]
[6] Stüttgen J, Cohen M. Robust Linux memory acquisition with minimal target impact. Digital Investigation, 2014, 11: S112-S119 [本文引用:1]
[7] Sylve J. LiME-Linux memory extractor//ShmooCon‘12. Washington DC: Digital Forensics Solutions LLC, 2012. [本文引用:1]