自編譯安卓系統分析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)
1、下載核心原始碼
(由於實驗手機裝置為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系統呼叫的樂趣和好處