首页
论坛
课程
招聘
[原创]无hook无patch 无自定义peloader 在内核加载执行驱动
2011-8-7 21:22 42056

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

2011-8-7 21:22
42056
我们都知道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_OBJECT	pBeepObj;
        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[60];
                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
这个函数代码在这里也贴一下~
NTSTATUS
        IopInvalidDeviceRequest(
        IN PDEVICE_OBJECT DeviceObject,
        IN PIRP Irp
        )
{
        if ((IoGetCurrentIrpStackLocation(Irp))->MajorFunction == IRP_MJ_POWER) {
                PoStartNextPowerIrp(Irp);
        }
        Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
        IoCompleteRequest( Irp, IO_NO_INCREMENT );
        return STATUS_INVALID_DEVICE_REQUEST;
}
NTSTATUS MakeFakeDriverObject(IN PUNICODE_STRING driverName,OUT PDRIVER_OBJECT* ppdriverObject)
{
        NTSTATUS status;
        ULONG i;
        OBJECT_ATTRIBUTES objectAttributes;
        PDRIVER_OBJECT driverObject;
        InitializeObjectAttributes( &objectAttributes,
                driverName,
                OBJ_PERMANENT,
                (HANDLE) NULL,
                (PSECURITY_DESCRIPTOR) NULL );
        status = ObCreateObject( ExGetPreviousMode(),
                *IoDriverObjectType,
                &objectAttributes,
                KernelMode,
                (PVOID) NULL,
                //(ULONG) (sizeof( DRIVER_OBJECT ) + sizeof ( DRIVER_EXTENSION )),//this will crash
                //because DRIVER_OBJECT is fixed but DRIVER_EXTENSION are growing bigger than ddk declared
                (ULONG) (sizeof( DRIVER_OBJECT ) + sizeof ( DRIVER_EXTENSION ) + 256),
                0,
                0,
                (PVOID *) ppdriverObject );
        if (!NT_SUCCESS( status ))
        {
                *ppdriverObject = NULL;
                return status;
        }
        driverObject=*ppdriverObject;
        RtlZeroMemory( driverObject, sizeof( DRIVER_OBJECT ) + sizeof ( DRIVER_EXTENSION) + 256 );
        
        driverObject->DriverExtension = (PDRIVER_EXTENSION) (driverObject + 1);
        driverObject->DriverExtension->DriverObject = driverObject;//这个DriverExtension常用,如果没有直接惨死
        driverObject->Type = IO_TYPE_DRIVER;
        driverObject->Size = sizeof( DRIVER_OBJECT );
        driverObject->Flags = DRVO_BUILTIN_DRIVER;
        for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
                driverObject->MajorFunction[i] = IopInvalidDeviceRequest;
        _asm
        {
                        push eax
                        push ebx
                        mov eax,driverObject
                        mov eax,[eax+0x14]
                        mov ebx,[eax+0x34]
                         shr ebx,19
                        or ebx,1
                        shl ebx,19
                        mov [eax+0x34],ebx
                        pop ebx
                        pop eax
        }
        driverObject->DriverName.Buffer = ExAllocatePool( PagedPool,driverName->MaximumLength );
        if (driverObject->DriverName.Buffer)
        {
                driverObject->DriverName.MaximumLength = driverName->MaximumLength;
                driverObject->DriverName.Length = driverName->Length;
                RtlCopyMemory( driverObject->DriverName.Buffer,driverName->Buffer,driverName->MaximumLength );
        }
        return status;
} 


ok这样子就行鸟~~这些代码只能在kernel mode加载sys哦~~亲~~
就这样子!
SysLoad(L"\\??\\C:\\123\\killdisk.sys");

2021 KCTF 秋季赛 防守篇-征题倒计时(11月14日截止)!

