看流星社区

 找回密码
 注册账号
查看: 3239|回复: 3

无hook无patch 无自定义peloader 在内核加载执行驱动

[复制链接]

该用户从未签到

发表于 2011-8-7 21:26:21 | 显示全部楼层 |阅读模式
我们都知道ZwSetSystemInformation可以用参数SystemExtendServiceTableInformation(38号)加载驱动~但是这个加载驱动有很多很多麻烦与问题~
今天我来介绍的是一种全新的加载驱动的模式~~当然只能在Kernel mode来加载~只有断断的一个KernelAPI的使用哦~亲~
现在目前说来在内核里加载驱动的方式基本都是ZwLoadDriver,Patch 38号的Load参数,搜索使用MmLoadSystemImage,自己实现peloader等不方便不给力,有遗憾的方法~
现在呢,正式介绍一种全新的加载方式,使用ZwSetSystemInformation的
SystemLoadGdiDriverInSystemSpace(54号)来加载驱动,然后调用之~~
这个infoclass的结构定义,不知道DDK上有没有~~
  1. typedef struct _SYSTEM_GDI_DRIVER_INFORMATION {
  2.         UNICODE_STRING DriverName;
  3.         PVOID ImageAddress;
  4.         PVOID SectionPointer;
  5.         PVOID EntryPoint;
  6.         PIMAGE_EXPORT_DIRECTORY ExportSectionPointer;
  7.         ULONG ImageLength;
  8. } SYSTEM_GDI_DRIVER_INFORMATION, *PSYSTEM_GDI_DRIVER_INFORMATION;
复制代码
然后就是怎么使用了鸟~只要对DriverName用RtlInitUnicodeString赋值就行了
(\\??\\XXXXX形式的参数或者是\\SystemRoot\\XXX形式)
具体请看代码,代码如下~~
  1. NTSTATUS SysLoad(const WCHAR *wcsFileName)
  2. {
  3.         SYSTEM_GDI_DRIVER_INFORMATION gdiinfo;
  4.         NTSTATUS ns;
  5.         PDRIVER_OBJECT  pBeepObj;
  6.         RtlZeroMemory(&gdiinfo,sizeof(SYSTEM_GDI_DRIVER_INFORMATION));
  7.         RtlInitUnicodeString(&gdiinfo.DriverName,wcsFileName);
  8.         ns=ZwSetSystemInformation(SystemLoadGdiDriverInSystemSpace,&gdiinfo,sizeof(SYSTEM_GDI_DRIVER_INFORMATION));
  9.         if (NT_SUCCESS(ns))
  10.         {
  11.                 PDRIVER_INITIALIZE InitRoutine;
  12.                 UNICODE_STRING pRegPath;
  13.                 UNICODE_STRING NameBuffer;
  14.                 UNICODE_STRING DevName;
  15.                 WCHAR buffer[60];
  16.                 InitRoutine = (PDRIVER_INITIALIZE)gdiinfo.EntryPoint;
  17.                 if (InitRoutine)
  18.                 {
  19.                         PDRIVER_OBJECT pDriverObject;
  20.                          _snwprintf(buffer, (sizeof(buffer) / sizeof(WCHAR)) - 1, L"\\Driver\\%08u", PsGetCurrentThreadId());
  21.                         RtlInitUnicodeString(&NameBuffer,buffer);
  22.                         RtlInitUnicodeString(&DevName, L"\\Driver\\Beep");
  23.                         RtlInitUnicodeString(&pRegPath,wcsFileName);
  24.                         ns = ObReferenceObjectByName(&DevName, OBJ_CASE_INSENSITIVE, NULL,
  25.                                 0, *IoDriverObjectType, KernelMode, NULL, &pBeepObj);
  26.                         if (NT_SUCCESS(ns))
  27.                         {
  28.                                 ns=MakeFakeDriverObject(&NameBuffer,&pDriverObject);
  29.                                 if(NT_SUCCESS(ns))
  30.                                 {
  31.                                         pDriverObject->DriverStart=InitRoutine;
  32.                                         pDriverObject->DriverInit=InitRoutine;
  33.                                         pDriverObject->DriverSection=pBeepObj->DriverSection;
  34.                                         pDriverObject->DriverSize=gdiinfo.ImageLength;
  35.                                         ns= InitRoutine(pDriverObject,&pRegPath);
  36.                                 }
  37.                         }
  38.                         
  39.                 }
  40.         }
  41.         return ns;
  42. }
复制代码
在上面代码里使用了MakeFakeDriverObject来创建一个虚拟的DriverObject
这个函数代码在这里也贴一下~
游客,如果您要查看本帖隐藏内容请回复


ok这样子就行鸟~~这些代码只能在kernel mode加载sys哦~~亲~~

该用户从未签到

发表于 2012-3-17 20:48:24 | 显示全部楼层
回复 1# tjznl


    来看看吧了

该用户从未签到

发表于 2014-1-10 16:44:47 | 显示全部楼层
11111111111111111

该用户从未签到

发表于 2019-3-28 14:26:15 | 显示全部楼层
支持楼主,支持看流星社区,以后我会经常来!
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-29 19:33

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表