一、 开发前期准备

本文中使用的是linageOs源码中下载的oneplus3 安卓10内核源码进行研究测试。交叉编译链使用的是linageOs源码中的交叉编译链。

lineageOs源码中oneplus3内核源码位置路径:

/home/qiang/lineageOs/kernel/oneplus/msm8996

lineageOs源码中交叉编译目录位置路径:

/home/qiang/lineageOs/prebuilts/gcc/linux-x86

为了方便研究测试,不破坏lineageOs中的内核源码结构。我新建一个目录专门存放内核源码、内核模块源码。并将内核源码拷贝到该目录。

本文后续测试的内核源码目录路径:

 home/qiang/myproject/kernel/oneplus3/msm8996

本文后续内核模块编写存放目录路径:

/home/qiang/myproject/kernel/oneplus3/modules

二、编译内核源码

  1. 找到oneplus3设备的内核源码配置

安卓源码中device/厂商/手机型号/BoardConfig.mk文件中配置了内核源码路径和编译配置文件。因此在device/oneplus/oneplus3/BoardConfig.mk中存放了相关的内核配置信息,如下所示:

BOARD_KERNEL_BASE := 0x80000000BOARD_KERNEL_PAGESIZE := 4096BOARD_KERNEL_TAGS_OFFSET := 0x02000000BOARD_RAMDISK_OFFSET     := 0x02200000BOARD_KERNEL_IMAGE_NAME := Image.gz-dtbTARGET_KERNEL_SOURCE := kernel/oneplus/msm8996TARGET_KERNEL_CONFIG := lineageos_oneplus3_defconfig

以上TARGET_KERNEL_CONFIG变量指定了oneplus3内核的编译配置文件名为:lineageos_oneplus3_defconfig

在内核源码中编译配置文件一般存放在路径arch/处理器平台/configs下面。由于一加3手机为arm64,所以在路径arch/arm64/configs下找到配置文件lineageos_oneplus3_defconfig。如下所示:

qiang@ubuntu:~/myproject/kernel/oneplus3/msm8996/arch/arm64/configs$ pwd/home/qiang/myproject/kernel/oneplus3/msm8996/arch/arm64/configs

qiang@ubuntu:~/myproject/kernel/oneplus3/msm8996/arch/arm64/configs$ ls -la lineageos_oneplus3_defconfig-rw-rw-r-- 1 qiang qiang 15001 1月   3 23:00 lineageos_oneplus3_defconfig
  1. 为编译配置添加内核可加载、卸载选项

由于编译内核模块的时候需要依赖于已经编译过的内核输出,并且内核需要配置为可加载才能正常编译内核模块。所以需要修改一下arch/arm64/configs/lineageos_oneplus3_defconfig,添加如下配置项。

# 开启内核模块可加载CONFIG_MODULES=y# 开启内核模块可卸载CONFIG_MODULE_UNLOAD=y
  1. 配置编译内核源码脚本

脚本如下

# 设置编译平台为64位armexport ARCH=arm64export SUBARCH=arm64# 配置arm64的交叉编译路径export PATH=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin:$PATH# 配置32位arm的交叉编译路径# 测试过程中32位的不设置居然编译不过export PATH=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin:$PATH

# 设置64位交叉编译工具前缀# 这个前缀其实就是交叉编译链路径/home/qiang/lineageOs/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin 下面的工具的公共前缀export CROSS_COMPILE=aarch64-linux-android-

# 设置32位交叉编译工具前缀# 这个前缀其实就是交叉编译链路径/home/qiang/lineageOs/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin 下面的工具的公共前缀export CROSS_COMPILE_ARM32=arm-linux-androideabi-

# 通过make命令生成编译配置文件.config# O=out指定输出目录  lineageos_oneplus3_defconfig:这个是oneplus3的内核编译配置make  O=out lineageos_oneplus3_defconfig

#  执行内核编译make -j2 O=out ARCH=arm64

以上脚本在终端难的一个一个的输入,我将上面的弄成一个make.sh文件,到时候直接执行。make.sh内容如下:

#!/bin/bash# 切换到内核源码根目录去 cd ./msm8996make mrpropermake cleanexport ARCH=arm64export SUBARCH=arm64export PATH=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin:$PATHexport PATH=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin:$PATHexport CROSS_COMPILE=aarch64-linux-android-export CROSS_COMPILE_ARM32=arm-linux-androideabi-make -j2 O=out lineageos_oneplus3_defconfigmake -j2  O=out ARCH=arm64

