通过驱动断链来隐藏驱动

隐藏指定驱动在这里插入图片描述

尝试隐藏这个驱动

#include <ntifs.h>

typedef struct _KLDR_DATA_TABLE_ENTRY {
	LIST_ENTRY InLoadOrderLinks;
	LIST_ENTRY exp;
	ULONG un;
	ULONG NonPagedDebugInfo;
	ULONG DllBase;
	ULONG EntryPoint;
	ULONG SizeOfImage;
	UNICODE_STRING FullDllName;
	UNICODE_STRING BaseDllName;
	ULONG Flags;
	USHORT LoadCount;
	USHORT __Undefined5;
	ULONG  __Undefined6;
	ULONG  CheckSum;
	ULONG  TimeDateStamp;
} KLDR_DATA_TABLE_ENTRY, * PKLDR_DATA_TABLE_ENTRY;
/*kd> dt _LDR_DATA_TABLE_ENTRY
nt!_LDR_DATA_TABLE_ENTRY
   +0x000 InLoadOrderLinks : _LIST_ENTRY//这个成员把系统所有加载(可能是停止没被卸载)已经读取到内存中,形成一个双链表,本驱动的驱动对象就是一个节点
   +0x008 InMemoryOrderLinks : _LIST_ENTRY//系统已经启动 没有被初始化 没有调用DriverEntry这个历程的时候 通过这个链表进程串接起来
   +0x010 InInitializationOrderLinks : _LIST_ENTRY//已经调用DriverEntry这个函数的所有驱动程序
   +0x018 DllBase          : Ptr32 Void
   +0x01c EntryPoint       : Ptr32 Void//驱动的进入点
   +0x020 SizeOfImage      : Uint4B
   +0x024 FullDllName      : _UNICODE_STRING//驱动的全路径
   +0x02c BaseDllName      : _UNICODE_STRING//不带路径的驱动名字
   +0x034 Flags            : Uint4B
   +0x038 LoadCount        : Uint2B
   +0x03a TlsIndex         : Uint2B
   +0x03c HashLinks        : _LIST_ENTRY
   +0x03c SectionPointer   : Ptr32 Void
   +0x040 CheckSum         : Uint4B
   +0x044 TimeDateStamp    : Uint4B
   +0x044 LoadedImports    : Ptr32 Void
   +0x048 EntryPointActivationContext : Ptr32 _ACTIVATION_CONTEXT
   +0x04c PatchInformation : Ptr32 Void
   +0x050 ForwarderLinks   : _LIST_ENTRY
   +0x058 ServiceTagLinks  : _LIST_ENTRY
   +0x060 StaticLinks      : _LIST_ENTRY
   +0x068 ContextInformation : Ptr32 Void
   +0x06c OriginalBase     : Uint4B
   +0x070 LoadTime         : _LARGE_INTEGER
*/

NTKERNELAPI NTSTATUS ObReferenceObjectByName(
	__in PUNICODE_STRING ObjectName,
	__in ULONG Attributes,
	__in_opt PACCESS_STATE AccessState,// 访问权限可以写0 写0完全访问不受控制FILE_ALL_ACCESS,
	__in_opt ACCESS_MASK DesiredAccess,
	__in POBJECT_TYPE ObjectType,//对象类型
	__in KPROCESSOR_MODE AccessMode,内核模式 有三种模式 enum 类型  
	__inout_opt PVOID ParseContext,
	__out PVOID* Object输出对象 我们要得到的驱动对象  
);


extern POBJECT_TYPE* IoDriverObjectType;


