通过暴力搜索PID遍历进程并获取进程信息

进程强杀探究 前言 我们知道在windows操作系统里面有ring0跟ring3的概念(ring1、ring2在windows中并未使用),因为ring0的特权级别是比ring3高的,那么我们肯定不能在ring3调用windows提供的api杀死ring0特权级别的进程,那么这时候我们就需要使用的ring0的函数来强行结束一些处于ring0级别的进程。 测试 我们首先打开PCHunter32.exe看一下,应用层是不能够访问的,我们知道可以在cmd里面使用taskkill命令来结束进程,但这种方式对ring0特权级别的程 阅读详情

背景

通常我们在内核中使用 ZwQuerySystemInformation 函数来遍历进程模块并获取进程信息,这种是通过正常的进程遍历方式,所以,有很多 Rootkit 程序会 HOOK 这个 ZwQuerySystemInformation 函数,过滤指定进程,从而实现进程的隐藏。

本文实现的进程遍历和获取进程信息并不打算使用 ZwQuerySystemInformation 这种方式,而是直接暴力搜索进程的 PID,根据有效的 PID 获取相应进程的信息,从而实现进程的遍历。现在,我就来讲解具体的实现过程和原理,这个程序支持 32 位和 64 位 Win 7 至 Win10 全平台。

函数介绍

PsLookupProcessByProcessId

    NTSTATUS PsLookupProcessByProcessId(
        _In_  HANDLE    ProcessId,		// 指定进程的进程ID。
        _Out_ PEPROCESS *Process		// 返回指向ProcessId指定的进程的EPROCESS结构的引用指针。
    );

// 返回指向ProcessId指定的进程的EPROCESS结构的引用指针。

如果对 PsLookupProcessByProcessId 的调用成功,PsLookupProcessByProcessId 会增加Process参数中返回的对象的引用计数。因此,当驱动程序完成使用 Process 参数时,驱动程序必须调用 ObDereferenceObject 来取消引用从 PsLookupProcessByProcessId 例程接收的Process参数。


IoQueryFileDosDeviceName

    NTSTATUS IoQueryFileDosDeviceName(
        _In_  PFILE_OBJECT             FileObject,					// 指向文件的文件对象
        _Out_ POBJECT_NAME_INFORMATION *ObjectNameInformation		// 返回指向新分配的OBJECT_NAME_INFORMATION结构的指针。 这个结构用MS-DOS设备名称信息成功返回填写
    );
    // 成功,则返回STATUS_SUCCESS;否则错误。

/*
	typedef struct _OBJECT_NAME_INFORMATION {
     	UNICODE_STRING Name;
	} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
*/

实现原理

暴力搜索 PID 这个不难理解,即 PID 从 4 开始,步长为 4,一直遍历到 0x1000,因为进程的 PID 总是为 4 的倍数,所以,我们设置遍历的步长为 4。

然后,我们根据 PID,调用 PsLookupProcessByProcessId 函数获取 EPROCESS 进程结构体,因为 EPROCESS 这个结构体里存储着进程所有的信息,我们可以从这个 EPROCESS 结构体中获取我们想要的信息,例如进程的父进程、进程名、路径、进程双链表链等等。调用完 PsLookupProcessByProcessId 获取 EPROCESS 之后,记得调用 ObDereferenceObject 来释放对象。

在不同的系统版本中,EPROCESS 这个结构体定义也不相同,所以不建议使用固定的偏移地址来获取进程信息,而应该使用提供的 API 函数从 EPROCESS 结构体中获取。例如:

获取进程 PID,可以使用 PsGetProcessId 函数。

获取进程的父进程 PID,可以使用PsGetProcessInheritedFromUniqueProcessId 函数。

获取进程名称,可以使用 PsGetProcessImageFileName 函数。

获取进程路径,可以先试用 PsReferenceProcessFilePointer 函数获取文件指针对象,然后再调用 IoQueryFileDosDeviceName 获取 Dos 路径,最后还要记得使用 ObDereferenceObject 函数来释放对象。

编码实现

进程遍历:

    // 遍历进程
    NTSTATUS EnumProcess()
    {
        NTSTATUS status = STATUS_SUCCESS;
        ULONG i = 0;
        PEPROCESS pEProcess = NULL;
        // 开始遍历
        for (i = 4; i < 0x10000; i = i + 4)
        {
            status = PsLookupProcessByProcessId((HANDLE)i, &pEProcess);
            if (NT_SUCCESS(status))
            {
                // 从进程结构中获取进程信息
                GetProcessInfo(pEProcess);
                ObDereferenceObject(pEProcess);
            }
        }
        return status;
    }

