自编译安卓系统分析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 "you@example.com"

然后就再找你要下载的源码版本分支
这里写图片描述
我是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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值