首页
社区
课程
招聘
[原创]另类拦截加载驱动实现方法
发表于: 2012-7-28 11:52 17432

[原创]另类拦截加载驱动实现方法

2012-7-28 11:52
17432

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
                     IN PUNICODE_STRING RegistryPath)
{
        UNICODE_STRING DeviceNameUnicodeString,LinkNameUnicodeString;
        NTSTATUS Status;
        PDEVICE_OBJECT DeviceObject;
        int i;
        HANDLE ThreadHandle;
       
        RtlInitUnicodeString(&DeviceNameUnicodeString, DeviceName);
        Status = IoCreateDevice(DriverObject,
                                                        0,
                                                        &DeviceNameUnicodeString,
                                                        FILE_DEVICE_UNKNOWN,
                                                        0,
                                                        TRUE,
                                                        &DeviceObject);
        if (NT_SUCCESS(Status))
        {
                for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
                {
                        DriverObject->MajorFunction[i] = DriverDispatch;
                }
                DriverObject->DriverUnload =  DriverUnload;
                RtlInitUnicodeString(&LinkNameUnicodeString ,  LinkerName);
                Status = IoCreateSymbolicLink(&LinkNameUnicodeString, &DeviceNameUnicodeString);       
                if (NT_SUCCESS(Status))
                {
                        //回溯EntryCall地址,下面代码只适合XP
                        __asm
                        {
                                push ecx
                                mov ecx,ebp
                                mov ecx,dword ptr ds:[ecx+0x4]
                                sub ecx,0x3
                                mov EntryCall,ecx
                                add ecx,0x5
                                mov EntryRetn,ecx
                                pop ecx
                        }
                        DbgPrint("EntryCall :%08X" , EntryCall);

                        Status = PsCreateSystemThread(&ThreadHandle,
                                THREAD_ALL_ACCESS,
                                NULL,
                                NULL,
                                NULL,
                                HookThread,
                                NULL);
               
                                if (NT_SUCCESS(Status))
                                {
                                        ZwClose(ThreadHandle);
                                }
                                else
                                {
                                IoDeleteSymbolicLink(&LinkNameUnicodeString);
                                IoDeleteDevice(DeviceObject);
                                DbgPrint("CreateSystemThread failed");
                                }

                }
                else
                {
                        IoDeleteDevice(DeviceObject);
                        DbgPrint("CreateSymbolicLink failed");
                }

        }

        return Status;
}

VOID HookThread(PVOID Context)
{
        LARGE_INTEGER lDelay;
        KeSetBasePriorityThread(KeGetCurrentThread(), LOW_REALTIME_PRIORITY);
        lDelay = RtlConvertLongToLargeInteger(-10000 * 1000);
        KeDelayExecutionThread(KernelMode, FALSE, &lDelay);
        OnHook();
        PsTerminateSystemThread(STATUS_SUCCESS);
}

VOID OnHook(VOID)
{
        KIRQL   Irql;
        if (EntryCall)
        {
                memcpy(&OriginalBytes ,EntryCall , sizeof(OriginalBytes));
                *(ULONG *)(JmpAdderss+1)=(ULONG)HookPatch - (ULONG)EntryCall - sizeof(JmpAdderss);
                DisableWriteProtect();
                Irql = KeRaiseIrqlToDpcLevel();
                memcpy(EntryCall, &JmpAdderss , sizeof(JmpAdderss));
                KeLowerIrql(Irql);
                EnableWriteProtect();
        }
       
}

VOID UnHook(VOID)
{
        KIRQL   Irql;
        if (EntryCall)
        {       
                DisableWriteProtect();
                Irql = KeRaiseIrqlToDpcLevel();
                memcpy(EntryCall ,&OriginalBytes , sizeof(OriginalBytes));
                KeLowerIrql(Irql);
                EnableWriteProtect();
        }
}

VOID __declspec(naked) HookPatch(VOID)
{
        __asm                                       
        {
                pushad
                pushfd
                push dword ptr ss:[esp+0x28]    //RegistryString
                push dword ptr ss:[esp+0x28]        //DriverObject
                call FakeEntry
                test eax,eax
                jz TAG1
                popfd
                popad
                mov eax,0xC0000001
                add esp,8
                jmp TAG2
TAG1:
                popfd
                popad
                call dword ptr ds:[edi+0x2c]                //只合适XP
TAG2:
                cmp eax,ebx
                push EntryRetn
                retn
        }
}

VOID DisableWriteProtect(VOID)
{
        __asm
        {
                        push eax
                        mov eax,cr0
                        mov OldAttr,eax
                        and eax,0FFFEFFFFh
                        mov cr0,eax
                        pop eax
        }
}
VOID EnableWriteProtect(VOID)
{
        __asm
        {
                push eax
                mov eax,OldAttr
                mov cr0,eax
                pop eax
        }
}

NTSTATUS FakeEntry(IN PDRIVER_OBJECT DriverObject,
                   IN PUNICODE_STRING RegistryPath)
{
        PLDR_DATA_TABLE_ENTRY PLDTE = DriverObject->DriverSection;

        DbgPrint("BaseAddr: %08X" , PLDTE->DllBase);
        DbgPrint("FullName: %ws" , PLDTE->FullDllName.Buffer);
        DbgPrint("BaseName: %ws" , PLDTE->BaseDllName.Buffer);
        return STATUS_SUCCESS;
}


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 6
支持
分享
最新回复 (9)
雪    币: 2314
活跃值: (2205)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
2
HOOK 的 IopLoadDriver 吧。
2012-7-28 12:23
0
雪    币: 27
活跃值: (127)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
3
看看,123456
2012-7-28 12:48
0
雪    币: 615
活跃值: (590)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
4
学习一下
2012-7-28 21:27
0
雪    币: 688
活跃值: (85)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
很好...学习了!!!!!!!!!!!!!!!!!!!!
2012-8-1 00:34
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
看看怎么拦截的
2012-8-1 00:41
0
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wli
7
这个能用于自校验的吗?
2012-8-2 21:59
0
雪    币: 276
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
数字卫士没反应,牛贴啊
2012-8-3 07:51
0
雪    币: 938
活跃值: (948)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
就是Inline IopLoadDriver 不用回溯直接Hook函数中部一样搞
2012-8-7 17:09
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
新手学习 看看怎么拦截的
2012-8-11 05:09
0
游客
登录 | 注册 方可回帖
返回
//