BruceFan's Blog

Stay hungry, stay foolish

0%

Android内核源码编译调试

下面的方法是基于编译完Android系统源码之后,再另外下载Linux内核进行编译调试的。我在编译Android6.0.1源码,烧录到nexus5真机上这篇文章中编译的是lunch 8,即aosp_hammerhead-userdebug,但是用emulator启动模拟器时,需要用模拟器版本的编译lunch 1,即aosp_arm-eng。

下载Android内核源码

1
2
3
$ cd /Computer/Android/android4.4.2/kernel
$ git clone https://android.googlesource.com/kernel/goldfish.git
$ cd goldfish

Goldfish是一种虚拟的ARM处理器,在android的仿真环境中使用。
查看支持哪些Linux内核版本的下载:

1
$ git branch -a

选择3.4内核版本进行下载:

1
$ git checkout -t remotes/origin/android-goldfish-3.4 -b goldfish3.4

分支goldfish3.4设置为跟踪来自origin的远程分支android-goldfish-3.4,切换到一个新分支goldfish3.4

开始编译

1
2
3
4
5
6
7
$ make menuconfig # 到Kernel hacking中打开Compile the kernel with debug info、Enable dynamic printk() support、KGDB
$ make ARCH=arm goldfish_armv7_defconfig
$ make ARCH=arm SUBARCH=arm CROSS_COMPILE=/home/fanrong/Computer/Android/android4.4.2/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin/arm-eabi-

... // 一路Enter
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready

我编译的时候出过一些错误,也不知道怎么解决,MD再编译一遍错误就没有了,编译了3遍就成功了,还好内核源码编译比系统源码编译快。

在模拟器中运行编译的内核

1
2
3
4
5
$ cd ../..
$ source build/envsetup.sh
$ lunch
[aosp_arm-eng]
$ emulator -debug init -kernel kernel/goldfish/arch/arm/boot/zImage -system out/target/product/generic/system.img -ramdisk out/target/product/generic/ramdisk.img

用已编译的内核启动Android模拟器

调试Android内核

首先要在/tmp文件夹下创建一个qemu文件夹,再在qemu里创建Socket文件:

1
2
3
$ cd /tmp; mkdir qemu; cd qemu; touch Socket
# 回到Android源码根目录
$ emulator -debug init -kernel kernel/goldfish/arch/arm/boot/zImage -system out/target/product/generic/system.img -ramdisk out/target/product/generic/ramdisk.img -qemu -monitor unix:/tmp/qemu/Socket,server,nowait -s

配置一个环境变量,在PATH中加入arm-linux-androideabi-gdb所在路径:

1
/home/fanrong/Computer/Android/android4.4.2/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7/bin

另开一个终端:

1
2
3
4
5
6
7
# 到goldfish目录中
$ arm-linux-androideabi-gdb vmlinux
...
(gdb) target remote :1234
Remote debugging using :1234
0xc00155c8 in cpu_v7_do_idle ()
(gdb)

reference
https://github.com/Fuzion24/AndroidKernelExploitationPlayground