大理寺少卿 发表于 2025-5-21 23:47:43

驱动开发与系统原理-断链隐藏其他驱动

断链隐藏其他驱动需要注意的是要用到之前借壳通信的知识

extern POBJECT_TYPE* IoDriverObjectType;
NTSTATUS
ObReferenceObjectByName(
__in PUNICODE_STRING ObjectName,
__in ULONG Attributes,
__in_opt PACCESS_STATE AccessState,
__in_opt ACCESS_MASK DesiredAccess,
__in POBJECT_TYPE ObjectType,
__in KPROCESSOR_MODE AccessMode,
__inout_opt PVOID ParseContext,
__out PVOID* Object
);
通过驱动名称获取驱动对象

代码
----

#include<ntifs.h>
#include<intrin.h>
extern POBJECT_TYPE* IoDriverObjectType;
NTSTATUS
ObReferenceObjectByName(
    __in PUNICODE_STRING ObjectName,
    __in ULONG Attributes,
    __in_opt PACCESS_STATE AccessState,
    __in_opt ACCESS_MASK DesiredAccess,
    __in POBJECT_TYPE ObjectType,
    __in KPROCESSOR_MODE AccessMode,
    __inout_opt PVOID ParseContext,
    __out PVOID* Object
);
typedef struct _LDR_DATA_TABLE_ENTRY
{
    LIST_ENTRY InLoadOrderLinks;
    LIST_ENTRY InMemoryOrderLinks;
    LIST_ENTRY InInitializationOrderLinks;
    PVOID DllBase;
    PVOID EntryPoint;
    ULONG SizeOfImage;
    UNICODE_STRING FullDllName;
    UNICODE_STRING BaseDllName;
    ULONG Flags;
    USHORT LoadCount;
    USHORT TlsIndex;
    union
    {
      LIST_ENTRY HashLinks;
      struct
      {
      PVOID SectionPointer;
      ULONG CheckSum;
      };
    };
    union
    {
      ULONG TimeDateStamp;
      PVOID LoadedImports;
    };
    PVOID EntryPointActivationContext;
    PVOID PatchInformation;
    LIST_ENTRY ForwarderLinks;
    LIST_ENTRY ServiceTagLinks;
    LIST_ENTRY StaticLinks;
} LDR_DATA_TABLE_ENTRY, * PLDR_DATA_TABLE_ENTRY;

VOID DriverUnload(PDRIVER_OBJECT pDriverObject) {

    DbgPrint("Unload Driver Success! ");

}
VOID HideDriver(PDRIVER_OBJECT pDriverObject) {
    PLDR_DATA_TABLE_ENTRY HeaderNode = &((PLDR_DATA_TABLE_ENTRY)pDriverObject->DriverSection)->InLoadOrderLinks;
    RemoveEntryList(HeaderNode);
    pDriverObject->DriverSection = 0;
    pDriverObject->Size = 0;
    pDriverObject->Type = 0;
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) {
    DbgPrint("Load Driver Success!");
    //设备名称
    UNICODE_STRING uDrivername = { 0 };
    //初始化设备名称
    RtlInitUnicodeString(&uDrivername, L"\\Driver\\MyDriver2");
    //设置驱动对象
    PDRIVER_OBJECT pDriverObject1 = NULL;
    //获取驱动对象->借壳通信
    NTSTATUS ntSTATUS = ObReferenceObjectByName(&uDrivername, OBJ_CASE_INSENSITIVE, NULL, FILE_ALL_ACCESS, *IoDriverObjectType, KernelMode, NULL, &pDriverObject1);
    if (!NT_SUCCESS(ntSTATUS))
    {
      DbgPrint("%x", ntSTATUS);
    }
    if (pDriverObject1)
    {
      ObDereferenceObject(pDriverObject1);//失败后关闭驱动对象引用
    }
    HideDriver(pDriverObject1);
    return STATUS_SUCCESS;
    }
我们现在不需要挂系统线程进行驱动隐藏,我们直接封装成函数,通过RemoveEntryList的API进行删除,在删除之前通过ObReferenceObjectByName获取驱动对象

没有启动“隐藏驱动”
--------------------

![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20220117010633.png)

我们可以看到自己的驱动

启动“隐藏驱动”
----------------

![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20220117010700.png)

Driver2已经被隐藏,现在只有自己的Driver4

YINXN 发表于 2025-5-22 16:20:05

谢谢分享

AO1199 发表于 2025-5-23 09:09:00

历害!!

woshuox 发表于 2025-5-23 12:09:41

非常好教程

987652525QQ 发表于 4 天前

大佬六六六我喜欢我喜欢我喜欢

ytyyty 发表于 4 天前

谢谢分享

gusong 发表于 4 天前

谢谢大佬分享,学习了

asmprofan 发表于 3 天前

膜拜神贴,后面的请保持队形~

hualong007 发表于 3 天前

果断MARK,前十有我必火!

xht530 发表于 3 天前

太厉害了,又学会了一些!
页: [1]
查看完整版本: 驱动开发与系统原理-断链隐藏其他驱动