DKOM 就是直接内核对象操作技术,我们所有的操作都会被系统记录在内存中,而驱动进程隐藏的做旧就是操作进程的EPROCESS结构与线程的ETHREAD结构、链表,要实现进程的隐藏我们只需要将某个进程中的信息,在系统EPROCESS链表中摘除即可实现进程隐藏。

DKOM 隐藏进程的本质是操作EPROCESS结构体,EPROCESS结构体中包含了系统中的所有进程相关信息,还有很多指向其他结构的指针,首先我们可以通过WinDBG在内核调试模式下输入dt_eprocess 即可查看到当前的EPROCESS结构体的偏移信息,结构较多,但常用的就下面这几个。

kd> dt_eprocessnt!_EPROCESS+0x000 Pcb              : _KPROCESS+0x160 ProcessLock      : _EX_PUSH_LOCK+0x168 CreateTime       : _LARGE_INTEGER                   // 创建时间+0x170 ExitTime         : _LARGE_INTEGER                     // 退出时间+0x180 UniqueProcessId  : Ptr64 Void                         // 进程的PID+0x188 ActiveProcessLinks : _LIST_ENTRY                    // 活动进程链表+0x200 ObjectTable      : Ptr64 _HANDLE_TABLE          // 指向句柄表的指针+0x2d8 Session          : Ptr64 Void                                // 会话列表+0x2e0 ImageFileName    : [15] UChar                         // 进程的名称+0x308 ThreadListHead   : _LIST_ENTRY                       // 进程中的线程链表结构+0x320 Wow64Process     : Ptr64 Void                        // 32位进程链表+0x328 ActiveThreads    : Uint4B                                 // 活动的线程+0x32c ImagePathHash    : Uint4B                               // 镜像路径的Hash值+0x338 Peb              : Ptr64 _PEB                                 // 指向PEB结构的指针+0x440 Flags            : Uint4B                                       // 进程标志

要实现进程的隐藏我们需要关注结构中的 ActiveProcessLinks 该指针把每个进程的EPROCESS结构体连接成了双向链表,我们可以使用 ZwQuerySystemInformation 这个函数来遍历出所有的进程信息,要实现进程的隐藏,只需要将某个进程的EPROCESS从结构体中摘除,那么通过ZwQuerySystemInformation函数就无法遍历出被摘链的进程了,从而实现了进程的隐藏。

在实现进程隐藏之前,我们需要通过代码的方式获取到当前系统中所有进程的EPROCESS信息,我们可以通过 PsLookupProcessByProcessId函数获取到指定进程的ID,然后通过 PsGetProcessImageFileName 函数取出结构名称,并通过 _stricmp 判断是否是我们想要隐藏的程序。

#include <ntifs.h>
NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(HANDLE ProcessId, PEPROCESS *Process);
NTKERNELAPI CHAR* PsGetProcessImageFileName(PEPROCESS Process);VOID UnDriver(PDRIVER_OBJECT driver)
{DbgPrint(("驱动程序卸载成功! \n"));
}PEPROCESS GetProcessObjectByName(char *name)
{SIZE_T temp;for (temp = 100; temp<10000; temp += 4){NTSTATUS status;PEPROCESS ep;status = PsLookupProcessByProcessId((HANDLE)temp, &ep);if (NT_SUCCESS(status)){char *pn = PsGetProcessImageFileName(ep);if (_stricmp(pn, name) == 0)return ep;}}return NULL;
}NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{PEPROCESS PRoc = NULL;PRoc = GetProcessObjectByName("calc.exe");DriverObject->DriverUnload = UnDriver;return STATUS_SUCCESS;
}

然后得到句柄以后直接摘除进程的结构即可实现隐藏,这种摘除方式比较草率,如果关闭驱动后没有手工还原的话可能会导致蓝屏,该方法只用于在Win7上使用,Win10没试过。

