Android使用固定的key给ko(kernel module) 签名

前言

Android 原生默认每次编译使用自动生成在out目录的 pem和x509文件签名,由于种种原因我们可能需要使用固定的key给ko做签名,经过研究发现如果要使用固定的key来签名,需要做一下修改

1.拷贝已经自动生成的key到 kernel 目录

可以参考下面的命令

cp out/target/product/msmnile_gvmq/obj/kernel/msm-4.14/certs/signing_key.pem  kernel/msm-4.14/certs/signing_key_lee.pem
cp out/target/product/msmnile_gvmq/obj/kernel/msm-4.14/certs/signing_key.x509  kernel/msm-4.14/certs/signing_key_lee.x509

2.修改AndroidKernelModule.mk

文件路径在:device/qcom/common/dlkm/AndroidKernelModule.mk

--- a/dlkm/AndroidKernelModule.mk
+++ b/dlkm/AndroidKernelModule.mk
@@ -90,8 +90,8 @@ ifeq ($(TARGET_KERNEL_VERSION),3.18)
   MODPUBKEY := $(KERNEL_OUT)/signing_key.x509
 else
   MODULE_SIGN_FILE := $(KERNEL_OUT)/scripts/sign-file
-  MODSECKEY := $(KERNEL_OUT)/certs/signing_key.pem
-  MODPUBKEY := $(KERNEL_OUT)/certs/signing_key.x509
+  MODSECKEY := $(KERNEL_OUT)/certs/signing_key_lee.pem
+  MODPUBKEY := $(KERNEL_OUT)/certs/signing_key_lee.x509
 endif

3.修改kernel/msm-4.14/Makefile

diff --git a/msm-4.14/Makefile b/msm-4.14/Makefile
index 02402859b..635a0cdf9 100644
--- a/msm-4.14/Makefile
+++ b/msm-4.14/Makefile
@@ -1051,7 +1051,7 @@ INITRD_COMPRESS-$(CONFIG_RD_LZ4)   := lz4
 ifdef CONFIG_MODULE_SIG_ALL
 $(eval $(call config_filename,MODULE_SIG_KEY))
  
-mod_sign_cmd = scripts/sign-file $(CONFIG_MODULE_SIG_HASH) $(MODULE_SIG_KEY_SRCPREFIX)$(CONFIG_MODULE_SIG_KEY) certs/signing_key.x509
+mod_sign_cmd = scripts/sign-file $(CONFIG_MODULE_SIG_HASH) $(MODULE_SIG_KEY_SRCPREFIX)$(CONFIG_MODULE_SIG_KEY) certs/signing_key_lee.x509
 else
 mod_sign_cmd = true
 endif

4.修改defconfig

文件路径在:kernel/msm-4.14/arch/arm64/configs/vendor/qti-quin-gvm-perf_defconfig

diff --git a/msm-4.14/arch/arm64/configs/vendor/qti-quin-gvm-perf_defconfig b/msm-4.14/arch/arm64/configs/vendor/qti-quin-gvm-perf_defconfig
index 7e9bc9698..de55893cd 100644
--- a/msm-4.14/arch/arm64/configs/vendor/qti-quin-gvm-perf_defconfig
+++ b/msm-4.14/arch/arm64/configs/vendor/qti-quin-gvm-perf_defconfig
@@ -54,6 +54,7 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SIG=y
 CONFIG_MODULE_SIG_FORCE=y
 CONFIG_MODULE_SIG_SHA512=y
+CONFIG_MODULE_SIG_KEY="certs/signing_key_lee.pem"
 # CONFIG_BLK_DEV_BSG is not set
 CONFIG_PARTITION_ADVANCED=y
 # CONFIG_IOSCHED_DEADLINE is not set

5.修改编译脚本

此为自己写的你编译脚本,可以自己手动拷贝或者使用其他脚本达到目的
自己写的编译脚本在device/qcom/common/make.sh或 make.sh

diff --git a/make.sh b/make.sh
index 9b25ed2c..f6f14420 100755
--- a/make.sh
+++ b/make.sh
@@ -117,6 +117,11 @@ MEMTOTAL=$(cat /proc/meminfo |grep MemTotal | awk '{print $2;}')
 MEMGB=$(( $MEMTOTAL/1024/1024 ))
 IMAGE="all"
 BUILDIMG="true";
+SIG_KEY="out/target/product/msmnile_gvmq/obj/kernel/msm-4.14/certs/signing_key_lee.pem"
+SIG_PUB_KEY="out/target/product/msmnile_gvmq/obj/kernel/msm-4.14/certs/signing_key_lee.x509"
+SRC_KEY="kernel/msm-4.14/certs/signing_key_lee.pem"
+SRC_PUB_KEY="kernel/msm-4.14/certs/signing_key_lee.x509"
+KEY_DIR="out/target/product/msmnile_gvmq/obj/kernel/msm-4.14/certs/"
 # Setup getopt.
 long_opts="clean_build,help,image:,jobs:,kernel_defconf:,log_file:,module:,build_variant:"
 long_opts+="project:,update-api"
@@ -199,6 +204,17 @@ if [ -n "$PROJECT" ]; then
     build_project
 fi
  
