项目初衷

单纯的想要打造一个自己的渗透手机,去完成渗透过程中的一些对抗。

  • 手机的选择
  • 编译环境的配置
  • aosp配置
  • download android source
  • download kernel source
  • 编译android - 9
  • 编译kernel - 3.18
  • 刷入android设备

开篇汇总

 本文主要用于记录自己在编译Android内核期间踩过的一些坑,以及各种百度、谷歌、必应的心酸;看着自己跟着网上教程走了一圈又一圈,删了一个又一个的虚拟机,总结出来的还是三个字:看!官!网!

1
2
3
4
5
kali源:[aliyun镜像站](https://developer.aliyun.com/mirror/)

Android source:[source.android](https://source.android.com/setup/start/build-numbers#build)

repo 初始化Android 源码:[清华站](https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/)

环境配置

手机选择

 这个是内核编译中最大、最大、最大的坑,google有一款verizon版本的手机,该手机是不支持解BL锁的,即网上常说的“OEM unlock 是灰色”,这种情况下,如果没有特定工具是解不开的,所以,不论是从哪儿淘Pixel系列手机,一定要和商家说:

  1. 我要一款BL锁解开的手机
  2. 说出自己想要的款式,我个人用的是Pixel XL、Pixel 3XL
  3. 说出自己需要的特定的android版本,因为android kernel 3.18 和 4.9 的差异会很大很大

 上面的几点,第一点是重中之重,如果你的手机先在BL锁是没有解开的,那么这篇文章已经没有任何意义了,没有接BL锁的手机,不允许刷入任何的img。

好了,书回正题,此时手中有一款解锁的android 9 的Pixel手机开始后续的操作。

kali配置

 其实按照Establishing a Build Environment官方的推荐来说,Ubuntu其实应该是本次环境配置的主角,但是毕竟kali用着顺手,所以我在本文选用了kali来编译我的kernel

download kali Linux

kali版本的选择,毕竟本文行文已经是2022年了,所以在kali官网选择一个最新的环境下载即可

 如果你是依据我上图下载的话,那么其下载解压后是一个vmx文件,只需要在VM中选择“打开虚拟机”,选择解压出来的文件即可

setting VMware

无论是要编译Android系统还是编译Android内核,其对于环境配置的要求还是蛮高的

 上图为我对该虚拟机的配置,16g内存,8核处理,500g机械(看网上大佬们给出的配置12g内存基本够用,但是为了维稳我这儿选择了16g)

setting kali Linux

对虚拟机进行配置后,进入到kali开始最基础的准备工作配置

  1. 设置永不睡眠

android的编译动则几个小时,所以一定要关闭kali的息屏

Power Manager -> Display - > 右上角按钮关闭 -> Blank after 选为 Never

  1. 磁盘分区

磁盘分区之后可以更好的存放android source、kernel source

 使用kali自带的Gparted,输入root密码,然后在弹出的界面中会看到一条默认的“unallocated”,右键此条,选择新建,新的弹窗中不需要任何操作,全部默认即可,新增之后,点击导航栏中的“✔” apply即可,成功后如下图所示

1
2
3
4
5
6
7
# 分盘之后新建文件夹

mkdir /home/kali/Desktop/compile

# mount 挂载文件夹

mount /dev/sda3 /home/kali/Desktop/compile

 mount执行完成后,df -h 查看当前磁盘分区【本文写在android编译完成后,所以忽略磁盘占用】

环境配置

Java版本管理

Java download address

apt-get install software-properties-common

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 解压下载的压缩包
tar -xvf jdk-8u321-linux-i586.tar.gz

# 验证是否可以使用
jdk1.8.0_321/bin/java -version

# 移动到share目录
mv jdk1.8.0_321 /usr/share

# 再次验证
/usr/share/jdk1.8.0_321/bin/java -version

# 可以正常输出后,引入到环境变量
export JAVA_HOME=/usr/share/jdk1.8.0_301
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin

如果下载错误,那就会报如下错误:

zsh: exec format error: java

看仔细自己uname -a的版本号即可,成功后的正确版本显示如下

1
2
3
4
5
6
7
8
# 显示当前已注册列表
update-alternatives --display java

# 注册最新安装的java
update-alternatives --install /usr/bin/java java /usr/share/jdk1.8.0_321/bin/java 100

# 为了编译内核,将java版本选择到java8
update-alternatives --config java

gcc 版本控制

 此处为重大的踩坑点,由于使用的是最新的kali,所以gcc的版本已经是11,必须对其进行降版处理,否则编译时99%会出现出错;但是网上查询到的所有kali源最低版本也仅是gcc-10,这个kali官网也有相关说明

所以针对该情况,就要对源做相应的变动:使用阿里云官方镜像的Debian源进行更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vim /etc/apt/sources.list

# Debian 11.x

deb http://mirrors.aliyun.com/debian/ bullseye main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ bullseye main non-free contrib
deb http://mirrors.aliyun.com/debian-security/ bullseye-security main
deb-src http://mirrors.aliyun.com/debian-security/ bullseye-security main
deb http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib
deb http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib
deb-src http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib

apt-get update

更新完成后,apt-cache search gcc | grep gcc-9 就能搜索到对应的gcc-9版本,安装即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 安装gcc-9

apt install gcc-9

# update-alternatives 多版本配置

# config gcc version

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 10

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 20

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 30

# config g++ version

update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 10

update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 20

update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 30

# update-alternatives config

update-alternatives --config gcc

update-alternatives --config g++

update-alternatives 的命令此处就不一一赘述了,依据上述命令,选择对应的gcc版本即可

apt基础环境配置

1
2
3
4
5
6
7
8
9
10
11
12
13
# apt install 基础配置库

apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5-dev lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

apt install android-tools-adb

apt install android-tools-fastboot

# install aosp

mkdir ~/.bin
export PATH=~/.bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.bin/repo

开始编译

android 9 + kernel 3.*

编译内核切记:android版本与kernel版本,一定要和手机的一致

然后内核编译的总路线为:

download android -> download kernel -> git checkout kernel version -> make kernel

下面开始正式的内核编译

android 9 源码下载

download android 9

android 9 的源码大概有100+G左右

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 配置Git

git config --global user.email "shui@kali.com"

git config --global user.name "shui"

# 创建android 代码仓库,注意,代码极其庞大,所以一定要在上文中磁盘分区后的位置进行操作

/home/kali/Desktop/compile

mkdir aosp & cd aosp

# 初始化代码仓库,此处使用清华国内aosp源

export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'

~/bin/repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-9.0.0_r46

# 同步代码仓库

~/bin/repo sync

kernel 3.18 源码下载

download kernel

kernel 3.18 的源码大概有30+G左右

注意:kernel 的下载不是根据网上别人下载什么自己下载什么,而是根据自己的手机型号去下载内核,此处提供官方的俩个表格供大伙选择(仅google系的手机,非google系的手机请移步参考文档 - 手机内核wiki

build-kernels

repo内核分支

此处我的手机为Pixel XL,所以依据上文对照表可以得出,kernel的版本为msm - marlin

1
2
3
4
5
6
7
# download kernel

# 此处可以可以选择把大版本msm下载下来,也可以选择repo的模式下载,此处选择

git clone https://aosp.tuna.tsinghua.edu.cn/kernel/msm.git

cd msm

把对应的大版本下载之后,就是选择checkout出小版本即可,小版本只需要adb查看proc version

你可以将3.18之后的都复制,即红框圈住的都复制,也可以只复制”-g”后面的字符串

1
2
3
4
5
# git checkout 对应小版本

git checkout 3.18.100-ga3ced9894032

git branch -vv

查看先在的Git 分支如下所示

kernel 3.18 内核编译

 其实如果按照google source 官网描述,编译内核只需要执行其内部的build.sh文件即可(事实证明,kernel 4.9确实如此),但是呢,如果按照git clone msm这种大版本下载的呢,他没有build.sh,这你说咋整

此时,只能按照最原始的方案,通过android 9 自带的交叉编译来make

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 为了防止编译报错,再补充apt install 如下组件

apt-get install bc

apt-get install liblz4-tool

apt install -y curl wget vim git ccache automake flex lzop bison gperf \\nbuild-essential zip zlib1g-dev g++-multilib libxml2-utils bzip2 libbz2-dev \\nlibbz2-1.0 libghc-bzlib-dev squashfs-tools pngcrush schedtool dpkg-dev \\nliblz4-tool make optipng maven libssl-dev pwgen libswitch-perl \\npolicycoreutils minicom libxml-sax-base-perl libxml-simple-perl bc \\nlibc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev \\nlibgl1-mesa-dev xsltproc unzip device-tree-compiler kmod python3 python3-pip

# 环境变量配置

export ANDROID_AARCH64=/home/kali/Desktop/compile/aosp/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin

export ARCH=arm64

export SUBARCH=arm64

export PATH=$PATH:$ANDROID_AARCH64

export CROSS_COMPILE=aarch64-linux-android-

# 选择编译的内核,前文提到,Pixel XL的内核为“marlin”

make marlin_defconfig

make

 此处说明一下,make到底可以编译哪个config,是由configs目录下存在的文件控制的,查看该目录下方文件,如果根据网上的一些教程去编译,大概率会报错Makefile文件不存在

make marlin_defconfig result

make result

编译成功后,生成的结果会留存到“arch/arm64/boot”目录下

android 9 编译

 目前我自身的理解是,任何的kernel编译结束之后,都需要去编译对应的android,生成相应文件,然后刷入系统,当然,如果走的是“# bootimg-tools”可能路线不一样,这个我没试过,所以也不加赘述,下面是我编译android 9的相关操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 将上文编译成功的kernel文件复制到android9文件夹

cp ../msm/arch/arm64/boot/Image.lz4 device/google/marlin-kernel/Image.lz4

# 自主生成编译环境

source build/envsetup.sh

# 选择编译的系统,由于我的手机内核是marlin,并且是用于调试且带root的,所以选择编译如下系统

lunch aosp_marlin-userdebug

# 开始编译,依据系统性能不同,我编译花费了2小时
make -j8

有一些命令执行后可能会出现一些传统理解上的以为的报错,所以此处把我编译时结果图贴一下

source build/envsetup.sh

lunch可供选择的编译项

 lunch 这里如果没有按照上面的步骤把kernel的结果拷贝进来的话,可能会出现报错,具体报错可到“踩坑报错 - Can not locate config makefile for product” 中自行判断

lunch aosp_marlin-userdebug

make -j8 编译成功如下图所示

android系统的编译速度相较于kernel那是真的满,所以倒杯茶慢慢等吧

android编译成功后,会在out/target/product/[kernel_name]下生成各种img

刷入手机

 上文中已经把android、kernel都编译完成,最终生成了对应的img文件,此时,只需要把他们刷入手机即可

1
2
3
adb reboot bootloader

fastboot flashall -w

 至此,android kernel 的内核更换完成,依照此步骤,就可以通过修改kernel,并重新刷入手机的方式来做一些bypass的操作

踩坑报错

注意:进入跑错排查之后,切记,一定要清空之前的错误编译,即,必须执行“make clean”

Can not locate config makefile for product “cf_x86_64_wear”.

此报错是lunch编译选择后,报的错误,错误截图如下

网上找了一圈也没有相关的排错方案,我就贴一下自己的吧

1
2
3
4
5
6
7
8
9
10
11
# 引入环境变量【但是不清楚这一步是否有用,他只是引入了kernel编译好之后的文件】

export TARGET_PREBUILT_KERNEL=/home/kali/Desktop/compile/msm/arch/arm64/boot/Image.lz4-dtb

# 将kernel编译好的文件复制到android系统文件夹中,这一步至关重要,没有这一步,就会出现这个错误

cp ../msm/arch/arm64/boot/Image.lz4 device/google/marlin-kernel/Image.lz4

# 引入之后,正常编译即可

lunch aosp_marlin-userdebug

执行结果如下图所示

SyntaxError: invalid syntax

 这个报错是make 编译android系统时候出现的报错,这个错误其实都不用搜索,看trace_back就能知道为什么

下图报错中的箭头指向,很明显是Python2 的文件,但是被Python3去编译了,此时只需要将Python2设置成默认的python即可

1
ln -s /usr/bin/python2 /usr/bin/python

Please unlock device to enable this command.

 这个报错就是血与泪的教训了,首先它是发生在刷级过程中的一个报错,顾名思义,你需要把你的手机解锁,然后再去刷机……

总结

 网上很多关于android kernel 编译的文章大都写于2 - 3年前,现在看来有一些或多或少的不适配,所以在重走大佬研究之路时,踩了很多很多的坑,也就有了这篇文章;但是你在阅读本文时,会有一个很明显的发现:apt install 的东西很多,这个完全是因为看了很多文章,装了太多的环境,实在是不知道哪个是对的,所以就都安装了……

  1. 手机一定要解BL锁,要不然一切的编译都是徒劳,刷不到手机里面的;
  2. android源码的初始化,只需要按照清华aosp镜像站步骤,在kali中repo init 对应的android版本即可
  3. kernel不是随便下载的,是依据你当前手机的型号找到大版本,然后/proc/version中记载的小版本去切换分支的;
  4. gcc-9是最佳的编译器,gcc-10 / gcc-11 都会出现一定的错误,如果懒得排错,那就认准gcc-9;
  5. Java版本无所谓,kernel自带java编译环境;
  6. Python的环境一定要是python2,否则在编译android 9时会报错;
  7. 看再多的文章都是别人的经验之谈,一定要去看官网

参考文档

aliyun镜像站

source.android

清华站aosp镜像站

手机内核wiki

2020年安卓源码编译指南及FART脱壳机谷歌全设备镜像发布

记一次安卓内核源码编译刷机过程(修改反调试标志位

Nexus 5X过反调试修改Android内核实践笔记

Pixel 3 构建为内核的 Android 11