Anti Rookit -- 检测隐藏进程

2024-04-28 06:36
文章标签 隐藏 检测 进程 anti rookit

本文主要是介绍Anti Rookit -- 检测隐藏进程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Anti Rookit 一:检测隐藏进程

引言

检测隐藏进程除了众所周知的枚举进程ID之外,还有枚举句柄表的方式。不过今天给大家带来的是第三种方法。

探究

应用层通过接口 C r e a t e P r o c e s s \textcolor{cornflowerblue}{CreateProcess} CreateProcess创建进程,在内部会调用到 K e r n e l b a s e ! C r e a t e P r o c e s s I n t e r n a l \textcolor{orange}{Kernelbase!CreateProcessInternal} Kernelbase!CreateProcessInternal函数,该函数会调用 n t d l l ! N t C r e a t e U s e r P r o c e s s \textcolor{orange}{ntdll!NtCreateUserProcess} ntdll!NtCreateUserProcess转到内核执行创建进程,成功后会向csrss进程发送进程创建的消息。

在这里插入图片描述

​ CreateProcessInternal内部

C s r C l i e n t C a l l S e r v e r \textcolor{cornflowerblue}{CsrClientCallServer} CsrClientCallServer在非csrss进程内是通过LPC向csrss通讯的。在csrss进程内,由 C s r A p i R e q u e s t T h r e a d \textcolor{cornflowerblue}{CsrApiRequestThread} CsrApiRequestThread函数接收并处理,最终由 C s r p C r e a t e P r o c e s s \textcolor{cornflowerblue}{CsrpCreateProcess} CsrpCreateProcess函数负责处理新进程创建事件。

在这里插入图片描述

​ CsrpCreateProcess内部

函数会将进程信息链入一个符号为 C s r R o o t P r o c e s s \textcolor{red}{CsrRootProcess} CsrRootProcess的链表中。链表节点结构如下

typedef struct _CSR_PROCESS
{struct _CLIENT_ID ClientId; struct _LIST_ENTRY ListLink; // 指向下一个_CSR_PROCESSstruct _LIST_ENTRY ThreadList; // 指向_CSR_THREADstruct _CSR_NT_SESSION NtSession; VOID ClientPort; CHAR ClientViewBase; CHAR ClientViewBounds; VOID ProcessHandle;ULONG SequenceNumber; ULONG Flags;ULONG DebugFlags; ULONG ReferenceCount; ULONG ProcessGroupId; ULONG ProcessGroupSequence;ULONG LastMessageSequence; ULONG NumOutstandingMessages;ULONG ShutdownLevel;ULONG ShutdownFlags;struct _LUID Luid; PVOID ServerDllPerProcessData[1];
} CSR_PROCESS, *PCSR_PROCESS;

对于检测隐藏的进程,我们只需要关注该结构的ClientIdListLink两个字段就可以了。于是事情就变得很明显了,我们只需要遍历这个双向链表就能得到系统创建的所有进程。

不过这个符号并未导出,我们需要通过特征码去定位。以win10 1909 x64为例

我采用的定位方式是先取得 c s r s r v ! C s r E x e c S e r v e r T h r e a d \textcolor{orange}{csrsrv!CsrExecServerThread} csrsrv!CsrExecServerThread函数地址,因为是导出函数,所以很容易获取地址。然后观察该函数的反汇编代码:

在这里插入图片描述

​ CsrExecServerThread内部

于是特征码为: 48 8 B 0 D C C C C C C C C \textcolor{orange}{48\ 8B\ 0D\ CC\ CC\ CC\ CC} 48 8B 0D CC CC CC CC。其他版本系统方法如是,这里不赘述了。

因为csrss是保护进程,应用层无法读取它的内存数据,所以需要放到内核去做。

关键代码

VOID EnumCsrssProcessList(PCSR_PROCESS CsrProcessList)
{PEPROCESS pProcess = NULL;NTSTATUS ntStatus;PUNICODE_STRING uszProcName;PLIST_ENTRY pListHdr;PLIST_ENTRY pNext;__try{ProbeForRead(CsrProcessList, sizeof(CSR_PROCESS), 1);pListHdr = (PLIST_ENTRY)&CsrProcessList->ListLink;pNext = pListHdr->Blink;while (pListHdr != pNext){PCSR_PROCESS pCsrProc = CONTAINING_RECORD(pNext, CSR_PROCESS, ListLink);ProbeForRead(pCsrProc, sizeof(CSR_PROCESS), 1);ntStatus = PsLookupProcessByProcessId(pCsrProc->ClientId.UniqueProcess, &pProcess);if (NT_SUCCESS(ntStatus)){ntStatus = SeLocateProcessImageName(pProcess, &uszProcName);if (NT_SUCCESS(ntStatus)){DbgPrint("Pid: %x -- %wZ\n",PsGetProcessId(pProcess) ,uszProcName);ExFreePool(uszProcName);}ObDereferenceObject(pProcess);}pNext = pNext->Blink;}}__except (EXCEPTION_EXECUTE_HANDLER){DbgPrint("[!] An exception occurred! Exception code = %I32x\n", GetExceptionCode());}}

完整代码请到我的github仓库中查看:https://github.com/singlefreshBird/Rootkit/

演示

在这里插入图片描述

这篇关于Anti Rookit -- 检测隐藏进程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

Python多进程、多线程、协程典型示例解析(最新推荐)

《Python多进程、多线程、协程典型示例解析(最新推荐)》:本文主要介绍Python多进程、多线程、协程典型示例解析(最新推荐),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 目录一、multiprocessing(多进程)1. 模块简介2. 案例详解:并行计算平方和3. 实现逻

C#通过进程调用外部应用的实现示例

《C#通过进程调用外部应用的实现示例》本文主要介绍了C#通过进程调用外部应用的实现示例,以WINFORM应用程序为例,在C#应用程序中调用PYTHON程序,具有一定的参考价值,感兴趣的可以了解一下... 目录窗口程序类进程信息类 系统设置类 以WINFORM应用程序为例,在C#应用程序中调用python程序

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

Linux中的进程间通信之匿名管道解读

《Linux中的进程间通信之匿名管道解读》:本文主要介绍Linux中的进程间通信之匿名管道解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基本概念二、管道1、温故知新2、实现方式3、匿名管道(一)管道中的四种情况(二)管道的特性总结一、基本概念我们知道多