将代码植入内核中的直接方式是使用可加载模块(或设备驱动程序或内核驱动程序).大多数现代操作系统都允许加载内核扩展模块,以便第三方硬件如存储系统/显卡/主板和网络硬件的制造商能够添加对自己产品的支持.操作系统通常都提供了关于将驱动程序引入内核中的文档和支持.这种简单方法也是我们将要将代码植入内核所采用的途径.
正如其名称所示,设备驱动程序通常是用于设备的.然而,通过驱动程序可以引入任何代码.一旦拥有了在内核中运行的代码,就能够完全访问内核和系统进程的全部特权内存空间.通过内核级的访问,可以修改计算机上所有软件代码和数据结构.
典型的模块结构包含一个入口点,有时还含有清理例程.例如,linux的可加载模块结构类似于以下形式:
int init_module(void)
{
}
void cleanup_module(void)
{
}
在某些情况下,例如对于windows设备驱动程序,入口点必须注册函数回调.其模块结构类似于以下形式:
NTSTATUS DriverEntry( ... )
{
theDriver->DriverUnload = MyCleanupRoutine;
}
NTSTATUS MyCleanupRoutine()
{
}
清理例程并非总是必要的,因此windows设备驱动程序将其设置为可选项.在希望卸载驱动程序时才需要清理例程.在许多情况下,rootkit在置入系统之后可以驻留其中,无需卸载.但在开发过程中包含一个卸载例程是有用的,因为在rootkit的改进过程中可能需要加载最新的版本.