void DriverHide(PWCH ObjName)
{
	LARGE_INTEGER in = { 0 };
	/*typedef union _LARGE_INTEGER {
    struct {
        ULONG LowPart;
        LONG HighPart;
    } DUMMYSTRUCTNAME;
    struct {
        ULONG LowPart;
        LONG HighPart;
    } u;
    LONGLONG QuadPart;
	} LARGE_INTEGER;*/
	in.QuadPart = -10000 * 5000;
	KeDelayExecutionThread(KernelMode, FALSE, &in);//等待



	UNICODE_STRING driverName1 = { 0 };
	/*typedef struct _UNICODE_STRING {
    USHORT Length;
    USHORT MaximumLength;
	} UNICODE_STRING;*/
	RtlInitUnicodeString(&driverName1, ObjName);//传入驱动的名字
	PDRIVER_OBJECT Driver = NULL;//初始化驱动对象
	/*
	typedef struct _DRIVER_OBJECT {
		CSHORT             Type;
		CSHORT             Size;
		PDEVICE_OBJECT     DeviceObject;
		ULONG              Flags;
		PVOID              DriverStart;
		ULONG              DriverSize;
		PVOID              DriverSection;
		PDRIVER_EXTENSION  DriverExtension;
		UNICODE_STRING     DriverName;
		PUNICODE_STRING    HardwareDatabase;
		PFAST_IO_DISPATCH  FastIoDispatch;
		PDRIVER_INITIALIZE DriverInit;//IO管理器设置驱动程序的DriverEntry例程入口点。
		PDRIVER_STARTIO    DriverStartIo;
		PDRIVER_UNLOAD     DriverUnload;
		PDRIVER_DISPATCH   MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
	} DRIVER_OBJECT, *PDRIVER_OBJECT;*/
	NTSTATUS status = ObReferenceObjectByName(&driverName1, FILE_ALL_ACCESS, 0, 0, *IoDriverObjectType, KernelMode, NULL, &Driver);//通过驱动的到驱动的对象

	if (NT_SUCCESS(status))//判断
	{
		PKLDR_DATA_TABLE_ENTRY ldr = (PKLDR_DATA_TABLE_ENTRY)Driver->DriverSection;//驱动对象结构.可以解析为_LDR_DATA_TABLE_ENTRY是一个链表存储着下一个驱动对象  
		DbgPrintEx(77, 0, "[db]: driver name = %wZ\r\n", &ldr->FullDllName);//输出名字
		Driver->DriverSection = ldr->InLoadOrderLinks.Flink;
		RemoveEntryList(&ldr->InLoadOrderLinks);//去除双向链表中的值
		Driver->DriverInit = NULL;
		ObDereferenceObject(Driver);//删除刚刚的到的驱动对象
	}
	return;
}


VOID DriverUnload(PDRIVER_OBJECT pDriver)
{
	DbgPrint("END\r\n");//卸载
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pReg)
{
	HANDLE hThread = NULL;
	NTSTATUS status = PsCreateSystemThread(&hThread, THREAD_ALL_ACCESS, NULL, NULL, NULL, DriverHide, L"\\driver\\PCHunter32as");
	/*
	NTSTATUS PsCreateSystemThread(
 	OUT PHANDLE  ThreadHandle, //新创建的线程句柄
	IN ULONG  DesiredAccess, //创建的权限
	IN POBJECT_ATTRIBUTES  ObjectAttributes  OPTIONAL,//线程的属性,一般设为NULL
	IN HANDLE  ProcessHandle  OPTIONAL,//指定创建用户线程还是系统线程。如果为NULL,则为系统进程,如果该值是一个进程句柄,则新创建的线程属于这个指定的进程。DDK提供的NTCurrentProcess可以得到当前进程的句柄。
 	OUT PCLIENT_ID  ClientId  OPTIONAL,
 	IN PKSTART_ROUTINE  StartRoutine,//新线程的运行地址
 	IN PVOID  StartContext //新线程接收的参数
  );*/
	if (NT_SUCCESS(status))
	{
		NtClose(hThread);
	}
	pDriver->DriverUnload = DriverUnload;
	return STATUS_SUCCESS;
}


成功隐藏

通过遍历来隐藏驱动

这个我尝试的隐藏的HTTP.sys,忘记截图了

#include <ntifs.h>

