无耻的驱动加载法
from
				:
				http
				:
				//www.debugman.com/read.php?tid=614
				方法一: 替换win32k
				.
				sys
在
				2k3
				的系统下ZwSetSystemInformation禁止了用户模式下加载驱动,只允许SMSS
				.
				exe加载win32k
				.
				sys。于是我们可以利用一下这个特点:
				1. 
				注入SMSS
				.
				EXE
				2. 
				打开SeLoadDriverPrivilege权限
				3. 
				把原始的win32k
				.
				sys改名
				4. 
				复制我们的驱动到\systemroot\system32下
				5. 
				在SMSS
				.
				EXE中加载\\SystemRoot\\System32\\win32k
				.
				sys
				6. 
				把\\SystemRoot\\System32\\win32k
				.
				sys改名
				7. 
				把原始的win32k
				.
				sys文件改名改回去
方法二: 利用第三方驱动程序的漏洞
这类驱动应该挺多的,我们可以选择一些装机量大的驱动来进行此项工作,如某某著名的杀毒软件即存在本地权限提升漏洞。。。获得了ring0权限再用ZwSetSystemInformation加载就万事大吉了
方法三: 感染随系统启动的驱动程序
此法类似于病毒感染,但需要等到下次系统重启才能拿到控制权,需要一些PE知识,这个我就不多说了。
这里顺便再说说通过ZwSetSystemInformation其实也是可以建立Device的,由于ZwSetSystemInformation加载驱动时传给DriverEntry的DriverObject指针是错误的,因此我们不能用它来创建Device
				, 
				但我们可以自己分配一个DriverObject来创建,如下:
    NTSTATUS
    DriverEntry
				(
        
				IN PDRIVER_OBJECT DriverObject
				,
        
				IN PUNICODE_STRING RegistryPath
        
				)
    {
        
				NTSTATUS        ntStatus 
				= 
				STATUS_SUCCESS
				;
        
				UNICODE_STRING  ntUnicodeString
				;
        
				UNICODE_STRING  ntWin32NameString
				;
        
				PDEVICE_OBJECT  deviceObject 
				= 
				NULL
				;
        
				ULONG          i
				;
       
        
				DriverObject 
				= 
				ExAllocatePoolWithTag
				(
				NonPagedPool
				, 
				sizeof
				(
				DRIVER_OBJECT
				), 
				'clAS'
				);  
				// 分配DriverObject
        
				RtlZeroMemory
				(
				DriverObject
				, 
				sizeof
				(
				DRIVER_OBJECT
				));
        
				RtlInitUnicodeString
				( &
				ntUnicodeString
				, 
				NT_DEVICE_NAME 
				);
        
				ntStatus 
				= 
				IoCreateDevice
				(
            
				DriverObject
				,
            
				0
				,
            &
				ntUnicodeString
				,
            
				0x8800
				,                                                
				//设备类型必须为自定义的
            
				FILE_DEVICE_SECURE_OPEN
				,
            
				TRUE
				,
            &
				deviceObject 
				);
        
				if 
				( !
				NT_SUCCESS
				( 
				ntStatus 
				) )
        {
            
				DbgPrint
				(
				"Couldn't create the device object\n"
				);
            
				return 
				ntStatus
				;
        }
        
				// 注意,需要我们自己来清除INITIALIZING标志,否则设置不能打开
        
				ClearFlag
				( 
				deviceObject
				->
				Flags
				, 
				DO_DEVICE_INITIALIZING 
				);                         
        
				DriverObject
				->
				MajorFunction
				[
				IRP_MJ_CREATE
				] = 
				CreateClose
				;
        
				DriverObject
				->
				MajorFunction
				[
				IRP_MJ_CLOSE
				] = 
				CreateClose
				;
       
        
				// 注意,必须要给IRP_MJ_CLEANUP分派一个DispathRoutine, 否则在设备关闭的时候就会挂
        
				DriverObject
				->
				MajorFunction
				[
				IRP_MJ_CLEANUP
				] = 
				CreateClose
				;
        
				DriverObject
				->
				MajorFunction
				[
				IRP_MJ_DEVICE_CONTROL
				] = 
				DeviceControl
				;
        
				// 注意,必须是Global符号连接, 否则程序退出后连接会消失
        
				RtlInitUnicodeString
				( &
				ntWin32NameString
				, 
				L
				"\\DosDevices\\Global\\RkrTest" 
				);
        
				ntStatus 
				= 
				IoCreateSymbolicLink
				(
                            &
				ntWin32NameString
				, &
				ntUnicodeString 
				);
        
				if 
				( !
				NT_SUCCESS
				( 
				ntStatus 
				) )
        {
            
				DbgPrint
				((
				"Couldn't create symbolic link\n"
				));
            
				IoDeleteDevice
				( 
				deviceObject 
				);
        }
        
				return 
				ntStatus
				;
    }
				如果你高兴的话在分配空间的时候分配多一点,把OBJECT_HEADER也算上,这样可以避免某些软件扫描DriverObject的对象头时挂掉
				.
				相应的用CreateFile时打开时应像这样指定“\\\\
				.
				\\Global\\SymbolLink”
还有哪些无耻的办法大家可以讨论一下