ImageVerifierCode 换一换
格式:DOC , 页数:8 ,大小:33.50KB ,
资源ID:2400512      下载积分:20 文钱
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,省得不是一点点
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.wenke99.com/d-2400512.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(内核模块的加载.doc)为本站会员(hw****26)主动上传,文客久久仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文客久久(发送邮件至hr@wenke99.com或直接QQ联系客服),我们立即给予删除!

内核模块的加载.doc

1、 2009-12-24 16:49:50 来自 : 伊拉克蜜枣甜掉牙 虚拟文件系统模块 增加一个虚拟文件系统是非常简单的 .假如你要开发一个新的文件系统或者支持现存的文件系统 ,就 需要写一个模块作为接口 .同样的 ,假如需 要调试已经存在的文件系统 ,也需要那样 一个接口 .必须确定你的内核不支持目标文件系统 . 一个虚拟文件系统的模块的结构应该象如下定义 : struct lkm_vfs MODTYPE lkm_type; int lkm_ver; char *lkm_name; u_long lkm_offset; struct vfsconf *lkm_vfsconf; ; 和前面的例

2、子差不多 ,我们也有个模块类型 (LM_VFS),一个版本号 ,一个模块名和一个偏移值 .在这个 vfs 模块的例子中 ,offset值是用不到的 . 最后我们需要一个指向 vfsconf 结构 的指针 , 它包括了虚拟文件系统的操作向量以及一些其他信息 (vfsconf 结构在头文件/usr/include/sys/mount.h 中定义 ). 此结构通过 MOD_VFS宏来初始化 : MOD_VFS(“nullfs“, -1, extern struct vnodeopv_desc null_vnodeop_opv_desc; struct vfsconf nullfs_vfsconf =

3、 /* * 声明我们的模块结构 ,通过我们文件系统的 模块名 ,offset和初始的 vfsconf 结构 */ MOD_VFS(“nullfs“, -1, int cmd; int ver; vfs_opv_init_explicit( vfs_opv_init_default( DISPATCH(lkmtp, cmd, ver, lkm_nofunc, lkm_nofunc, lkm_nofunc) 好 ,编译安装它 : (一些其他的附加代码在 /usr/src/sys/miscfs/nullfs 里 ) e4gleopenbsd29# gcc -D_KERNEL -I/sys -c nu

4、ll_subr.c e4gleopenbsd29# gcc -D_KERNEL -I/sys -c null_vfsops.c e4gleopenbsd29# gcc -D_KERNEL -I/sys -c null_vnops.c e4gleopenbsd29# gcc -D_KERNEL -I/sys -c nullmod.c e4gleopenbsd29# ld -r -o nullfs.o null_vfsops.o null_vnops.o null_subr.o nullmod.o e4gleopenbsd29# modload -o nullfsmod -enullfsmod n

5、ullfs.o e4gleopenbsd29# modstat Type Id Off Loadaddr Size Info Rev Module Name VFS 0 -1 e0b84000 0003 e0b860d0 2 nullfs e4gleopenbsd29# ok,虚拟文件系统模块就说到这 . 其他类型的模块 这些模块被用来执行一些预定的模块类型所没有定义的操作 .在我这个例子中我们将为网络协议栈里加入控制代码 ,然后打印出我们接收到的 tcp 包的一些信息 . 当我们在书写其他类型的模 块时 ,我们必须要完整的检查一遍 ,确定没有预定的操作 .例如 ,同样的操作模块不能被加载两次

6、 .这等于我们在往内 核中去写入模块 .当然 , 我们都会在模块加载和卸载的控制函数里去控制 . 一个其他类型的模块结构象下面这样定义 : struct lkm_misc MODTYPE lkm_type; int lkm_ver; char *lkm_name; u_long lkm_offset; ; 同样 ,我们首先有一个模块的类型 (在这个例子中试 LM_MISC),然后是 lkm 的版本 ,再接着是模块名和 offset的 值 .在我的这个例子中 offset值 没有用到 ,但在 /usr/share/lkm/misc 提供的例子中 (增加一个系统调用 )offset 被用来在系统调

7、用表里面标记一个新的系统调用的位置 . 用 MOD_MISC宏来初始化该结构 : MOD_MISC(“tcpinfo“) 这里只有一个参数 ,指定了模块名 . 当我们的模块被加载后 ,该模块把 tcp_input 函数的指针改为我们制定的 new_input 函数 .新的函数会打印出mbuf里的包头的一些信息 ,然后 再调用原来的 tcp_input 函数 .在做这些 之前 ,我们一定 要确定同类的模块没有被加载 . 对于这个模块一些值得注意的地方 :首先运行这个模块时不适合传输大量的 tcp 包 ,printf()会变的很慢 .大家试一下就知道 .这个例子只是做测 试之用 ,其实大家可以想想

8、我们既然 可以改变 tcp 协议栈里的函数指针 ,我们用模块来做一个 tcp 的内核后门也应该很容易 ,就留给大家思考吧 ,呵呵 .第二 ,此代码原来是运行在 freebsd 之上的 ,稍微修改了一下而已 , bsd 系列的内核真是很相像 . 以下是该模块的完整代码 (tcpmod.c): #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* * 我们将改变 protosw结构中的 TCP入口

9、 . */ extern struct protosw inetsw; /* * 我们自定义的函数 */ extern int lkmexists _P(struct lkm_table *); extern char *inet_ntoa _P(struct in_addr); static void new_input _P(struct mbuf *, .); static void (*old_tcp_input) _P(struct mbuf *, .); /* * 声明我们的模块结构 */ MOD_MISC(“tcpinfo“) /* * 我们的句柄函数 ,用来加载和卸载模块 .

10、*/ int tcpmod_handler(lkmtp, cmd) struct lkm_table *lkmtp; int cmd; int s; switch(cmd) case LKM_E_LOAD: /* * 确定此模块是第一次加载使用 */ if (lkmexists(lkmtp) return(EEXIST); /* * 阻赛网络协议进程 ,我们把 tcp_input 函数指针改成我们自己的包装函数 . */ s = splnet(); old_tcp_input = inetsw2.pr_input; inetsw2.pr_input = new_input; splx(s);

11、break; case LKM_E_UNLOAD: /* * 当模块退出时返回原来的结构 */ s = splnet(); inetsw2.pr_input = old_tcp_input; splx(s); break; return(0); /* * 我们的外部接口 ,没有做什么 ,用到了 DISPATCH宏 */ int tcpinfo(lkmtp, cmd, ver) struct lkm_table *lkmtp; int cmd; int ver; DISPATCH(lkmtp, cmd, ver, tcpmod_handler, tcpmod_handler, lkm_nofun

12、c) /* * 定义我们自己的包装的 tcp_input 函数 .假如 mbuf里有包头 ,则打印出网络接口接收到的包 * 的总长度以及包的源地址 .然后使原来的 tcp_input 函数正常运行 . */ static void new_input(struct mbuf *m, .) va_list ap; int iphlen; struct ifnet *ifnp; struct ip *ip; va_start(ap, m); iphlen = va_arg(ap, int); va_end(ap); if (m-m_flags ip = mtod(m, struct ip *);

13、printf(“incoming packet: %d bytes “, m-m_pkthdr.len); printf(“on %s from %sn“, ifnp-if_xname, inet_ntoa(ip-ip_src); (*old_tcp_input)(m, iphlen); return; 好 ,我们编 译安装它 : e4gleopenbsd29# gcc -D_KERNEL -I/sys -c tcpmod.c e4gleopenbsd29# modload -o tcpinfo.o -etcpinfo tcpmod.o 产生一些 tcp 连接 ,用 dmesg 来看看是否正常

14、工作 : e4gleopenbsd29# dmesg tail -3 incoming packet: 1500 bytes on ne3 from 129.128.5.191 incoming packet: 1205 bytes on ne3 from 129.128.5.191 incoming packet: 52 bytes on ne3 from 129.128.5.191 e4gleopenbsd29# ok,到这里结束 ,足以说明问题了 . 结束语 写这篇文章的目的还是为了让大家如们 bsd 系列的内核编程 ,驱动程序编程的入门 ,当然 ,作为一个网络安全的专业人员应该可以从这篇文章里 面看到一些东西 ,就是一些内核级别 的后门和截获技术 ,例如 ,我们可以通过增加和重定向系统调用的模块来截获系统调用 ,我们可以用刚才 的最后一种模块来做一个内核级别的 tcp 后门等等 .当然我们还可以利用 模块来制作一些内核级的安全工具 .发挥想象力 ,留给大家了 ,呵呵

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。