LiME与Volatility的编译和使用 (MD)

1 下载内核源代码与LiME工具

(1)设备信息

  • 型号:Samsung Galaxy S5
  • Android版本:6.0.1
  • 基带版本:G9006VZNU1CPJ2
  • 内核版本:3.4.0

(2)使用Git命令下载LiME工具源代码:

https://github.com/504ensicsLabs/LiME

(3)下载设备对应内核源代码

网站地址(Samsung):
http://opensource.samsung.com/reception.do

本设备对应内核源代码文件夹为:SM-G9006V_CHN_MM_Opensource

2 准备编译LiME模块的环境

(1)配置环境变量

export NDK_PATH=/home/richard/android-ndk-r15b/  
export KSRC_PATH=/home/richard/SM-G9006V_CHN_MM_Opensource/Kernel/  
export CC_PATH=$NDK_PATH/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/  
export LIME_SRC=/home/richard/LiME/src/  

(2)在内核源代码目录/Kernel/arch/arm/configs/中查找与设备相匹配的默认配置文件。

将该配置文件拷贝至内核源代码主目录下,并重命名为“.config”。(本设备对应的默认配置文件为msm8974_sec_defconfig)

(3)执行命令,在图形界面中进一步更新内核配置文件:

$ make menuconfig  

在图形界面中,选择Enable loadable module support目录,并选中该目录下的Forced module support和Module unloading选项,以配置支持LKM。

退出图形界面并更新内核配置文件.config。

LiME与Volatility的编译和使用 (MD)_第1张图片

(4)执行命令,配置内核源代码,为之后编译LiME模块做准备:

$ cd $KSRC_PATH  
$ make ARCH=arm CROSS_COMPILE=$CC_PATH/arm-linux-androideabi- modules_prepare  

(5)编辑LiME工具源代码中的Makefile文件,为之后编译LiME模块做准备,如下:

obj-m := lime.o  
lime-objs := main.o tcp.o disk.o  
    KDIR := /home/richard/SM-G9006V_CHN_MM_Opensource/Kernel/  
    PWD := $(shell pwd)  
    CCPATH := /home/richard/android-ndk-r15b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/  
default:  
    $(MAKE) ARCH=arm    CROSS_COMPILE=$(CCPATH)/arm-linux-androideabi-  -C  $(KDIR) M=$(PWD)    modules  

(6)执行命令,编译LiME模块:

 $ cd $LIME_SRC  
 $ make  

在LiME工具源代码目录下生成LiME模块:lime.ko。

3 使用LiME模块dump目标设备内存

(1)执行命令,将LiME模块lime.ko导入目标设备/sdcard/目录中:

$ adb push lime.ko /sdcard/lime.ko  

(2)执行命令,设置本地主机和设备间的TCP端口转发通道:

$ adb forward tcp:4444 tcp:4444  

(3)以root用户登录设备,执行insmod命令,以加载LiME模块至系统内核,并设置TCP转发端口为4444,dump出的设备内存格式为lime:

$ adb shell  
$ su  
$ insmod /sdcard/lime.ko “path=tcp:4444 format=lime”  

错误:
insmod: cannot insert ‘/sdcard/lime.ko’: Function not implemented

解决:
大部分Android手机的内核在编译时默认关闭了对于LKM的支持,要解决此问题,必须重新编译Android内核并刷入手机以支持LKM,具体实现可参考:
http://blog.csdn.net/rzwinters/article/details/75530835

(4)在本地主机中开启另一个终端,执行nc命令连接设备,以获取LiME模块dump出的设备内存:

$ nc localhost 4444 > limemem.m  

P.S. 在执行insmod命令加载LiME模块时,还可以设置通过SD卡转储的方式获取LiME模块dump出的设备内存:

$ insmod /sdcard/lime.ko “path=/sdcard/limemem.m format=lime”  

4 下载并编译Dwarfdump

以下文章内容均参考网页:
https://github.com/volatilityfoundation/volatility/wiki/Android#examine-the-memory-dump-with-volatility

(1)下载Dwarfdump源代码(libdwarf-20170709.tar.gz):

https://www.prevanders.net/dwarf.html

(2)执行命令,配置并编译libdwarf和dwarfdump:

$ cd dwarf-20170709/libdwarf  
$ ./configure && make   
$ cd ../dwarfdump   
$ ./configure && make  

5 下载、配置并编译Volatility

(1)下载Volatility源代码:

https://github.com/volatilityfoundation/volatility.git

(2)编辑目录/tools/Linux/下的Makefile文件,如下:

obj-m += module.o  
KDIR := /home/richard/SM-G9006V_CHN_MM_Opensource_LIME/Kernel/   
CCPATH := /home/richard/android-ndk-r15b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/  
DWARFDUMP := /home/richard/dwarf-20170709/dwarfdump/dwarfdump  
-include version.mk  
all: dwarf  
dwarf: module.c  
    $(MAKE) ARCH=arm CROSS_COMPILE=$(CCPATH)/arm-linux-androideabi- -C $(KDIR) CONFIG_DEBUG_INFO=y M=$(PWD) modules   
    $(DWARFDUMP) -di module.ko > module.dwarf   

错误:
/bin/sh: 1: /home/richard/dwarf-20170709/dwarfdump/: Permission denied

解决:
Makefile中的DWARFDUMP变量应指向Dwarfdump主目录下dwarfdump目录中的dwarfdump可执行文件,即/dwarf-20170709/dwarfdump/dwarfdump。(细心!)

(3)执行命令,编译Volatility,生成module.ko模块,并查看生成的module.dwarf文件:

$ make   
$ head module.dwarf  

LiME与Volatility的编译和使用 (MD)_第2张图片

(4)执行zip命令,将module.dwarf文件与Android内核源代码中的System.map文件打包为一个zip文件,并移动至/volatility/plugins/overlays/linux/目录:

$ zip ~/volatility/volatility/plugins/overlays/linux/G9006V.zip module.dwarf ~/SM-G9006V_CHN_MM_Opensource/Kernel/output/System.map  

错误:
内核源代码目录中不存在System.map文件

解决:
按照以下网页中Cross Compile the Kernel步骤重新编译内核源代码,获得编译生成的System.map文件:
https://github.com/volatilityfoundation/volatility/wiki/Android#examine-the-memory-dump-with-volatility

6 使用Volatility查看dump出的设备内存

进入Volatility主目录,执行Python脚本插件,查找设备对应的profile文件:

$ cd ~/volatility/  
$ python vol.py --info | grep G9006V  

LiME与Volatility的编译和使用 (MD)_第3张图片

参考如下网页中的python脚本插件命令,以分析dump出的设备内存:
https://github.com/volatilityfoundation/volatility/wiki/Linux-Command-Reference#linux_pslist

$ python vol.py --profile=LinuxG9006VARM -f ~/limemem.m linux_pslist  

LiME与Volatility的编译和使用 (MD)_第4张图片

错误:
*** Failed to import volatility.plugins.registry.shutdown (ImportError: No module named Crypto.Hash)

解决:
参考以下网页解决该错误:
http://techglimpse.com/error-while-running-volatility-software-failed-to-import-volatility-plugins-malware-svcscanimporterror-no-module-named-crypto-hash-solved/


错误:
*** Failed to import volatility.plugins.malware.apihooks (NameError: name ‘distorm3’ is not defined)

解决:
参考以下网页解决该错误:
http://blog.csdn.net/my_xxh/article/details/51603953

你可能感兴趣的:(Forensics,android,LiME,内存取证)