无耻的驱动加载法
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”

还有哪些无耻的办法大家可以讨论一下