从进程结构中获取进程信息:

    // 从进程结构中获取进程信息
    VOID GetProcessInfo(PEPROCESS pEProcess)
    {
        NTSTATUS status = STATUS_SUCCESS;
        HANDLE hParentProcessId = NULL, hProcessId = NULL;
        PCHAR pszProcessName = NULL;
        PVOID pFilePoint = NULL;
        POBJECT_NAME_INFORMATION pObjectNameInfo = NULL;
        // 获取父进程 PID
        hParentProcessId = PsGetProcessInheritedFromUniqueProcessId(pEProcess);
        // 获取进程 PID
        hProcessId = PsGetProcessId(pEProcess);
        // 获取进程名称
        pszProcessName = PsGetProcessImageFileName(pEProcess);
        // 获取进程程序路径
        status = PsReferenceProcessFilePointer(pEProcess, &pFilePoint);
        if (NT_SUCCESS(status))
        {
            status = IoQueryFileDosDeviceName(pFilePoint, &pObjectNameInfo);
            if (NT_SUCCESS(status))
            {
                // 显示
                DbgPrint("PEPROCESS=0x%p, PPID=%d, PID=%d, NAME=%s, PATH=%ws\n",
                    pEProcess, hParentProcessId, hProcessId, pszProcessName, pObjectNameInfo->Name.Buffer);
            }
            ObDereferenceObject(pFilePoint);
        }    
    }
内核驱动强制结束进程:从原理到实战的安全实现 在操作系统安全与系统编程领域,进程管理是核心基础。其原理在于操作系统通过进程控制块(PCB)等内核数据结构来管理程序的执行状态和资源。当用户态API(如kill或TerminateProcess)因权限不足或进程自我保护(如Hook系统调用)而失效时,便需借助更高权限的技术手段。内核驱动运行于Ring 0特权级,能直接访问并操作EPROCESS或task_struct等进程内核对象,从而实现强制结束进程的技术价值。这在安全软件对抗恶意进程、游戏反作弊系统处理顽固外挂、以及系统级监控工具等应用场景中至关重要。 阅读详情

相关推荐

Windows内核下遍历所有进程的几种方法

Windows内核下遍历所有进程的几种方法;枚举进程;

Think88666的博客 1738

PsLookupProcessByProcessId分析

本文是在讨论枚举进程的时候产生的,枚举进程有很多方法,Ring3就是ZwQuerySystemInformation(),传入SysProcessesAndThreadsInformation这个宏,或者用CreateToolhelp32Snapshot系统快照的方式枚举进程,还用就是用WTSOpenServer这个第三方库的函数,Ring0就是进程活动链表,系统句柄表中枚举。然后就是Ps...

weixin_30892037的博客 1655

MATLAB穷举搜索方法实战:暴力求解全局最优的工程智慧

在参数优化与算法设计中,穷举搜索(Exhaustive Search Method)是一种被低估的基础方法。它通过枚举所有候选解并逐一评估,以完整的搜索空间遍历换取全局最优的确定性结果。与遗传算法、粒子群等启发式算法相比,穷举搜索不依赖随机采样和梯度信息,在搜索空间有限、目标函数非光滑或需要精确验证最优解的场景下具有不可替代的价值。其数学本质是离散化与笛卡尔积组合,复杂度随维度指数增长,因此合理设定边界和步长是关键。在实际工程中,穷举搜索广泛应用于PID参数整定、特征选择、小规模路径规划等问题,尤其在MAT

weixin_30444111的博客 123

通过EPROCESS获取进程名

上一篇写自我保护时用到了,主要是不同版本的位置不同。找了一下,发现XP和win7的情况分别如下。 1 WIN7 2 lkd> dt nt!_EPROCESS 3 +0x000 Pcb : _KPROCESS 4 +0x098 ProcessLock : _EX_PUSH_LOCK 5 +0x0a0 Cre...

weixin_30404405的博客 750

Windows内核驱动EPROCESS遍历进程模块

windows驱动 遍历进程模块

桁架 拓扑优化 matlab程序_拓扑优化在结构轻量化及板壳加筋肋最优布置的应用...

1 拓扑优化简介材料的有效利用一直都是人类追求的目标,也是许多研究领域不变的话题,并伴随着结构优化理论和方法的产生而发展。结构优化设计通常分为三个层次:(1)拓扑优化:在一个确定的连续区域内寻求结构内部非实体区域位置和数量的最佳配置,寻求结构中的构件布局及节点联结方式最优化,使结构能在满足应力、位移等约束条件下,将外载荷传递到结构支撑位置,同时使结构的某种性态指标达到最优;(2)形状优化:指在保持...

