1. 程式人生 > >自編譯安卓系統分析Android核心漏洞(一)

自編譯安卓系統分析Android核心漏洞(一)

目標

  • 編譯Android4.4.3-r1原始碼及核心

0x00 環境

手機環境: nexus5 + Kernel3.4.0+Android4.4.3_r1

虛擬機器編譯環境: Vmware + Ubuntu 14.04

這裡寫圖片描述

0x01 編譯android系統

1. 先下原始碼

  • 先下載 repo 工具:
repo init -u https://aosp.tuna.tsinghua.edu.cn/android/platform/manifest -b android-4.4.3_r1.1
PATH=~/bin:$PATH
curl https://storage.googleapis
.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo

因為無法翻牆所以修改下載 URL 沒有vim的直接 sudo apt-get install vim就可以了

cd ~/bin/repo
vim  repo

將裡面的 https://android.googlesource.com/ 使用 https://aosp.tuna.tsinghua.edu.cn/ 代替即可。

  • 修改完完成repo以後就可以下載配置原始碼選項了

    建立原始碼目錄 ps:最好是在根目錄下

$  cd   /
$ mkdir WORKING_DIRECTORY
$ cd WORKING_DIRECTORY

配置好git環境,沒有git的直接 sudo apt-get install git 就可以了

$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"

然後就再找你要下載的原始碼版本分支
這裡寫圖片描述
我是Nexus5 所以選的 android-4.4.3_r1.1 其他自己手機的可以參考http://wiki.jikexueyuan.com/project/android-source/codenames-tags-build-numbers.html

  • repo 初始化
$ repo init -u https://aosp.tuna.tsinghua.edu.cn/android/platform/manifest -b android-4.4.3_r1.1

最後用repo sync 下載即可

$ repo sync

中間如果中斷了,直接repo sync 繼續同步下載即可
我是中斷個5.6次~

下載成功會顯示DONE

2. 配置原始碼編譯環境

  • 配好編譯的庫
$  sudo apt-get install git-core gnupg flex bison gperf build-essential \
  zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
  lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache \
  libgl1-mesa-dev libxml2-utils xsltproc unzip

Android 7.0 (Nougat) - Android 8.0 (O):Ubuntu - OpenJDK 8;
Android 5.x (Lollipop) - Android 6.0 (Marshmallow):Ubuntu - OpenJDK 7
Android 4.4.x (KitKat):Ubuntu - Java JDK 6;
Android 2.2.x (Froyo):Ubuntu - Java JDK 5

因為是android4.4,所以我用的jdk1.6.0_45 其他android版本找對應的jdk即可

  • 配置環境變數
    執行命令,開啟檔案:
# vi /etc/profile
export JAVA_HOME=/usr/java/jdk1.6.0_45
export JAVA_BIN=/usr/java/jdk1.6.0_45/bin
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH

執行生效

#. /etc/profile             (ps:點和/之間有空格)

3. 編譯系統

  • 在官網下載手機對應的驅動:
    https://developers.google.com/android/nexus/drivers#hammerhead
    找到 Nexus 5 (GSM/LTE) binaries for Android 4.4.4 (KTU84P)
    下面三個檔案都要下載,解壓後是三個.sh檔案,放到安卓原始碼目錄下,分別對三個檔案chmod a+x 檔名 賦許可權,然後分別執行三個檔案,此時會生成 vendor資料夾。

  • 開始編譯:

編譯程式碼如果前面的步驟沒出問題,那麼用下面的指令就可以直接進行編譯(aosp_arm-eng為模擬器,nexus5為aosp_hammerhead-userdebug)

source build/envsetup.sh #設定編譯環境
lunch aosp_hammerhead-userdebug #設定編譯選項
export USE_CCACHE=1 #使用快取,可以加快以後的編譯速度
prebuilts/misc/linux-x86/ccache/ccache -M 100G #使用 100GB 來作為快取的空間
export CCACHE_DIR=/<path_of_yourt_choice>/.ccache #設定快取地址,可以不要這個命令而使用預設快取路徑
make -j4

