1. 程式人生 > >LiME與Volatility的編譯和使用 (MD)

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  

這裡寫圖片描述