Android kernel 入坑之旅
项目初衷
单纯的想要打造一个自己的渗透手机,去完成渗透过程中的一些对抗。
- 手机的选择
- 编译环境的配置
- aosp配置
- download android source
- download kernel source
- 编译android - 9
- 编译kernel - 3.18
- 刷入android设备
开篇汇总
本文主要用于记录自己在编译Android内核期间踩过的一些坑,以及各种百度、谷歌、必应的心酸;看着自己跟着网上教程走了一圈又一圈,删了一个又一个的虚拟机,总结出来的还是三个字:看!官!网!
1 | kali源:[aliyun镜像站](https://developer.aliyun.com/mirror/) |
环境配置
手机选择
这个是内核编译中最大、最大、最大的坑,google有一款verizon版本的手机,该手机是不支持解BL锁的,即网上常说的“OEM unlock 是灰色”,这种情况下,如果没有特定工具是解不开的,所以,不论是从哪儿淘Pixel系列手机,一定要和商家说:
- 我要一款BL锁解开的手机
- 说出自己想要的款式,我个人用的是Pixel XL、Pixel 3XL
- 说出自己需要的特定的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开始最基础的准备工作配置
- 设置永不睡眠
android的编译动则几个小时,所以一定要关闭kali的息屏
Power Manager -> Display - > 右上角按钮关闭 -> Blank after 选为 Never
- 磁盘分区
磁盘分区之后可以更好的存放android source、kernel source
使用kali自带的Gparted,输入root密码,然后在弹出的界面中会看到一条默认的“unallocated”,右键此条,选择新建,新的弹窗中不需要任何操作,全部默认即可,新增之后,点击导航栏中的“✔” apply即可,成功后如下图所示

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

环境配置
Java版本管理
apt-get install software-properties-common

1 | 解压下载的压缩包 |

如果下载错误,那就会报如下错误:
zsh: exec format error: java

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

1 | 显示当前已注册列表 |


gcc 版本控制
此处为重大的踩坑点,由于使用的是最新的kali,所以gcc的版本已经是11,必须对其进行降版处理,否则编译时99%会出现出错;但是网上查询到的所有kali源最低版本也仅是gcc-10,这个kali官网也有相关说明
所以针对该情况,就要对源做相应的变动:使用阿里云官方镜像的Debian源进行更新
1 | vim /etc/apt/sources.list |
更新完成后,apt-cache search gcc | grep gcc-9 就能搜索到对应的gcc-9版本,安装即可

1 | 安装gcc-9 |
update-alternatives 的命令此处就不一一赘述了,依据上述命令,选择对应的gcc版本即可
apt基础环境配置
1 | apt install 基础配置库 |
开始编译
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 | 配置Git |
kernel 3.18 源码下载
download kernel
kernel 3.18 的源码大概有30+G左右
注意:kernel 的下载不是根据网上别人下载什么自己下载什么,而是根据自己的手机型号去下载内核,此处提供官方的俩个表格供大伙选择(仅google系的手机,非google系的手机请移步参考文档 - 手机内核wiki )


此处我的手机为Pixel XL,所以依据上文对照表可以得出,kernel的版本为msm - marlin
1 | download kernel |
把对应的大版本下载之后,就是选择checkout出小版本即可,小版本只需要adb查看proc version

你可以将3.18之后的都复制,即红框圈住的都复制,也可以只复制”-g”后面的字符串
1 | git checkout 对应小版本 |
查看先在的Git 分支如下所示

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

此时,只能按照最原始的方案,通过android 9 自带的交叉编译来make
1 | 为了防止编译报错,再补充apt install 如下组件 |
此处说明一下,make到底可以编译哪个config,是由configs目录下存在的文件控制的,查看该目录下方文件,如果根据网上的一些教程去编译,大概率会报错Makefile文件不存在

make marlin_defconfig result

make result

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

android 9 编译
目前我自身的理解是,任何的kernel编译结束之后,都需要去编译对应的android,生成相应文件,然后刷入系统,当然,如果走的是“# bootimg-tools”可能路线不一样,这个我没试过,所以也不加赘述,下面是我编译android 9的相关操作
1 | 将上文编译成功的kernel文件复制到android9文件夹 |
有一些命令执行后可能会出现一些传统理解上的以为的报错,所以此处把我编译时结果图贴一下
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 | adb reboot bootloader |

至此,android kernel 的内核更换完成,依照此步骤,就可以通过修改kernel,并重新刷入手机的方式来做一些bypass的操作
踩坑报错
注意:进入跑错排查之后,切记,一定要清空之前的错误编译,即,必须执行“make clean”
Can not locate config makefile for product “cf_x86_64_wear”.
此报错是lunch编译选择后,报的错误,错误截图如下

网上找了一圈也没有相关的排错方案,我就贴一下自己的吧
1 | 引入环境变量【但是不清楚这一步是否有用,他只是引入了kernel编译好之后的文件】 |
执行结果如下图所示

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 的东西很多,这个完全是因为看了很多文章,装了太多的环境,实在是不知道哪个是对的,所以就都安装了……
- 手机一定要
解BL锁,要不然一切的编译都是徒劳,刷不到手机里面的; - android源码的初始化,只需要按照清华aosp镜像站步骤,在
kali中repo init 对应的android版本即可; - kernel不是随便下载的,是依据你当前手机的型号找到大版本,然后/proc/version中记载的小版本去切换分支的;
gcc-9是最佳的编译器,gcc-10 / gcc-11 都会出现一定的错误,如果懒得排错,那就认准gcc-9;- Java版本无所谓,kernel自带java编译环境;
- Python的环境一定要是
python2,否则在编译android 9时会报错; - 看再多的文章都是别人的经验之谈,一定要去看
官网。