在终端执行make.sh之后就可以看到编译内核了,如下所示:

qiang@ubuntu:~/myproject/kernel/oneplus3$ ./make.sh make[1]: Entering directory '/home/qiang/myproject/kernel/oneplus3/msm8996/out'  GEN     ./Makefile  HOSTCC  scripts/basic/fixdep  HOSTCC  scripts/kconfig/conf.o  HOSTCC  scripts/kconfig/zconf.tab.o  HOSTLD  scripts/kconfig/conf

编译完成之后,可以在目录/home/qiang/myproject/kernel/oneplus3/msm8996/out下面找到编译产生的文件和内核镜像。

三、编写helloworld模块

此处编写一个简单的HelloWorld模块进行研究测试。

  1. 创建helloworld.c模块源文件

文件代码如下:

#include #include #include static int __init hello_init(void){   printk(KERN_ALERT "Hello World!\n");   return 0;}static void __exit hello_exit(void){   printk(KERN_ALERT "See You,Hello World!\n");}module_init(hello_init);module_exit(hello_exit);
  1. 创建模块编译配置文件Makefile

Makefile如下:

# 设置内核源码编译的输出目录KERNEL_OUT=/home/qiang/myproject/kernel/oneplus3/msm8996/out# 设置arm64交叉编译链工具路径TOOLCHAIN=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-# 设置arm32交叉编译链工具路径TOOLCHAIN32=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-# 设置模块obj-m := helloworld.o# 编译命令配置 all: make ARCH=arm64 CROSS_COMPILE_ARM32=$(TOOLCHAIN32)  CROSS_COMPILE=$(TOOLCHAIN) -C $(KERNEL_OUT) M=$(shell pwd)  modules# 清理编译命令clean: make -C $(KERNEL_OUT) M=$(shell pwd) clean
  1. 在helloworld模块目录执行make命令进行编译

编译如下:

qiang@ubuntu:~/myproject/kernel/oneplus3/modules/helloworldmodule$ pwd/home/qiang/myproject/kernel/oneplus3/modules/helloworldmodule

qiang@ubuntu:~/myproject/kernel/oneplus3/modules/helloworldmodule$ ls -latotal 16drwxrwxr-x 2 qiang qiang 4096 1月   5 21:18 .drwxrwxr-x 6 qiang qiang 4096 1月   5 21:17 ..-rw-rw-r-- 1 qiang qiang  310 1月   5 21:06 helloworld.c-rw-rw-r-- 1 qiang qiang  498 1月   5 21:08 Makefile

qiang@ubuntu:~/myproject/kernel/oneplus3/modules/helloworldmodule$ makemake ARCH=arm64 CROSS_COMPILE_ARM32=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androideabi-  CROSS_COMPILE=/home/qiang/lineageOs/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android- -C /home/qiang/myproject/kernel/oneplus3/msm8996/out M=/home/qiang/myproject/kernel/oneplus3/modules/helloworldmodule  modulesmake[1]: Entering directory '/home/qiang/myproject/kernel/oneplus3/msm8996/out'  CC [M]  /home/qiang/myproject/kernel/oneplus3/modules/helloworldmodule/helloworld.o  Building modules, stage 2.  MODPOST 1 modules  CC      /home/qiang/myproject/kernel/oneplus3/modules/helloworldmodule/helloworld.mod.o  LD [M]  /home/qiang/myproject/kernel/oneplus3/modules/helloworldmodule/helloworld.komake[1]: Leaving directory '/home/qiang/myproject/kernel/oneplus3/msm8996/out'

模块编译好之后就可以 adb push到手机,使用insmod加载模块进行测试验证了。以后就可以通过写内核系统hook模块进行系统调用内核层拦截、写netfileter hook模块进行网络管控等等操作。

专注安卓系统、安卓ndk开发、安卓应用安全和逆向分析相关知识分享,系统定制、frida、xposed(sandhook、edxposed)系统集成、加固、脱壳等等。关注公众号第一时间接收更新文章。

