下面的方法是基于编译完Android系统源码之后,再另外下载Linux内核进行编译调试的。我在编译Android6.0.1源码,烧录到nexus5真机上这篇文章中编译的是lunch 8
,即aosp_hammerhead-userdebug,但是用emulator
启动模拟器时,需要用模拟器版本的编译lunch 1
,即aosp_arm-eng。
下载Android内核源码
1 | $ cd /Computer/Android/android4.4.2/kernel |
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 | $ make menuconfig # 到Kernel hacking中打开Compile the kernel with debug info、Enable dynamic printk() support、KGDB |
我编译的时候出过一些错误,也不知道怎么解决,MD再编译一遍错误就没有了,编译了3遍就成功了,还好内核源码编译比系统源码编译快。
在模拟器中运行编译的内核
1 | $ cd ../.. |
调试Android内核
首先要在/tmp文件夹下创建一个qemu文件夹,再在qemu里创建Socket文件:
1 | $ cd /tmp; mkdir qemu; cd qemu; touch Socket |
配置一个环境变量,在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 | # 到goldfish目录中 |
reference
https://github.com/Fuzion24/AndroidKernelExploitationPlayground