weixin_39525355的博客 1877

手把手教你R0下通过EPROCESS获取进程加载模块

在R3下获取一个进程加载的相关模块儿还是比较简单的,直接通过ToolHelp32库API就能够获取到进程关联的模块儿了,但是既然已经在R0下混了再去使用R3层的东西就没什么意义了,所以这里小悠在这里将会一部一部的介绍如何在R0下通过EPROCESS结构获取到进程加载的模块. 首先这里我们先介绍一下我们通过EPROCESS查询的大概思路 ①通过EPROCESS获取到对应的PEB结构 ②...

weixin_30767835的博客 283

STM32H750实战:如何用CubeMX配置NAND Flash时序(附常见问题排查)

本文详细解析了STM32H750通过CubeMX配置NAND Flash时序的实战技巧,包括硬件连接、时序参数计算与优化策略,以及常见问题如RGB屏幕干扰、多片选冲突的解决方案。特别针对NAND Flash的时序配置和抗干扰设计提供了实用代码示例和优化建议,帮助开发者提升系统稳定性和性能。

weixin_29176179的博客 363

6.1 KMP算法搜索机器码

KMP算法是一种高效的字符串匹配算法,它的核心思想是利用已经匹配成功的子串前缀的信息,避免重复匹配,从而达到提高匹配效率的目的。KMP算法的核心是构建模式串的前缀数组Next,Next数组的意义是:当模式串中的某个字符与主串中的某个字符失配时,Next数组记录了模式串中应该回退到哪个位置,以便继续匹配。Next数组的计算方法是找出模式串每一个前缀中最长的相等前缀和后缀,并记录下来它们的长度,作为Next数组中的对应值。在字符串匹配时,KMP算法从主串和模式串的开头开始逐个字符比较,若发现匹配失败,则根据

微软技术分享 1万+

Isaac Sim 6 利用Replicator实现高效语义分割与实例分割(实践指南5.10)

本文详细介绍了如何利用Isaac Sim 6的Replicator工具高效生成语义分割和实例分割数据集。通过虚拟环境自动标注,效率提升20倍以上,特别适用于农业机器人等计算机视觉项目。文章包含环境配置、场景构建、批量标注技巧及实例分割处理等实战指南,帮助开发者快速掌握合成数据生成技术。

weixin_42526415的博客 266

Agentic RAG:RAG从静态到具有理解、推理、决策的Agentic RAG

RAG技术演进:从静态检索到智能代理 RAG(检索增强生成)技术经历了五个关键发展阶段:基础RAG(关键词检索)、高级RAG(语义理解)、模块化RAG(灵活架构)、图RAG(知识图谱)和最新的Agentic RAG(智能代理)。Agentic RAG通过引入自主AI代理,具备反思、规划、工具使用和多代理协作能力,实现了动态决策和自适应工作流。相比传统RAG的静态检索流程,Agentic RAG能处理复杂多步推理任务,通过自我改进机制提高输出质量,并支持多专业代理协作,显著提升了RAG系统在复杂场景下的表现。

2536

ring0级暴力搜索内存检测系统隐藏进程(或Rootkit)

#include //EPROCESS结构大小,我的系统是XP SP3,所以0x260,不过经过测试,这里设置成比实际EPROCESS小也是没问题的 #define EPROCESS_SIZE 0x260 #define PEB_OFFSET 0x1B0 //PEB偏移,下面就不注释了 #define FILE_NAME_OFFS

坦然 1204

基于matlab的CNN手写数字图像矫正系统

