繞過linux Driver Vermagic檢查

本文介绍了如何在开发Kernel驱动时绕过烦人的VerMagic版本检查。通过禁用模块版本检查、修改Kernel的VerMagic字符串并重新编译驱动,可以解决因版本不匹配导致的加载失败问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在開發kernel driver時,總是會遇到討人厭的vermagic檢查,只要目前在run的kernel版本跟driver編譯時用的kernel版本不一致,就沒辦法insmod。

bash-3.2# insmod sdio.ko

sdio: version magic '2.6.28-271-gec75a15 preempt mod_unload modversions ARMv7 '

should be '2.6.28 preempt mod_unload ARMv7 '

insmod: init_module 'sdio.ko' failed (Exec format error)

這大大降低了開發速度,尤其是當你拿不到客戶在用的kernel時,又要開發driver給他用,真的是很麻煩……

那麼要怎麼利用噁心的方式繞過去呢???

一、先把 Moudle version 檢查關掉。

user@host # ARCH=arm make menuconfig

--- Enable loadable module support                                             │ │

│ │         [ ]   Forced module loading                                                    │ │

│ │         [*]   Module unloading                                                         │ │

│ │         [*]     Forced module unloading                                                │ │

│ │         [ ]   Module versioning support                                                │ │

│ │         [ ]   Source checksum for all modules

二、 使用modinfo時,可以看到目前這driver的vermagic

filename: external_drivers/omap3530/Linux/sdio/sdio.ko
author: Texas Instruments Inc
alias: TIWLAN_SDIO
license: GPL
description: TI WLAN SDIO driver
depends:
vermagic: 2.6.28-271-gec75a15 preempt mod_unload ARMv7
parm: g_sdio_debug_level:debug level (int)

三、 修改 kernel 的 vermagic,再重新編譯driver

vermagic 的第一個值 2.6.28-noneed 是由這 include/linux/utsrelease.h裡的 UTS_RELEASE 所定義。

#define UTS_RELEASE "2.6.28-271-gec75a15"

之後再由 include/linux/vermagic.h 裡的 macro去組合出 VERMAGIC_STRING , 也就是 kernel 的vermagic。

#include
#include

/* Simply sanity version stamp for modules. */
#ifdef CONFIG_SMP
#define MODULE_VERMAGIC_SMP "SMP "
#else
#define MODULE_VERMAGIC_SMP ""
#endif
#ifdef CONFIG_PREEMPT
#define MODULE_VERMAGIC_PREEMPT "preempt "
#else
#define MODULE_VERMAGIC_PREEMPT ""
#endif完成編譯後,你就可以得
#ifdef CONFIG_MODULE_UNLOAD
#define MODULE_VERMAGIC_MODULE_UNLOAD "mod_unload "
#else
#define MODULE_VERMAGIC_MODULE_UNLOAD ""
#endif
#ifndef CONFIG_MODVERSIONS
#define MODULE_VERMAGIC_MODVERSIONS "modversions "
#else
#define MODULE_VERMAGIC_MODVERSIONS ""
#endif
#ifndef MODULE_ARCH_VERMAGIC
#define MODULE_ARCH_VERMAGIC ""
#endif

#define VERMAGIC_STRING \
UTS_RELEASE " " \
MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT \
MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS \
MODULE_ARCH_VERMAGIC

所以, 我們只要把 UTS_RELEASE 改成我們的數字即可,當然若是懶得去try組合後的字串,也可以直接將VERMAGIC_STRING改成你要的字串 :)

建議修改完 vermagic.h, utsrelease.h後,還是把kernel重編完再編kernel,比較保險。

以下是修改後,用modinfo看的結果