#include <ntifs.h>
#define PROCESS_ACTIVE_PROCESS_LINKS_OFFSET 0x188NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(HANDLE ProcessId, PEPROCESS *Process);
NTKERNELAPI CHAR* PsGetProcessImageFileName(PEPROCESS Process);VOID UnDriver(PDRIVER_OBJECT driver)
{DbgPrint(("驱动程序卸载成功! \n"));
}PEPROCESS GetProcessObjectByName(char *name)
{SIZE_T temp;for (temp = 100; temp<10000; temp += 4){NTSTATUS status;PEPROCESS ep;status = PsLookupProcessByProcessId((HANDLE)temp, &ep);if (NT_SUCCESS(status)){char *pn = PsGetProcessImageFileName(ep);if (_stricmp(pn, name) == 0)return ep;}}return NULL;
}VOID RemoveListEntry(PLIST_ENTRY ListEntry)
{KIRQL OldIrql;OldIrql = KeRaiseIrqlToDpcLevel();if (ListEntry->Flink != ListEntry &&ListEntry->Blink != ListEntry &&ListEntry->Blink->Flink == ListEntry &&ListEntry->Flink->Blink == ListEntry){ListEntry->Flink->Blink = ListEntry->Blink;ListEntry->Blink->Flink = ListEntry->Flink;ListEntry->Flink = ListEntry;ListEntry->Blink = ListEntry;}KeLowerIrql(OldIrql);
}// 隐藏指定进程(会蓝屏)
BOOLEAN HideProcessB(PUCHAR pszHideProcessName)
{PEPROCESS pFirstEProcess = NULL, pEProcess = NULL;ULONG ulOffset = 0;HANDLE hProcessId = NULL;PUCHAR pszProcessName = NULL;// 获取相应偏移大小ulOffset = PROCESS_ACTIVE_PROCESS_LINKS_OFFSET;if (0 == ulOffset){return FALSE;}// 获取当前进程结构对象pFirstEProcess = PsGetCurrentProcess();pEProcess = pFirstEProcess;// 开始遍历枚举进程do{// 从 EPROCESS 获取进程 PIDhProcessId = PsGetProcessId(pEProcess);// 从 EPROCESS 获取进程名称pszProcessName = PsGetProcessImageFileName(pEProcess);// 隐藏指定进程if (0 == _stricmp(pszProcessName, pszHideProcessName)){// 摘链RemoveEntryList((PLIST_ENTRY)((PUCHAR)pEProcess + ulOffset));break;}// 根据偏移计算下一个进程的 EPROCESSpEProcess = (PEPROCESS)((PUCHAR)(((PLIST_ENTRY)((PUCHAR)pEProcess + ulOffset))->Flink) - ulOffset);} while (pFirstEProcess != pEProcess);return TRUE;
}NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{PEPROCESS PRoc = NULL;PRoc = GetProcessObjectByName("calc.exe");// 摘除结构中的calc.exe 实现驱动隐藏计算器RemoveListEntry((PLIST_ENTRY)((ULONG64)PRoc + PROCESS_ACTIVE_PROCESS_LINKS_OFFSET));DriverObject->DriverUnload = UnDriver;return STATUS_SUCCESS;
}

没什么难度,就是摘链,而这种断链隐藏,不仅操作不好会蓝屏且很容易被发现,只是能在任务管理器看不到而已。