以上內容可用指令碼初始化:

//init.sh
export JAVA_HOME=/usr/local/java/jdk1.6.0_45
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
. build/envsetup.sh
lunch aosp_hammerhead-userdebug
make -j4 

編譯完後作業系統路徑為 out/target/product/hammerhead下,此時編譯的作業系統自帶預設的核心

  • 刷機 (刷機前先解鎖手機)
    插上手機連線上電腦,確認正常連線上電腦後,進行刷機
    cd到原始碼img生成路徑
cd source/out/target/product/hammerhead/
Adb reboot bootloader
Fastboot -w flashall

大概一兩分鐘後,系統即刷成功。

知識點擴充:如何將編譯後的原始碼製作成ROM

0x02 編譯核心系統

我們知道此時編譯的ROM是自帶的核心,我們需要下載核心原始碼重新編譯。在Android原始碼資料夾下建立kernel資料夾,並下載核心原始碼:(參考http://source.android.com/source/building-kernels.html

(由於實驗手機裝置為Nexus 5,因此我們選擇核心程式碼為msm.git)

重要的是:當你下載完核心的時候,你發現資料夾裡什麼也沒有,這時按如下步驟:

  • 2、checkout所選核心版本
cd ~/source/kernel/msm
git branch -a 檢視版本
git checkout remotes/origin/android-msm-hammerhead-3.4-kitkat-mr1
  • 3、編譯核心
exportPATH=$PATH:/WORKING_DIRECTORY/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin
export ARCH=arm
export SUBARCH=arm
export CROSS_COMPILE=arm-eabi-
make hammerhead_defconfig

編輯配置檔案開啟KLM

gedit .config  

在裡面新增以下內容:

CONFIG_MODULES=y  
CONFIG_MODULE_FORCE_LOAD=y
CONFIG_MODULE_UNLOAD=y  
CONFIG_MODULE_FORCE_UNLOAD=y  

並將CONFIG_STRICT_MEMORY_RWX修改為N

CONFIG_STRICT_MEMORY_RWX=n
  • 最後 make -j4 編譯
    這裡寫圖片描述

編譯完核心後,核心生成的路徑為:kernel/msm/arch/arm/boot目錄下的zImage-dtb檔案(nexus 5是這個檔案,nexus 4是zImage檔案,請注意別弄錯了),把該檔案複製到原始碼下的device/lge/hammerhead-kernel夾下(注意:nexus 4則為mako-kernel資料夾)


  • 替換系統核心

所需檔案
abootimg
boot.img
zImage-dtb
先要提取boot.img

輸入命令:
ls -l /dev/block/platform/msm_sdcc.1(具體裝置具體定)/by-name,
找到boot這一項,記下路徑

將boot匯出為boot.img
dd if=/dev/block/mmcblk0p19 of=/data/local/boot.img
adb pull /data/local/boot.img boot.img
使用abootimg工具解開boot.img
aboot.img  -x  boot.img

生成 bootimg.cfg zImage initrd.img 三個檔案

將 zImage-dtb 重新命名為zImage替換裡面的zImage

執行 abootimg –create boot.img -f bootimg.cfg -k zImage -r initrd.img 得到boot.img

然後燒寫

adb reboot bootloader 
fastboot flash boot boot.img

完成刷機後,重新開機,就刷入自編譯的核心了。

注意備份以還原磚頭

刷核心,不免會有刷成磚頭的情況。
使用步驟1中提取到的原版boot.img,在刷機模式下,執行fastboot flash boot boot.img就還原系統了。

總結

參考

https://bbs.pediy.com/thread-207538.htm abootimg的用法
從編譯原始碼開始定製Android ROM
http://blog.csdn.net/qq1084283172/article/details/71037182 Hook android系統呼叫的實踐
https://www.anquanke.com/post/id/85375 hook Android系統呼叫的樂趣和好處

https://www.jianshu.com/p/33b5c4061f6c