filename: external_drivers/omap3530/Linux/sdio/sdio.ko
author: Texas Instruments Inc
alias: TIWLAN_SDIO
license: GPL
description: TI WLAN SDIO driver
depends:
vermagic: 2.6.28 preempt mod_unload ARMv7
parm: g_sdio_debug_level:debug level (int)
<think>嗯,用户的问题是关于在Linux下安装佳能打印机驱动时遇到签名检查失败的情况。首先,我需要回忆一下Linux系统中处理驱动安装的一般步骤,尤其是涉及到内核模块签名的问题。因为当用户安装第三方驱动时,可能会遇到内核模块签名验证失败的情况,特别是在启用了Secure Boot的系统上。 首先,Secure Boot会要求所有内核模块必须经过有效的签名才能加载。而佳能的驱动程序可能没有使用被系统信任的证书进行签名,所以导致安装失败。这时候,可能的解决方案包括禁用Secure Boot,或者手动给驱动模块签名,或者调整内核参数来绕过签名检查。 接下来,我需要考虑不同的方法是否适用。例如,禁用Secure Boot是最直接的,但可能影响系统的安全性。而手动签名需要用户生成自己的密钥并注册到系统中,这步骤可能对普通用户来说有点复杂。另外,临时禁用模块签名验证可能在下次内核更新时失效。 然后,我需要检查是否有遗漏的步骤,比如是否需要安装特定的依赖包,或者是否有佳能官方提供的解决方案。另外,不同的Linux发行版可能有不同的工具和步骤,比如Ubuntu和Fedora在处理Secure Boot和模块签名时可能有差异,需要用户根据具体情况调整命令。 还要考虑到用户可能不太熟悉命令行操作,所以需要提供详细的步骤,并提醒注意备份和风险。例如,在修改grub配置时,错误的参数可能导致系统无法启动,所以要指导用户如何正确编辑文件并更新grub。 此外,需要确认引用是否相关。用户提供的引用中提到了一些Linux命令和文档,可能涉及到系统配置和内核参数设置,这些内容可以作为解决方案的参考。例如,引用中的Creative Commons文档可能包含系统配置的基本知识,而linux命令备忘录可能提供相关的命令行操作指导。 最后,生成相关问题时要围绕驱动安装的常见问题、Secure Boot的影响、签名机制等,帮助用户进一步理解问题背景和可能的其他解决方法。</think>### Linux下安装佳能打印机驱动签名检查失败解决方案 #### 1. **问题原因分析** 签名检查失败通常由以下原因导致: - **Secure Boot启用**:UEFI安全启动要求所有内核模块必须通过有效签名验证[^1]。 - **驱动未签名**:佳能官方驱动可能未包含Linux内核信任的签名证书。 #### 2. **解决方案** ##### 方法一:禁用Secure Boot 1. 重启电脑进入BIOS/UEFI设置界面(通常按`F2`/`Del`/`Esc`键)。 2. 找到`Security`或`Boot`选项卡中的`Secure Boot`选项,设置为`Disabled`。 3. 保存设置并重启系统。 ##### 方法二:手动禁用内核模块签名验证(临时) ```bash # 临时生效(重启后失效) sudo modprobe -r canondrv_module # 替换为实际驱动模块名 sudo insmod /path/to/driver.ko --force-vermagic ``` ##### 方法三:永久禁用模块签名检查 1. 编辑GRUB配置文件: ```bash sudo nano /etc/default/grub ``` 2. 修改`GRUB_CMDLINE_LINUX_DEFAULT`行,添加: ```bash GRUB_CMDLINE_LINUX_DEFAULT="... module.sig_enforce=0" ``` 3. 更新GRUB并重启: ```bash sudo update-grub && reboot ``` ##### 方法四:手动签名驱动(推荐安全方式) ```bash # 生成密钥对(需安装openssl) openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=Custom Driver/" # 签名驱动模块 sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 MOK.priv MOK.der /path/to/driver.ko # 注册密钥到系统 sudo mokutil --import MOK.der ``` 重启后根据提示完成密钥注册。 #### 3. **补充说明** - 佳能官方可能提供预编译的带签名驱动,建议优先访问[佳能支持页面](https://www.canon.com/support/)查找最新驱动。 - Ubuntu/Debian用户可尝试`sudo apt install printer-driver-canon`安装开源驱动分支。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值