tjznl 发表于 2011-8-7 21:26:21

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

我们都知道ZwSetSystemInformation可以用参数SystemExtendServiceTableInformation(38号)加载驱动~但是这个加载驱动有很多很多麻烦与问题~
今天我来介绍的是一种全新的加载驱动的模式~~当然只能在Kernel mode来加载~只有断断的一个KernelAPI的使用哦~亲~
现在目前说来在内核里加载驱动的方式基本都是ZwLoadDriver,Patch 38号的Load参数,搜索使用MmLoadSystemImage,自己实现peloader等不方便不给力,有遗憾的方法~
现在呢,正式介绍一种全新的加载方式,使用ZwSetSystemInformation的
SystemLoadGdiDriverInSystemSpace(54号)来加载驱动,然后调用之~~
这个infoclass的结构定义,不知道DDK上有没有~~typedef struct _SYSTEM_GDI_DRIVER_INFORMATION {
      UNICODE_STRING DriverName;
      PVOID ImageAddress;
      PVOID SectionPointer;
      PVOID EntryPoint;
      PIMAGE_EXPORT_DIRECTORY ExportSectionPointer;
      ULONG ImageLength;
} SYSTEM_GDI_DRIVER_INFORMATION, *PSYSTEM_GDI_DRIVER_INFORMATION;
然后就是怎么使用了鸟~只要对DriverName用RtlInitUnicodeString赋值就行了
(\\??\\XXXXX形式的参数或者是\\SystemRoot\\XXX形式)
具体请看代码,代码如下~~NTSTATUS SysLoad(const WCHAR *wcsFileName)
{
      SYSTEM_GDI_DRIVER_INFORMATION gdiinfo;
      NTSTATUS ns;
      PDRIVER_OBJECTpBeepObj;
      RtlZeroMemory(&gdiinfo,sizeof(SYSTEM_GDI_DRIVER_INFORMATION));
      RtlInitUnicodeString(&gdiinfo.DriverName,wcsFileName);
      ns=ZwSetSystemInformation(SystemLoadGdiDriverInSystemSpace,&gdiinfo,sizeof(SYSTEM_GDI_DRIVER_INFORMATION));
      if (NT_SUCCESS(ns))
      {
                PDRIVER_INITIALIZE InitRoutine;
                UNICODE_STRING pRegPath;
                UNICODE_STRING NameBuffer;
                UNICODE_STRING DevName;
                WCHAR buffer;
                InitRoutine = (PDRIVER_INITIALIZE)gdiinfo.EntryPoint;
                if (InitRoutine)
                {
                        PDRIVER_OBJECT pDriverObject;
                         _snwprintf(buffer, (sizeof(buffer) / sizeof(WCHAR)) - 1, L"\\Driver\\%08u", PsGetCurrentThreadId());
                        RtlInitUnicodeString(&NameBuffer,buffer);
                        RtlInitUnicodeString(&DevName, L"\\Driver\\Beep");
                        RtlInitUnicodeString(&pRegPath,wcsFileName);
                        ns = ObReferenceObjectByName(&DevName, OBJ_CASE_INSENSITIVE, NULL,
                              0, *IoDriverObjectType, KernelMode, NULL, &pBeepObj);
                        if (NT_SUCCESS(ns))
                        {
                              ns=MakeFakeDriverObject(&NameBuffer,&pDriverObject);
                              if(NT_SUCCESS(ns))
                              {
                                        pDriverObject->DriverStart=InitRoutine;
                                        pDriverObject->DriverInit=InitRoutine;
                                        pDriverObject->DriverSection=pBeepObj->DriverSection;
                                        pDriverObject->DriverSize=gdiinfo.ImageLength;
                                        ns= InitRoutine(pDriverObject,&pRegPath);
                              }
                        }
                        
                }
      }
      return ns;
}
在上面代码里使用了MakeFakeDriverObject来创建一个虚拟的DriverObject
这个函数代码在这里也贴一下~
**** Hidden Message *****

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

zhangchenggu 发表于 2012-3-17 20:48:24

回复 1# tjznl


    来看看吧了

seny11 发表于 2014-1-10 16:44:47

11111111111111111

qq412158094 发表于 2019-3-28 14:26:15

支持楼主,支持看流星社区,以后我会经常来!
页: [1]
查看完整版本: 无hook无patch 无自定义peloader 在内核加载执行驱动