收藏
点赞0
打赏
分享
最新回复 (60)
雪    币: 123
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
whack 活跃值 2011-8-7 21:32
2
0
不懂驱动的路过,支持一下!呵呵!
雪    币: 27
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bird 活跃值 2011-8-7 21:38
3
0
支持V神!!!
雪    币: 160
活跃值: 活跃值 (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
profmit 活跃值 2011-8-7 21:43
4
0
膜拜!学习之!
雪    币: 455
活跃值: 活跃值 (22)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
三寸法师 活跃值 1 2011-8-7 21:45
5
0
好像很厉害的样子,先膜拜了再看
雪    币: 1480
活跃值: 活跃值 (74)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
cntrump 活跃值 13 2011-8-7 21:51
6
0
这个方法,貌似 mj 早提到过。
雪    币: 284
活跃值: 活跃值 (19)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
飞心男孩 活跃值 2 2011-8-7 21:59
7
0
V大,虽然你这个也算给力了,但其实我们想说的是“这个不算。这个不符合你的身份,要ring3的......”,你懂的!
雪    币: 8670
活跃值: 活跃值 (777)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 活跃值 10 2011-8-7 22:05
8
0
ring3的等那天蛋痛了再放~
雪    币: 83
活跃值: 活跃值 (22)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
instruder 活跃值 4 2011-8-7 22:32
9
0
祈祷v大 立刻蛋疼  哈哈
雪    币: 7162
活跃值: 活跃值 (441)
能力值: ( LV5,RANK:71 )
在线值:
发帖
回帖
粉丝
joker陈 活跃值 2011-8-7 22:38
10
0
怎么让v大蛋疼呢?
雪    币: 753
活跃值: 活跃值 (446)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
莫灰灰 活跃值 9 2011-8-7 22:52
11
0
老V,你有种出个R3的。
不然,我把你跟黑守见不得人的事情说出去,嘿嘿~
雪    币: 1112
活跃值: 活跃值 (101)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
ycmint 活跃值 5 2011-8-7 23:16
12
0
啥事 .....祈祷蛋疼之时....
雪    币: 728
活跃值: 活跃值 (131)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
房有亮 活跃值 3 2011-8-7 23:51
13
0
祈祷v大 立刻蛋疼  哈哈,靠边的兄弟 来一脚
雪    币: 110
活跃值: 活跃值 (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
sysercn 活跃值 2011-8-8 02:43
14
0
亲来亲去。。。

感觉在他淘宝!

强烈要求V大爆个RING3的
雪    币: 421
活跃值: 活跃值 (65)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
tornodo 活跃值 1 2011-8-8 06:48
15
0
支持下,没pdf下载
雪    币: 466
活跃值: 活跃值 (22)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
fhurricane 活跃值 1 2011-8-8 07:14
16
0
一大早就这么给力啊~~~
雪    币: 947
活跃值: 活跃值 (25)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
loongzyd 活跃值 10 2011-8-8 07:57
17
0
求真相啊
雪    币: 0
活跃值: 活跃值 (24)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
tihty 活跃值 2 2011-8-8 08:36
18
0
V校与黑守的23事
雪    币: 289
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
XiaosanAiq 活跃值 2011-8-8 09:39
19
0
完全不懂。。膜拜。。
雪    币: 104
活跃值: 活跃值 (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ChiChou 活跃值 2011-8-8 09:39
20
0
求黑守同学内幕
雪    币: 236
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
whitefirer 活跃值 1 2011-8-8 09:52
21
0
V大的东西得顶,跟黑守的内幕可以在V大的群里看到...
雪    币: 333
活跃值: 活跃值 (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
yarpee 活跃值 1 2011-8-8 09:55
22
0
只能顶了,支持
雪    币: 88
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gezz 活跃值 2011-8-8 10:12
23
0
迅速抢占老V前排~
雪    币: 65
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
meijingogo 活跃值 2011-8-8 10:23
24
0
好东西,强烈要求v大来个加载驱动的系列,包括ring3 ring0.
雪    币: 71
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mumaren 活跃值 2011-8-8 12:00
25
0
强烈要求V大爆个RING3的
游客
登录 | 注册 方可回帖
返回