typedef struct _KLDR_DATA_TABLE_ENTRY {
	LIST_ENTRY InLoadOrderLinks;
	LIST_ENTRY exp;
	ULONG un;
	ULONG NonPagedDebugInfo;
	ULONG DllBase;
	ULONG EntryPoint;
	ULONG SizeOfImage;
	UNICODE_STRING FullDllName;
	UNICODE_STRING BaseDllName;
	ULONG Flags;
	USHORT LoadCount;
	USHORT __Undefined5;
	ULONG  __Undefined6;
	ULONG  CheckSum;
	ULONG  TimeDateStamp;
} KLDR_DATA_TABLE_ENTRY, * PKLDR_DATA_TABLE_ENTRY;
/*kd> dt _LDR_DATA_TABLE_ENTRY
nt!_LDR_DATA_TABLE_ENTRY
   +0x000 InLoadOrderLinks : _LIST_ENTRY//这个成员把系统所有加载(可能是停止没被卸载)已经读取到内存中,形成一个双链表,本驱动的驱动对象就是一个节点
   +0x008 InMemoryOrderLinks : _LIST_ENTRY//系统已经启动 没有被初始化 没有调用DriverEntry这个历程的时候 通过这个链表进程串接起来
   +0x010 InInitializationOrderLinks : _LIST_ENTRY//已经调用DriverEntry这个函数的所有驱动程序
   +0x018 DllBase          : Ptr32 Void
   +0x01c EntryPoint       : Ptr32 Void//驱动的进入点
   +0x020 SizeOfImage      : Uint4B
   +0x024 FullDllName      : _UNICODE_STRING//驱动的全路径
   +0x02c BaseDllName      : _UNICODE_STRING//不带路径的驱动名字
   +0x034 Flags            : Uint4B
   +0x038 LoadCount        : Uint2B
   +0x03a TlsIndex         : Uint2B
   +0x03c HashLinks        : _LIST_ENTRY
   +0x03c SectionPointer   : Ptr32 Void
   +0x040 CheckSum         : Uint4B
   +0x044 TimeDateStamp    : Uint4B
   +0x044 LoadedImports    : Ptr32 Void
   +0x048 EntryPointActivationContext : Ptr32 _ACTIVATION_CONTEXT
   +0x04c PatchInformation : Ptr32 Void
   +0x050 ForwarderLinks   : _LIST_ENTRY
   +0x058 ServiceTagLinks  : _LIST_ENTRY
   +0x060 StaticLinks      : _LIST_ENTRY
   +0x068 ContextInformation : Ptr32 Void
   +0x06c OriginalBase     : Uint4B
   +0x070 LoadTime         : _LARGE_INTEGER
*/

NTKERNELAPI NTSTATUS ObReferenceObjectByName(
	__in PUNICODE_STRING ObjectName,
	__in ULONG Attributes,
	__in_opt PACCESS_STATE AccessState,// 访问权限可以写0 写0完全访问不受控制FILE_ALL_ACCESS,
	__in_opt ACCESS_MASK DesiredAccess,
	__in POBJECT_TYPE ObjectType,//对象类型
	__in KPROCESSOR_MODE AccessMode,内核模式 有三种模式 enum 类型  
	__inout_opt PVOID ParseContext,
	__out PVOID* Object输出对象 我们要得到的驱动对象  
);


extern POBJECT_TYPE* IoDriverObjectType;

VOID DriverUnload(PDRIVER_OBJECT pDriver)
{
	DbgPrint("END\r\n");//卸载
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pReg)
{

	PKLDR_DATA_TABLE_ENTRY ldr = (PKLDR_DATA_TABLE_ENTRY)pDriver->DriverSection;
	PKLDR_DATA_TABLE_ENTRY pre = (PKLDR_DATA_TABLE_ENTRY)ldr->InLoadOrderLinks.Flink;//本身的节点
	PKLDR_DATA_TABLE_ENTRY next = (PKLDR_DATA_TABLE_ENTRY)pre->InLoadOrderLinks.Flink;//下一个驱动的节点


	UNICODE_STRING driverName1 = {0};
	RtlInitUnicodeString(&driverName1, L"\\driver\\HTTP");

	UNICODE_STRING driverName = { 0 };
	RtlInitUnicodeString(&driverName, L"HTTP.sys");//获取名字

	while (next != pre)//遍历一遍
	{

		if (next->BaseDllName.Length != 0 && RtlCompareUnicodeString(&driverName, &next->BaseDllName, TRUE) == 0)//判断这个是不是空的,然后名字是否对的上
		{

			PDRIVER_OBJECT Driver = NULL;
			NTSTATUS status = ObReferenceObjectByName(&driverName1, FILE_ALL_ACCESS, 0, 0, *IoDriverObjectType, KernelMode, NULL, &Driver);//通过驱动的到驱动的对象

			if (NT_SUCCESS(status))
			{
				RemoveEntryList(&next->InLoadOrderLinks);
				Driver->DriverInit = NULL;
				Driver->DriverSection = NULL;//从双链表中去除,同时把一些其他的东西也都置0
			}
			DbgPrintEx(77, 0, "[db]:driver name = %wZ\r\n",&next->FullDllName);

			break;
		}

		next = (PKLDR_DATA_TABLE_ENTRY)next->InLoadOrderLinks.Flink;//遍历下一个
	}
	
	pDriver->DriverUnload = DriverUnload;
	return STATUS_SUCCESS;
}
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值