+if [ ! -f "${SIG_KEY}" ]; then
+    mkdir -p "${KEY_DIR}"
+    cp ${SRC_KEY} ${SIG_KEY}
+    echo -e "\nINFO: USE $SRC_KEY to $SIG_KEY\n\n"
+fi
+if [ ! -f "${SIG_PUB_KEY}" ]; then
+    mkdir -p "${KEY_DIR}"
+    cp ${SRC_PUB_KEY} ${SIG_PUB_KEY}
+    echo -e "\nINFO: USE $SRC_PUB_KEY to $SIG_PUB_KEY\n\n"
+fi
+
 if [ "$BUILDIMG" == "true" ]; then
     if [ "$IMAGE" == "all" ]; then
         build_android "$CMD"

6.clean 全编译Android

可以使用自己写的脚本 bash make.sh -v user -c -j32 -u 重新编译

7.验证ko的签名

可以使用下面的命令:

hexdump -C out/target/product/msmnile_gvmq/vendor/lib/modules/v4l2loopback.ko | tail`

如图,记住签名的字串
在这里插入图片描述

8.再次使用 6的命令编译

9.再次使用 7的命令验证ko的签名,并比较7 和本次的签名字串是否一样

如果一样,就证明是成功的,就可以提交代码了

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是如何使用 Bazel 构建 Android 内核模块 "Hello World" 的步骤: 1. 安装 Bazel:在你的系统上安装 Bazel。你可以从 Bazel 的官网下载最新版本,或者使用包管理器(如 apt 或 brew)安装。 2. 准备 Android 内核源代码:在你的系统上下载 Android 内核源代码。你可以从 Android 官方网站或 GitHub 下载最新版本。 3. 创建 WORKSPACE 文件:在你的项目目录下创建一个名为 "WORKSPACE" 的文件。在这个文件中,你需要指定 Android 内核源代码的路径,以便 Bazel 能够找到它。 4. 创建 BUILD 文件:在你的项目目录下创建一个名为 "BUILD" 的文件。在这个文件中,你需要声明你的内核模块,并指定所需的依赖。 5. 编内核模块代码:在你的项目目录下创建一个名为 "helloworld.c" 的文件。在这个文件中,你需要编你的内核模块代码。你可以参考以下示例代码: ``` #include <linux/module.h> #include <linux/kernel.h> int init_module(void) { printk(KERN_INFO "Hello, world!\n"); return 0; } void cleanup_module(void) { printk(KERN_INFO "Goodbye, world!\n"); } ``` 6. 构建内核模块:在命令行中运行 `bazel build //:helloworld.ko` ### 回答2: 使用Bazel构建编HelloWorld Android内核模块的过程大致如下: 首先,在Android设备上安装Bazel构建系统,并确保已配置好相应的环境变量。 然后,创建一个新的Android内核模块项目,可以选择在命令行中执行以下命令: ``` $ mkdir HelloWorldModule $ cd HelloWorldModule $ touch BUILD $ touch helloworld.c ``` 其中,BUILD文件是用于定义构建规则的文件,helloworld.c是编内核模块的源代码文件。 接下来,在BUILD文件中添加用于构建HelloWorld模块的规则,可以使用以下内容作为参考: ``` cc_binary( name = "helloworld", srcs = ["helloworld.c"], cflags = ["-Wall", "-Werror"], ) ``` 该规则使用cc_binary来定义构建规则,其中name属性指定了最终生成的二进制文件的名称,srcs属性指定了源代码文件,cflags属性指定了编译选项。 然后,在helloworld.c文件中编实际的内核模块代码,可以使用以下内容作为参考: ``` #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("HelloWorld Android Kernel Module"); static int __init helloworld_init(void) { printk(KERN_INFO "Hello, World!\n"); return 0; } static void __exit helloworld_exit(void) { printk(KERN_INFO "Goodbye, World!\n"); } module_init(helloworld_init); module_exit(helloworld_exit); ``` 在上述代码中,首先包含了必要的头文件,然后定义了内核模块的许可证、作者和描述信息。接着,定义了模块初始化和退出函数,分别在加载和卸载模块时执行。这两个函数分别使用printk函数输出相应的信息。 最后,运行以下命令构建并编译内核模块: ``` $ bazel build :helloworld ``` 这将使用Bazel进行构建,生成最终的二进制文件。 总结:以上就是使用Bazel构建编HelloWorld Android内核模块的大致步骤,在完成BUILD文件和源代码的编后,通过执行相应的构建命令即可生成内核模块的二进制文件。 ### 回答3: 使用Bazel构建编HelloWorld的Android内核模块是可能的。Bazel是一种构建工具,用于管理和构建复杂的软件项目,包括Android内核模块。下面是一些关键步骤来完成该任务: 首先,您需要在计算机上设置Android开发环境。这将涉及安装Java Development Kit(JDK)和Android软件开发工具包(SDK)。 接下来,您需要创建一个新的Android模块项目。可以使用Android Studio或命令行工具创建一个新的Android项目。 然后,您需要编一个简单的HelloWorld模块。该模块可以是一个简单的C语言文件,例如`helloworld.c`,其中包括一个在内核中打印“Hello World”的函数。 随后,您需要使用Bazel配置构建文件。这个构建文件告诉Bazel如何构建Android模块。您需要指定编译器和链接器的选项,以及模块所需的任何其他库。 接下来,您可以使用Bazel来构建和编译您的Android模块。通过运行Bazel命令,Bazel将自动下载和安装所需的依赖项,并使用指定的配置文件构建模块。 最后,您可以将构建好的模块部署到Android设备上进行测试。这可能涉及将模块推送到设备上,然后在设备上运行相应的命令。 总结来说,通过使用Bazel构建工具和一些基本的Android开发工具,您可以编和构建一个简单的HelloWorld的Android内核模块。这需要一些预先准备的开发环境和配置文件,以及一些基本的编码技巧和命令行操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值