隐藏指定驱动

尝试隐藏这个驱动

#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,//线程的属性,一般设为NULLIN 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;
}

通过驱动断链来隐藏驱动相关推荐

  1. Win10内核驱动断链式隐藏指定进程

    //直接上功能代码: //定义函数,通过进程PID操作隐藏 NTSTATUS HideProcess(ULONG pid) {//定义存放EPROCESS地址变量 ULONG64 L_pEPROCES ...

  2. 驱动开发:断链隐藏驱动程序自身

    与断链隐藏进程功能类似,关于断链进程隐藏可参考<驱动开发:DKOM 实现进程隐藏>这一篇文章,断链隐藏驱动自身则用于隐藏自身SYS驱动文件,当驱动加载后那么使用ARK工具扫描将看不到自身驱 ...

  3. 内核驱动隐藏自身【断链】

    内核驱动加载断链式隐藏自身 //创建一个驱动对象数据结构 typedef struct _KLDR_DATA_TABLE_ENTRY {LIST_ENTRY64 InLoadOrderLinks;// ...

  4. 驱动编程:注册表回调,进程回调,文件回调,进程隐藏断链,窗口保护

    #include "struct.h"#define debug_pott_offset 0x298 //#define debug_pott_offset 0x1f0DWORD ...

  5. (53)进程结构体EPROCESS,擦除 DebugPort 实现反调试,ActiveProcessLinks 断链实现进程隐藏

    一.进程的作用 进程最重要的作用是提供了CR3,10-10-12分页下CR3指向页目录表,2-9-9-12分页下CR3指向页目录指针表. 每个进程有一个或多个线程.本质上,没有进程切换,只有线程切换. ...

  6. 4.PEB断链隐藏模块

    0x4 PEB断链隐藏模块 1.如何找到_PEB_LDR_DATA 由_TEB找到_PEB,_PEB偏移0xC找到_PEB_LDR_DATA 2.基础知识 _LDR_DATA_TABLE_ENTRY结 ...

  7. 二、C++反作弊对抗实战 (进阶篇 —— 2.作弊器中常见断链隐藏DLL方法)

    目前,比较常见的模块隐藏方法有抹去模块的PE头.断开进程的LDR_MODULE链或者Hook模块枚举函数等,这里介绍前面抹去PE头.断链的方法. 提示:以下是本篇文章正文内容,下面案例可供参考 一.设 ...

  8. _ETHREAD断链 —— 实现线程隐藏

    简介 线程所属的父进程 _EPROCESS 结构体中的 ThreadListHead 成员是当前进程中所有线程的双向链表头,该成员有两个,分别在 0x50 和 0x190 处.我们可以通过该线程链表头 ...

  9. 【声音 | 华兴资本包凡:未来新经济行业一定靠区块链等技术驱动】

    gbcax链交所 [声音 | 华兴资本包凡:未来新经济行业一定靠区块链等技术驱动] 据人民网消息,华兴资本及其创始人包凡表示:未来新经济行业的发展一定靠技术驱动,这其中以人工智能.区块链.基因科技.纳 ...

最新文章

  1. SWFTools PDF转换为SWF
  2. layui table 弹出层刷新_layui 关闭open弹出框 刷新table表格页面的方法
  3. 若依前后端分离/微服务版怎样构造免密链接实现其他系统免登录访问
  4. 从无监督构建词库看「最小熵原理」,套路是如何炼成的
  5. 大气校正后的ndvi_Sentinel2 L1C下载、大气校正、重采样
  6. 【转】医学图像中的窗宽、窗位!!
  7. 如果服务器开机显示NObootable,电脑开机出现“No bootable device”的解决办法
  8. 运动目标跟踪(十二)--KCF跟踪及CSK,CN对比
  9. 【转】Intellij Idea识别Java Web项目
  10. lammps教程:薄膜渗透过滤模拟(1)
  11. 全国计算机等级考试3月份报名时间,2021年3月全国计算机等级考试报名时间公布...
  12. Redis 官方可视化工具,功能真强大
  13. 求解-----组合优化问题
  14. html生日祝福心形,心形生日祝福QQ空间个性留言代码_送你的
  15. antv/G6和antv/X6
  16. .7z.001,.7z.002这样的文件如何解压
  17. unity摄像机环绕物体旋转
  18. 交互与前端15 Tabulator 表格实践3
  19. [转]手机号码归属地接口
  20. java向上转型_Java向上转型

热门文章

  1. Celery+django+redis异步执行任务
  2. Android Studio:Type mismatch: inferred type is Int but Unit was expected
  3. 求1000-2000年的闰年代码
  4. 云原生安全之RASP技术(应用运行时自我保护)
  5. [DAX] DIVIDE函数
  6. css圣杯布局与双飞翼布局_CSS布局研讨会已于2018年更新
  7. 一键部署k8s集群(三节点)
  8. redis的压缩列表和跳表,看这一篇文章就够了
  9. pandas:数据筛选的8个操作
  10. php最大的论坛,phpwind论坛史上最大漏洞 -电脑资料