LiME與Volatility的編譯和使用 (MD)
1 下載核心原始碼與LiME工具
(1)裝置資訊
- 型號:Samsung Galaxy S5
- Android版本:6.0.1
- 基帶版本:G9006VZNU1CPJ2
- 核心版本:3.4.0
(2)使用Git命令下載LiME工具原始碼:
(3)下載裝置對應核心原始碼
本裝置對應核心原始碼資料夾為: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。
(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
(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
(1)下載Dwarfdump原始碼(libdwarf-20170709.tar.gz):
(2)執行命令,配置並編譯libdwarf和dwarfdump:
$ cd dwarf-20170709/libdwarf
$ ./configure && make
$ cd ../dwarfdump
$ ./configure && make
5 下載、配置並編譯Volatility
(1)下載Volatility原始碼:
(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
(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
6 使用Volatility檢視dump出的裝置記憶體
進入Volatility主目錄,執行Python指令碼外掛,查詢裝置對應的profile檔案:
$ cd ~/volatility/
$ python vol.py --info | grep G9006V
$ python vol.py --profile=LinuxG9006VARM -f ~/limemem.m linux_pslist