Abstract
Keywords
Citation Yao Qing-sheng.  无耻的驱动加载法(ZT).  FUTURE & CIVILIZATION   Natural/Social Philosophy & Infomation Sciences,  2024:0324,  https://yaoqs.github.io/20240324/wu-chi-de-qu-dong-jia-zai-fa-zt/

转载自 无耻的驱动加载法(ZT)

无耻的驱动加载法 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来创建,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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” 还有哪些无耻的办法大家可以讨论一下 `

References
  1. Yao Qing-sheng.  无耻的驱动加载法(ZT).  FUTURE & CIVILIZATION   Natural/Social Philosophy & Infomation Sciences,  2024:0324 ,  https://yaoqs.github.io/20240324/wu-chi-de-qu-dong-jia-zai-fa-zt/
  2. 版权声明:本文为「LordYao」的原创文章,遵循 CC 4.0 BY-NC-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接: https://yaoqs.github.io/20240324/wu-chi-de-qu-dong-jia-zai-fa-zt/
  3. post word count: 627 words.  post estimate read time: 2 min