繞過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)
三、 修改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)
注:include/linux/utsrelease.h是根据include/config/kernel.release生成的;
这些文件在每次编译内核都会重新生成,可以修改
include/linux/vermagic.h文件。
在開發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)
三、 修改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)
注:include/linux/utsrelease.h是根据include/config/kernel.release生成的;
这些文件在每次编译内核都会重新生成,可以修改
include/linux/vermagic.h文件。
相关文章推荐
- 一个高人的许多QT开源项目(百度网盘的linux桌面客户端)
- 在Linux系统中查看进程及杀死僵尸进程的方法
- linux 同步时间 调试core内核
- 一张图记住Linux系统常用诊断工具
- centos 挂载移动硬盘
- java执行linux命令获取MAC和ip地址
- Linux必须会的命令---也是以前记录的,ctrl+z fg 啥的 jobs 比较实用
- 个人理解Linux文件权限--以前记录的,根据鸟哥的第二版去解释的
- Linux NFS服务器的安装与配置
- linux驱动设备在多进程打开问题
- Fedora Linux 16 root用户无法登陆
- Trick on the Version Magic Number of Linux Kernel
- LR监控linux之详解rstatd的安装-Zee
- linux expect 简单讲解
- linux下vim使用
- linux之sed用法
- linux下写穿/直写(Write-Through)与写回(Write-Back)
- Linux重定向的学习
- linux权限-r-w-代表意思
- Centos镜像地址列表(全 Excel格式)