您的位置:首页 > 运维架构 > Linux

繞過linux Driver Vermagic檢查

2015-08-07 18:09 537 查看
繞過[b]*linux Driver Vermagic*[/b]檢查

在開發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給他用,真的是很麻煩……

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

一、先把[b]*Moudle version*[/b]檢查關掉。

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)

三、 修改kernelvermagic,再重新編譯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)

注:include/linux/utsrelease.h是根据include/config/kernel.release生成的;

这些文件在每次编译内核都会重新生成,可以修改

include/linux/vermagic.h文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: