小米6kernel源码编译

前言

要换工作了,最近的工作内容主要是交接!交接,人一闲下来心思就会活跃起来,想想之前自己在技术点上挖了很多坑,终于有机会开始补!补!补!。第一项就是给自己的xiaomi6装个nethunter吧!

nethunter

nethunter是kali出品的一个移动渗透测试平台,包含一个自定义kernel,一个kali linux chroot和一堆android app。除了kali linux中的渗透测试工具库外,还支持HID键盘攻击、BadUSB攻击、Evil AP MANA攻击等等。当然这些进阶功能就需要自定义kernel支持了。

nethunter支持设备

这个数据可以从github.com/offensive-security/kali-nethunter/wiki中得到。主要支持谷歌的亲儿子 Nexus系列,国外很火的一加系列,还有索尼、LG的某些款等。没有我国际米,真是遗憾。

移植新设备的要求

虽然官方不支持,但是我现在有时间啊!燥起来!!翻看官网的移植章节,核心要求有两个:

  1. 有内核源码 (蓝牙、无线USB、HID键盘等工作的基础)
  2. 可以解锁刷机 (不能刷机就睡觉吧)

刷机就不说了,绝对没问题。唯一的要求就是有内核源码了。 百度一搜,xiaomi6已经在github上开源了 (https://github.com/MiCode/XiaoMi_Kernel_OpenSource) ,不过只有N、O两个版本。低头一看,我的手机刷的是开发版现在已经是P了 。不重要,不重要。

编译源码

物料

1、操作系统 ubuntu 14.04 64bit 2、交叉编译环境 aarch64-linux-android-4.9 谷歌官网下载就不要想了,这边推荐一个编译集合包 https://bitbucket.org/jonascardoso/toolchain_aarch64_travis/downloads ,里面不止有google_gcc,还有linaro_gcc、sabermod_gcc、ubertc_gcc。 3、内核源码 这边要选择自己手机对应的版本。xiaomi6对应代号是sagit,我选择android o版本的内核源码,所以对应的分支就是sagit-o-oss

1
git clone --depth=1 https://github.com/MiCode/XiaoMi_Kernel_OpenSource -b sagit-o-oss

环境准备

工作目录:

  • /home/jiutian/kernel 主目录
  • /home/jiutian/kernel/toolchain 交叉编译链工具
  • /home/jiutian/kernel/XiaoMi_Kernel_OpenSource 源码

运行环境

注意: 1、CROSS_COMPILE路径中使用了google_gcc作为编译链。 2、CROSS_COMPILE最后有且只有一个-号。

1
2
3
4
5
6
7
8
export ARCH=arm64
export SUBARCH=arm64
export CROSS_COMPILE=/home/jiutian/kernel/toolchain/google_gcc/aarch64-linux-android-4.9/bin/aarch64-linux-android-
```

## 动手
### 生成.config文件
翻翻源码包XiaoMi_Kernel_OpenSource\arch\arm64\configs目录,找到自己的defconfig文件。优先找手机代号、其次CPU型号、最后就是通用文件。 这边我使用sagit_user_defconfig文件。

make O=out sagit_user_defconfig

1
2
3
4
5

O表示编译后的输出目录。

### 修改.config文件
进入out目录,打开kernel配置菜单,按照nethunter wiki中的说明,调整kernel配置文件。

打开配置菜单

cd out make menuconfig

1
2
3
4
5
6
7
8
9
10
11
12

[y] 编译进kernel
[n] 不编译进kernel
[m] 模块化,使用时加载
[?] 帮助,依赖时查看信息

#### 注意
SDR相关的选项没有找到。。


### 编译
退出out目录,开始编译。我这边在虚拟机执行,就不开多线程了。

cd ..

make O=out -j8 开启多线程编译

make O=out


### 完成
等待编译完成,可以在out/arch/arm64/boot目录下找到我们的目标文件zImage-dtb(zImage)。


## 附录
#### 没有opensslv.h
sudo apt-get install libssl-dev
#### 没有curses.h
sudo apt-get install libncurses5-dev 

#### struct hci_uart no member named cx_lock
注释掉报错行 spin_lock_init(&hu->rx_lock);
参考: https://git.isee.biz/linux-kernel/linux-imx/commit/7649faff1cfe4f76dabf78cd53d659d39f65b3c1#667510e12d093c97206ed983579be74ed134a8a8_472_472