CNN 是一款强大的图像特征抽象和提取工具,常用于图像分类识别,并取得了较为理想的效果。我们通过 MATLAB 可以方便地设计不同结构、不同深度的 CNN 进行图像分类,最后一层一般设置为分类层(ClassificationLayer)进行类别标签的输出。如果我们将最后一层设计为回归层(RegressionLayer),则可以将其应用于对连续数据的预测,这对于曲线拟合、预测分析都有重要的意义。% 自定义 CNN 回归网络结构layers = [% 输入% 卷积% 池化% 池化% 卷积。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 675

算法提高路线图:从暴力枚举、剪枝到KMP、PID的进阶路径

算法学习中,从暴力枚举到剪枝优化,是构建复杂问题解决能力的关键路径。暴力枚举作为所有搜索与优化算法的基准线,能帮助建立时空复杂度直觉;而剪枝与A*等启发式策略,则通过限制无效分支,让“傻搜”变成“智搜”。类似地,KMP与匈牙利算法分别以next数组与增广路径复用已算信息,这种思维贯穿字符串匹配、图论匹配乃至推荐系统。与此同时,工业界的PID控制、粒子群优化,则展示了算法在不确定系统中的闭环调参与黑箱寻优价值。面对2026年算法提高诉求,与其收藏热词,不如按“搜索—图论—领域专项”的路线逐层深入,让每个算法都

weixin_42614269的博客 261

从 ABAP 视角看 JSON :7.40 版本带来的那些改变

摘要:ABAP 对 JSON 的原生支持 随着企业系统与外部 API 的交互增多,ABAP 从 NetWeaver 7.40 开始原生支持 JSON 格式。通过复用现有 XML 基础设施,ABAP 团队引入 JSON-XML 概念,使用 sXML Library 和 IF_SXML=>CO_XT_JSON 常量处理 JSON 数据。开发人员可通过 CALL TRANSFORMATION 语句实现 ABAP 数据与 JSON 的双向转换,大幅简化了与外部系统的数据交互。这种标准化的 JSON 处理方式提

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 180

Android 13.0 framework默认沉浸式导航栏功能实现

​ 在13.0的系统rom定制化开发中,在实现导航栏的某些定制化开发中,在某些产品需要实现沉浸式导航栏,就是需要app 能全屏显示同样也能显示导航栏,接下来就来分析下相关的功能实现 ​

安卓兼职framework和app工程师的博客 467

剑指Offer--024-二叉搜索树的后序遍历序列

链接 牛客OJ:二叉搜索树的后序遍历序列 九度OJ:http://ac.jobdu.com/problem.php?pid=1367 GitHub代码: 024-二叉搜索树的后序遍历序列 优快云题解:剑指Offer–024-二叉搜索树的后序遍历序列 牛客OJ 九度OJ 优快云题解 GitHub代码 二叉搜索树的后序遍历序列 1523-二叉搜索

OSKernelLAB(gatieme) 2192

地平线J6的基础简介

地平线J6M芯片:面向中阶辅助驾驶市场的高性价比芯片

weixin_43084908的博客 4449

Windows内核驱动中枚举进程的几种方式

枚举进程,本质上是在遍历系统公开的链表索引;而进程隐藏技术做的,正是从该索引中把自己移除——所以它天然受到欺骗。想要在驱动中做对抗检测,就必须绕过链表,直接从内核更底层的句柄表()或内存池中扫描EPROCESS特征。

静下心来,做好每一件事 249

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

QUTOJ 飘飘和小石(简单搜索+暴力)

题目连接:http://115.28.203.224/problem.php?cid=1012&pid=2 解题思路: 如图所示,石凳是首尾相接的。从石凳1开始,按照题目要求走石凳。用暴力的方法,定义一个vis[]数组进行标记,如果遍历完发现存在没有走过的石凳,输出NO;否则YES。

coco_astrids的博客 409

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

PID参数搜索算法:从网格搜索到粒子群优化,告别调参玄学

PID控制器作为自动化控制领域的基石,其参数整定是影响系统性能的关键。传统手动调参依赖经验,效率低下且难以应对非线性、时变系统。PID参数搜索算法(PSA)将参数整定转化为优化问题,通过定义代价函数(如ISE、IAE、ITAE)量化系统性能,并利用搜索算法在参数空间中自动寻优。这一方法不仅提升了工程效率,更深化了对参数与系统动态关系的量化理解。在Matlab/Simulink平台上,可以从基础的网格搜索、梯度下降法入手,再进阶到粒子群优化(PSO)等全局搜索算法,实现从仿真到实物的科学调参。

weixin_30266885的博客 334

NYOJ(680),摘枇杷,(暴力,或者二分搜索)

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=680 很巧妙的一个题目,就是看你的逆向思维,result 一定是max(a[i])~sum中的一个数,然后遍历他,网上说可以二分,感觉完全没有必要,暴力也可,我都写了一下。 #include <stdio.h> int a[1010]; int n,m; ...

weixin_34244102的博客 116

hdu 1496 Equations (暴力+hash)

题目意思: http://acm.hdu.edu.cn/showproblem.php?pid=1496 对于方程a*x1^2+b*x2^2+c*x3^2+d*x4^2=0,给出a,b,c,d,求出有多少种方法使得方程成立,xi!=0,属于[-100,100] a,b,c,d也不为0,属于[-50,50]. Sample Input 1 2 3 -4 1 1 1 1  

机器笨猫 994
上一篇: 枚举系统中的各种回调
下一篇: HOOK SSDT,获取 SSDT 函数地址
(-: LYSM :-)
博客等级 码龄10年 428粉丝 273原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值