無恥的驅動加載法
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”

還有哪些無恥的辦法大家可以討論一下