Linux可加载内核模块LKM

LKM(可加载内核模块)简介

    LKM的全称为Loadable Kernel Modules,中文名为可加载内核模块,主要作用是用来扩展linux的内核功能。LKM的优点在于可以动态地加载到内存中,无须重新编译内核。由于LKM具有这样的特点,所以它经常被用于一些设备的驱动程序,例如声卡,网卡等等。当然因为其优点,也经常被骇客用于rootkit技术当中。

    学习linux内核编程,LKM(可加载内核模块)是非常有用的一部分。LKM是内核的扩展,可以随时加载到内核中,用完后也可以方便的卸载,是扩展linux内核功能的有效手段。

    LKM内核模块属于ELF目标文件,但又区别于一般的应用程序,属于系统级别的程序,用来扩展Linux内核功能。通常使用LKM加载一些设备驱动,可以捕获系统调用,功能十分强大。

    与一般程序不同的是LKM没有main()函数,它提供init_module()和cleanup_module()两个函数。前者用来初始化所有数据,后者清除数据,从而安全退出。对LKM的感染就是在这两个函数中做手脚。

    LKM病毒编写原理就是通过.strtab和.symtab中字符串来实现。修改这两个节中存储的init函数的地址,将其修改成其他的函数,即在模块加载时执行其他的函数。修改过程如下:查找这两个节,依次循环读取每个节的表项,读取后与查找的字符串比较,如果相等,则返回该字符串偏移并修改成别的函数名。因此,感染LKM要先了解目标文件的相关符号。

    如何向已有的模块插入新的代码,实现的方法就是使用链接器ld。链接的两个模块共享彼此的符号。保证链接的几个模块不能有同名符号。链接后的模块经过修改符号表或字符串表便可以插入代码。

    为了保持感染模块的隐蔽性,必须使修改过的init_module仍然能够执行先前的功能,即在感染代码中调用原来的init_module函数。

    在编写病毒调试过程中,使用readelf和objdump工具不断对比ELF格式文件内容查看,确定是否感染。

    可以利用LKM感染程序截获系统调用,即改变sys_call_table相应的入口(可以查看文件/usr/include/sys/syscall.h),转而执行自定义的任务。

    下面是一个简单的模块:

代码如下:
/*helloworld.c*/
#include <linux/module.h>    
#include <linux/kernel.h>   
#include <linux/init.h>  
      
static int hello_init(void)
{
        printk("Hello World.\n");
        return 0;
}
 
static void hello_exit(void)
{
        printk("Bye Bye.\n");
}
 
module_init(hello_init);
module_exit(hello_exit);
代码解释:

    模块需要至少需要两个函数module_init()和module_exit()。其中module_init()是初始化函数,其在安装模块时被调用,所有的初始化工作可以在其中完成。module_exit()是清除函数,在卸载模块时调用,可以在其中做一些清理工作,它有点类似面向对象中的析构函数。

    代码中printk()是输出显示数据的系统调用,其工作在内核空间中。使用printk()函数,而不使用我们熟悉的printf()函数,是因为在LKM中,是无法依赖于我们平时使用的C库的,模块仅仅被链接到内核,只可以调用内核所导出的函数,不存在可链接的函数库;这也是内核编程与我们平时应用程序编程的不同之一。

下面四个是大佬编写的Linux Rootkit系列,有兴趣的朋友可以去看看

Linux Rootkit系列一:LKM的基础编写及隐藏:
https://www.freebuf.com/articles/system/54263.html
Linux Rootkit 系列二:基于修改 sys_call_table 的系统调用挂钩:
https://www.freebuf.com/sectool/105713.html
Linux Rootkit系列三:实例详解 Rootkit 必备的基本功能:
https://www.freebuf.com/articles/system/107829.html
Linux Rootkit 系列四:对于系统调用挂钩方法的补充:
https://www.freebuf.com/articles/system/108392.html

发布了10 篇原创文章 · 获赞 0 · 访问量 115

猜你喜欢

转载自blog.csdn.net/ck_15270706753/article/details/105067491