Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Windows Kennel-通过名字查进程EPROCESS

Windows Kennel-通过名字查进程EPROCESS

原创
作者头像
franket
发布于 2020-05-10 05:31:14
发布于 2020-05-10 05:31:14
13.4K00
代码可运行
举报
文章被收录于专栏:技术杂记技术杂记
运行总次数:0
代码可运行

1.先通过ActiveProcessLinks遍历

2.设置桩点,保证循环一遍就结束

3.通过PsGetProcessImageFileName来获取名字

代码如下:

代码语言:c
代码运行次数:0
运行
AI代码解释
复制
UCHAR *PsGetProcessImageFileName(__in PEPROCESS eprocess);//导出下使用.
NTSTATUS LookupProcessByName(IN PCHAR pcProcessName,
							 OUT PEPROCESS *pEprocess)
{
	PEPROCESS pCurEprocess = NULL;
	PEPROCESS pNextEprocess = NULL;//做为一个标记,表示循环了一圈
	PLIST_ENTRY	pListActiveProcess = NULL;
	ULONG offset = 0;//ActiveProcessLinks的偏移值
	ULONG uLoopNum = 0;//查找的循环次数
	RTL_OSVERSIONINFOEXW osver = {sizeof(RTL_OSVERSIONINFOEXW)};
	char *lpszAttackProName = NULL;
 
 
	if (!ARGUMENT_PRESENT(pcProcessName)
		||!ARGUMENT_PRESENT(pEprocess))
	{
		KdPrint(("[LookupProcessByName]--invalid para\n"));
		return STATUS_INVALID_PARAMETER;
	}
 
	if (KeGetCurrentIrql()>PASSIVE_LEVEL)
	{
		KdPrint(("[LookupProcessByName]--invalid irql\n"));
		return STATUS_UNSUCCESSFUL;
	}
 
	if (STATUS_SUCCESS != RtlGetVersion((PRTL_OSVERSIONINFOW)&osver))
	{
		KdPrint(("[LookupProcessByName]--RtlGetVersion fail\n"));
		return STATUS_UNSUCCESSFUL;
	}
 
	// 仅对xp测试,自己扩展
	if (5 == osver.dwMajorVersion
		&&1 == osver.dwMinorVersion)
	{
		offset = 0x88;//可通过windbg查看eprocess中的偏移
	}
 
	if (0 == offset)
	{
		KdPrint(("[LookupProcessByName]--unknow os\n"));
		return STATUS_UNSUCCESSFUL;
	}
 
	// 遍历链表查询
	pCurEprocess = PsGetCurrentProcess();
	pNextEprocess = pCurEprocess;
 
	__try
	{
		while (TRUE)
		{
			// TODO.做想做的事吧...
			lpszAttackProName = (char *)PsGetProcessImageFileName(pCurEprocess);
			if (lpszAttackProName
				&& strlen(lpszAttackProName) == strlen(pcProcessName))
			{
				if (0 == _stricmp(lpszAttackProName, pcProcessName))
				{
					KdPrint(("[LookupProcessByName]--find\n"));
					*pEprocess = pCurEprocess;
					return STATUS_SUCCESS;
				}
			}
 
 
			//出口
			if (uLoopNum>=1
				&&pNextEprocess == pCurEprocess)
			{
				KdPrint(("[LookupProcessByName]--loop end\n"));
				*pEprocess = 0x00000000;
				return STATUS_NOT_FOUND;
			}
 
			pListActiveProcess = (PLIST_ENTRY)((ULONG)pCurEprocess+offset);//注意大括号,不用大括号会出错的
			(ULONG)pCurEprocess = (ULONG)pListActiveProcess->Flink;//pCurEprocess临时表示了前一个Active process
			(ULONG)pCurEprocess = (ULONG)pCurEprocess - offset;//对应的Eprocess基址
			KdPrint(("[LookupProcessByName]--pCurEprocess:%08x\n", pCurEprocess));
			uLoopNum ++;//循环次数+1
 
		}
 
	}
	__except(EXCEPTION_EXECUTE_HANDLER)
	{
		KdPrint(("[LookupProcessByName]--execption:%08x--end\n", GetExceptionCode()));
		*pEprocess = 0x00000000;
		return STATUS_NOT_FOUND;
	}
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
暂无评论
推荐阅读
编辑精选文章
换一批
windows内核代码之进程操作
内核中记录进程的结构体是EPROCESS结构.所以只需要遍历这个结构即可.标准方法可以使用ZwQuerySystemInformation函数.使用SystemProcessInformation功能号. 另外也有很多种枚举进程的方法比如找到EPROCESS结构进行枚举的.(CPU结构体 KPCR)等等.不过兼容性都是不太好.另一种方法是枚举句柄表 PspCidTable里面有记录EPROCESS 也能检查出断链等隐藏的进程.不过缺点就是. PspCidTable并不是一个公开的变量.要活的它的地址的话.你就需要使用硬编码或者符号了.但是大家知道使用硬编码那么就不会跟着系统走了.如果想要通用那么就最好不要使用. 这里看到网上有更简单的方法. 只用使用几个公开API即可.
IBinary
2019/10/23
3.5K0
windows内核代码之进程操作
驱动开发:DKOM 实现进程隐藏
DKOM 就是直接内核对象操作技术,我们所有的操作都会被系统记录在内存中,而驱动进程隐藏的做旧就是操作进程的EPROCESS结构与线程的ETHREAD结构、链表,要实现进程的隐藏我们只需要将某个进程中的信息,在系统EPROCESS链表中摘除即可实现进程隐藏。
王 瑞
2022/12/20
5830
4.5 Windows驱动开发:实现进程数据转储
多数ARK反内核工具中都存在驱动级别的内存转存功能,该功能可以将应用层中运行进程的内存镜像转存到特定目录下,内存转存功能在应对加壳程序的分析尤为重要,当进程在内存中解码后,我们可以很容易的将内存镜像导出,从而更好的对样本进行分析,当然某些加密壳可能无效但绝大多数情况下是可以被转存的。
王 瑞
2023/11/18
2850
4.5 Windows驱动开发:实现进程数据转储
驱动开发:摘链DKOM进程隐藏
DKOM 即直接内核对象操作,我们所有的操作都会被系统记录在内存中,而驱动进程隐藏就是操作进程的EPROCESS结构与线程的ETHREAD结构、链表,要实现进程的隐藏我们只需要将某个进程中的信息,在系统EPROCESS链表中摘除即可实现进程隐藏。
王 瑞
2022/11/20
5290
驱动开发:内核中枚举进线程与模块
内核枚举进程使用PspCidTable 这个未公开的函数,它能最大的好处是能得到进程的EPROCESS地址,由于是未公开的函数,所以我们需要变相的调用这个函数,通过PsLookupProcessByProcessId函数查到进程的EPROCESS,如果PsLookupProcessByProcessId返回失败,则证明此进程不存在,如果返回成功则把EPROCESS、PID、PPID、进程名等通过DbgPrint打印到屏幕上。
王 瑞
2022/12/28
6040
驱动开发:内核中枚举进线程与模块
驱动开发:内核中实现Dump进程转储
多数ARK反内核工具中都存在驱动级别的内存转存功能,该功能可以将应用层中运行进程的内存镜像转存到特定目录下,内存转存功能在应对加壳程序的分析尤为重要,当进程在内存中解码后,我们可以很容易的将内存镜像导出,从而更好的对样本进行分析,当然某些加密壳可能无效但绝大多数情况下是可以被转存的。
王 瑞
2022/12/28
1K0
驱动开发:内核中实现Dump进程转储
4.2 Windows驱动开发:内核中进程线程与模块
内核进程线程和模块是操作系统内核中非常重要的概念。它们是操作系统的核心部分,用于管理系统资源和处理系统请求。在驱动安全开发中,理解内核进程线程和模块的概念对于编写安全的内核驱动程序至关重要。
王 瑞
2023/11/17
5370
4.2 Windows驱动开发:内核中进程线程与模块
驱动开发:内核中枚举进线程与模块
内核枚举进程使用PspCidTable 这个未公开的函数,它能最大的好处是能得到进程的EPROCESS地址,由于是未公开的函数,所以我们需要变相的调用这个函数,通过PsLookupProcessByProcessId函数查到进程的EPROCESS,如果PsLookupProcessByProcessId返回失败,则证明此进程不存在,如果返回成功则把EPROCESS、PID、PPID、进程名等通过DbgPrint打印到屏幕上。
王 瑞
2022/12/20
6330
驱动开发:内核中枚举进线程与模块
驱动开发:内核中实现Dump进程转储
多数ARK反内核工具中都存在驱动级别的内存转存功能,该功能可以将应用层中运行进程的内存镜像转存到特定目录下,内存转存功能在应对加壳程序的分析尤为重要,当进程在内存中解码后,我们可以很容易的将内存镜像导出,从而更好的对样本进行分析,当然某些加密壳可能无效但绝大多数情况下是可以被转存的。
王 瑞
2022/11/18
7180
驱动开发:内核中实现Dump进程转储
apc启动新进程
http://www.codeproject.com/Articles/13572/Starting-a-Process-from-KernelMode
战神伽罗
2019/11/21
1.4K0
7.1 Windows驱动开发:内核监控进程与线程回调
在前面的文章中LyShark一直在重复的实现对系统底层模块的枚举,今天我们将展开一个新的话题,内核监控,我们以监控进程线程创建为例,在Win10系统中监控进程与线程可以使用微软提供给我们的两个新函数来实现,此类函数的原理是创建一个回调事件,当有进程或线程被创建或者注销时,系统会通过回调机制将该进程相关信息优先返回给我们自己的函数待处理结束后再转向系统层。
王 瑞
2023/11/22
5690
7.1 Windows驱动开发:内核监控进程与线程回调
Windows内核驱动EPROCESS遍历进程模块
包含的头文件 #include <ntifs.h> #include <ntstrsafe.h> 声明的API函数 NTKERNELAPI HANDLE PsGetProcessInheritedFromUniqueProcessId(IN PEPROCESS Process); NTKERNELAPI PPEB_EX PsGetProcessPeb(PEPROCESS Process); NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(HANDLE I
战神伽罗
2019/11/15
4.4K0
驱动开发:内核监控进程与线程回调
在前面的文章中LyShark一直在重复的实现对系统底层模块的枚举,今天我们将展开一个新的话题,内核监控,我们以监控进程线程创建为例,在Win10系统中监控进程与线程可以使用微软提供给我们的两个新函数来实现,此类函数的原理是创建一个回调事件,当有进程或线程被创建或者注销时,系统会通过回调机制将该进程相关信息优先返回给我们自己的函数待处理结束后再转向系统层。
王 瑞
2022/11/14
4770
驱动开发:内核监控进程与线程回调
基于PEB断链实现进程/模块隐藏
断链这种技术非常古老,同时应用于非常多的场景,在内核层如果我们需要隐藏一个进程的内核结构体,也会使用这种技术。本文基于PEB断链在用户层和内核层分别进行实现,在用户层达到的效果主要是dll模块的隐藏,在内核层达到的效果主要是进程的隐藏。
红队蓝军
2022/03/18
2.3K1
基于PEB断链实现进程/模块隐藏
Ring0 注入 Ring3 的一种新方法
/*************************************************************************************** * * 作者: Fypher [nmn714@163.com] * http://hi.baidu.com/nmn714 * * 时间: 2009/12/29 * * 模块: InjectRing3.c [sys module] * * 平台: Windows XP SP2 * *
战神伽罗
2019/11/21
1.3K0
驱动开发:内核监控进程与线程创建
监控进程的启动与退出可以使用 PsSetCreateProcessNotifyRoutineEx 来创建回调,当新进程产生时,回调函数会被率先执行,然后执行我们自己的MyCreateProcessNotifyEx函数,并在内部进行打印输出。
王 瑞
2022/12/20
9590
驱动开发:内核监控进程与线程创建
驱动开发:内核RIP劫持实现DLL注入
本章将探索内核级DLL模块注入实现原理,DLL模块注入在应用层中通常会使用CreateRemoteThread直接开启远程线程执行即可,驱动级别的注入有多种实现原理,而其中最简单的一种实现方式则是通过劫持EIP的方式实现,其实现原理可总结为,挂起目标进程,停止目标进程EIP的变换,在目标进程开启空间,并把相关的指令机器码和数据拷贝到里面去,然后直接修改目标进程EIP使其强行跳转到我们拷贝进去的相关机器码位置,执行相关代码后,然后再次跳转回来执行原始指令集。
王 瑞
2023/10/11
1.2K0
驱动开发:内核RIP劫持实现DLL注入
驱动开发:内核RIP劫持实现DLL注入
本章将探索内核级DLL模块注入实现原理,DLL模块注入在应用层中通常会使用CreateRemoteThread直接开启远程线程执行即可,驱动级别的注入有多种实现原理,而其中最简单的一种实现方式则是通过劫持EIP的方式实现,其实现原理可总结为,挂起目标进程,停止目标进程EIP的变换,在目标进程开启空间,并把相关的指令机器码和数据拷贝到里面去,然后直接修改目标进程EIP使其强行跳转到我们拷贝进去的相关机器码位置,执行相关代码后,然后再次跳转回来执行原始指令集。
王 瑞
2023/06/16
1K0
驱动开发:内核RIP劫持实现DLL注入
4.4 Windows驱动开发:内核监控进程与线程创建
当你需要在Windows操作系统中监控进程的启动和退出时,可以使用PsSetCreateProcessNotifyRoutineEx函数来创建一个MyCreateProcessNotifyEx回调函数,该回调函数将在每个进程的创建和退出时被调用。
王 瑞
2023/11/18
7530
4.4 Windows驱动开发:内核监控进程与线程创建
3.1 Windows驱动开发:内核远程堆分配与销毁
在开始学习内核内存读写篇之前,我们先来实现一个简单的内存分配销毁堆的功能,在内核空间内用户依然可以动态的申请与销毁一段可控的堆空间,一般而言内核中提供了ZwAllocateVirtualMemory这个函数用于专门分配虚拟空间,而与之相对应的则是ZwFreeVirtualMemory此函数则用于销毁堆内存,当我们需要分配内核空间时往往需要切换到对端进程栈上再进行操作,接下来LyShark将从API开始介绍如何运用这两个函数实现内存分配与使用,并以此来作为驱动读写篇的入门知识。
王 瑞
2023/11/16
2800
3.1 Windows驱动开发:内核远程堆分配与销毁
相关推荐
windows内核代码之进程操作
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验