编译32位_玩转Android10源码开发定制(11)内核篇之安卓内核模块开发编译相关推荐

  1. 玩转Android10源码开发定制(二)之基于Pixel 3手机超级详细演示fastboot刷机

    玩转Android10源码开发定制(二)之基于Pixel 3手机超级详细演示fastboot刷机 本节主要内容: Pixel 3通过fastboot方式刷入Android 11.0官方工厂镜像 Pix ...

  2. 玩转Android10源码开发定制(二)之基于Pixel 3手机超级详细演示recovery刷机

    玩转Android10源码开发定制(二)之基于Pixel 3手机超级详细演示recovery刷机 本节主要内容: Pixel 3通过fastboot方式刷入Android 11.0官方工厂镜像 Pix ...

  3. 玩转Android10源码开发定制(五)之源码目录说明及模块源码路径定位

    玩转Android10源码开发定制(五)之源码目录说明及模块源码路径定位 本节主要内容: 安卓源码中的目录功能说明 源码中模块的源码文件路径获取 源码中关键字搜索 1.源码目录功能说明 1.1 源码目 ...

  4. Android10源码AOSP(从Ubuntu14.04环境搭建到下载编译运行)

    Ubuntu14.04环境搭建 电脑为笔记本,CPU i7-10750H,16G内存 虚拟机使用VMware Workstation 15 Pro 操作系统为Ubuntu 64 位 14.04 AOS ...

  5. Qt5串口多功能助手32位版本相关程序含源码

    开发平台:Qt 5.9 编译环境:MinGW 5.3  32bit Qt6.3-64位版本文章链接:(102条消息) Qt6串口多功能助手64位版本上位机源码_阿衰0110的博客-CSDN博客 免费安 ...

  6. python 取余_玩转Python源码(一) quot;%squot;与“%d”

    某一天吹水的时候,吹着吹着就吹到了一下这么一个案例. import timeitdef a():"%s, %s" % (1, 2)def b():"%s, %d" ...

  7. 玩转Android10源码开发定制(八)内置Apk到系统

    1.Android.mk文件说明        Android.mk是Android提供的一个makefile文件,可以将源文件分组为模块.用来引用的头文件目录.需要编译的*.c/*.cpp文件.jn ...

  8. 玩转Android10源码开发定制(二)刷机操作之fastboot刷机演示

    一.演示软硬件环境 PC配置:Window10 64bit 手机型号:pixel 2 手机代号:walleye 二.配置adb和fasboot  1.从以下地址下载windows系统运行的androi ...

  9. 玩转Android10源码开发定制(二)之基于oneplus3手机演示recovery刷机

    一.演示环境准备 PC环境: Windows10 64bit 手机设备: oneplus 3 为了保证刷机成功,请将oneplus 3官方系统升级到Android9及以上系统. 提前配置好adb和fa ...

最新文章

  1. 一句white-space:nowrap解决IE6,IE7下浮动元素不自动换行
  2. hibernate中的PO持久化对象及PO三种状态
  3. 前端(二)——HTML之列表、表格、媒体元素
  4. Docker常用操作
  5. LeetCode 660. 移除 9(9进制)
  6. android 方法统计,Android 利用编译时 注入 统计App内所有方法执行时常,分析ANR
  7. android动画帧率_Android流畅度之帧率
  8. 社保基金入市规模或达3000亿元
  9. Undefined control sequence.l.463 \cita
  10. CAS学习笔记(三)—— SERVER登录后用户信息的返回
  11. JP-Word 简谱编辑(JPW简谱)打谱软件免费版下载 WiN
  12. android 仿站小工具,仿站小工具
  13. endnote layout can not be formatted because it is no longer open
  14. 行业分析常用到的21个网站
  15. 从乡巴佬到世界首富,连续7年蝉联全球最大公司:真正厉害的人,都敢于不走寻常路...
  16. AI RoboForm 7.3.2发布[附pro破解方法]
  17. 形态学-----细化
  18. 2022 年最受欢迎的 19个 VS Code 主题排行榜
  19. 计算机网络基础——应用层
  20. Java工程师成神之路:进阶架构师的学习路线规划以及书籍推荐

热门文章

  1. std::jthread与std::thread的区别
  2. elasticsearch id查询_互联网公司中对【Elasticsearch】的真实应用案例
  3. Certificates, Identifiers Profiles创建总结
  4. encryption
  5. 别说我懂社交网络: 关于社交网络分析的一头雾水
  6. qemu-kvm部署虚拟机
  7. 深入Spring:自定义注解加载和使用
  8. JavaScript 总结几个提高性能知识点
  9. 【百度地图API】如何调整结果面板的样式?如何获取指定页码的结果?
  10. DHCP服务器-配置