x64驱动:DKOM 实现进程隐藏相关推荐

  1. hidetoolz源码_开源r0进程隐藏保护工具通过发送窗口消息

    毕竟是不会蓝屏的隐藏进程,也想看看到底是破PG的还是什么更骚的操作. 于是鄙人分析了--"HideToolz" --无奈发现鄙人电脑一直驱动加载失败,正当选择放弃.正当选择打开UC ...

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

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

  3. X64驱动开发和保护+X86X64游戏逆向分析课程

    老师教学范围和方式:木塔负责PC电脑端C语言基础和端游逆向分析部分内容,采用录制+部分直播课程教学,晚上还有专业老师讲解和指导.我要的是质量不是数量.老师备课,设计课件需要时间的. 学习周期:PC端3 ...

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

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

  5. [网友LionD8的毕业论文]Windows2000 内核级进程隐藏、侦测技术

    Windows2000 内核级进程隐藏.侦测技术 指导老师:龙老师 学生:LionDB        学号:0137506 摘要 信息对抗是目前计算机发展的一个重要的方向,为了更好的防御,必须去深入的 ...

  6. Windows2000 内核级进程隐藏、侦测技术[毕业论文]

    Windows2000 内核级进程隐藏.侦测技术 指导老师:龙老师 学生:LionDB        学号:0137506 摘要 信息对抗是目前计算机发展的一个重要的方向,为了更好的防御,必须去深入的 ...

  7. (渗透测试后期)Linux进程隐藏详解

    文章目录 (渗透测试后期)Linux进程隐藏详解 前言 Linux进程基础 Linux进程侦查手段 Linux进程隐藏手段 一.基于用户态的进程隐藏 方法1:小隐隐于/proc/pid--劫持read ...

  8. 进程的攻与“防” ---- 进程隐藏(Win7 x32 绕过PC Hunter)

    说来惭愧,360一面的时候,面试官问我如何去隐藏一个进程,我说很简单那,从EProcess的ActiveProcessLinks的双向列表中断开就完事了啊,面试官当时也没有提醒我,直到面试完,我自己研 ...

  9. win7 x64驱动开发经验(三)windbg 双机调试配置 、问题及解决办法

    win7 x64驱动开发经验(三)windbg 双机调试配置 .问题及解决办法 http://www.cnblogs.com/witty/archive/2012/04/23/2466024.html ...

最新文章

  1. @Controller与@RestController区别
  2. 【最全干货】从SGD到NadaMax,十种机器学习优化算法原理及实现
  3. Java反射机制深入详解
  4. Cinder LVM Oversubscription in thin provisioning
  5. oracle数据库函数和存储过程的包
  6. linux的rhce考试题,【干货】RHCE考题和详细答案详攻略(一)
  7. python中read()、readline()、readlines()函数
  8. myeclipse启动php,myeclipse,jdk_启动myeclipse报错,myeclipse,jdk - phpStudy
  9. mysql max字符串数值_针对字符串值的mysql:min()和max()。
  10. python 函数可以作为容器对象的元素_11.Python初窥门径(函数名,可迭代对象,迭代器)...
  11. linux 服务器 硬盘测试工具,linux硬盘检测工具:Smartmontools使用指南
  12. rfid考勤系统c语言,基于RFID的员工考勤系统设计
  13. 什么是物联网?常见IoT协议最全讲解
  14. category 详解
  15. 私有云盘的搭建(owncloud、seafile)
  16. 如何去掉CSDN中图片的水印
  17. C++实验题21 破解简单密码
  18. Linux获取纳秒级时间,WINDOW和LINXU下获取纳秒级时间精度
  19. 数据存储设备的发展历史
  20. python只读属性怎么设置_Python 定义只读属性的实现方式

热门文章

  1. darknet学习笔记
  2. 一日一技 | 利用油猴插件自定义网页显示字体
  3. 生成随机密码,验证码
  4. 永嘉原*厂-VK1Q68D 是低功耗LED显示/数码管显示驱动IC,带键盘扫描电路,4~7 位,10~13 段 显示,QFN24 4*4MM超小体积封装
  5. 想制作一个网站,不知道应该怎么做?
  6. 不是所有云服务提供商都叫QAD
  7. SLF4J: Failed toString() invocation on an object of type [org.eclipse.jetty.websocket.server......
  8. xp系统访问共享服务器提示无网络路径,WinXP提示无任何网络提供程序接受指定的网络路径怎么办?...
  9. java desktop_Java Desktop开发资源
  10. Excel数据分析:美国牛油果销售分析