IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 19.遍历进程(ActiveProcessLinks / 全局句柄表) -> 正文阅读

[数据结构与算法]19.遍历进程(ActiveProcessLinks / 全局句柄表)

目录

ActiveProcessLinks?

全局句柄表


ActiveProcessLinks?

EPROCESS进程结构中成员ActiveProcessLinks双向链表指向了当前所有活动进程(断链后在任务管理器以及部分API中查询不到).

只需定位到ActiveProcessLinks成员即可实现遍历进程.

代码实现:

#include "ntifs.h"

PUCHAR PsGetProcessImageFileName(__in PEPROCESS Process);

//遍历进程
VOID TraverseProcess()
{
	//通过EPROCESS.ActiveProcessLinks双向链表循环遍历
	//通过以下几种方式定位到一个进程内核结构体
	ULONG uPid = 0;
	PUCHAR szProcessName = NULL;
	PEPROCESS pEprotemp = NULL;
	PEPROCESS pEprocess = NULL;

	//1.通过FS:[124] -> CurrentThread(_KTHREAD).Process定位当前线程所属进程的内核结构体
	//__asm
	//{
	//    //_KPCR -> _KPRCB -> CurrentThread(_KTHREAD)
	//    mov eax, fs: [0x124] 

	//    //_KTHREAD -> _KPROCESS
	//    mov eax, [eax + 0x150]
	//    mov [pEprocess], eax
	//}

	//2.通过导出变量PsInitialSystemProcess定位system进程的内核结构体
	//pEprocess = (PEPROCESS)PsInitialSystemProcess;


	//3.通过PsGetCurrentProcess定位当前线程所属进程的内核结构体
	pEprocess = PsGetCurrentProcess();

	pEprotemp = pEprocess;
	DbgPrint("pEprocess -> [0x%08x] \r\n", pEprocess);

	do
	{
		//获取PID PROCESSNAME
		uPid = *(PULONG)((PUCHAR)pEprocess + 0xb4);
		szProcessName = PsGetProcessImageFileName(pEprocess);
		DbgPrint("PID ->[%08d] ProcessName ->[%s] \r\n", uPid, szProcessName);

		//指向下一个进程PEPROCESS
		pEprocess = *(PULONG)((PUCHAR)pEprocess + 0xb8) - 0xb8;


	} while (pEprocess != pEprotemp);


}


NTSTATUS DriverUnload(PDRIVER_OBJECT pDriver)
{
	DbgPrint("Driver Exit \r\n");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pReg)
{
	DbgPrint("Driver Load \r\n");

	TraverseProcess();

	pDriver->DriverUnload = DriverUnload;
	return STATUS_SUCCESS;
}

全局句柄表

所有进程线程都会存储在全局句柄表中(后续章节讲解).通过暴力枚举获取当前活动线程.此方式可解决断链ActiveProcessLinks来隐藏进程.

代码如下:

#include "ntifs.h"

PUCHAR PsGetProcessImageFileName(__in PEPROCESS Process);

//遍历进程
VOID TraverseProcess()
{
	NTSTATUS ntstatus = NULL;
	PUCHAR szProcessName = NULL;
	PEPROCESS pEprocess = NULL;

	//通过进程PID暴力枚举
	for (size_t i = 4; i < 0x100000; i += 4)
	{
		ntstatus = PsLookupProcessByProcessId((HANDLE)i, &pEprocess);
		if (NT_SUCCESS(ntstatus))
		{
			//释放内核对应引用计次
			ObDereferenceObject(pEprocess);

			//获取进程名
			szProcessName = PsGetProcessImageFileName(pEprocess);
			DbgPrint("PID ->[%08d] ProcessName ->[%s] \r\n", i, szProcessName);
		}

	}
}


NTSTATUS DriverUnload(PDRIVER_OBJECT pDriver)
{
	DbgPrint("Driver Exit \r\n");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pReg)
{
	DbgPrint("Driver Load \r\n");

	TraverseProcess();

	pDriver->DriverUnload = DriverUnload;
	return STATUS_SUCCESS;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-16 19:05:28  更:2021-11-16 19:07:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:37:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码