r0遍历系统进程方法总结

方法1: ZwQuerySystemInformation

这个方法网上一搜一大堆,不举例了

方法2:暴力枚举PID枚举进程,代码:

[cpp] view plain copy

print?

  1. NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegStr)
  2. {
  3. pDriverObj->DriverUnload = MyUnload;
  4. DbgPrint("DriverEntry...\n");
  5. //1.暴力枚举PID,枚举进程
  6. for (ULONG i = 0; i < 65535; i += 4)
  7. {
  8. SearchProcessPID(i);
  9. }
  10. return STATUS_SUCCESS;
  11. }
  12. //暴力枚举PID,枚举进程
  13. NTSTATUS SearchProcessPID(ULONG pid)
  14. {
  15. NTSTATUS status = STATUS_SUCCESS;
  16. PEPROCESS process = NULL;
  17. PUCHAR processName;
  18. status = PsLookupProcessByProcessId((HANDLE)pid, &process);
  19. processName = ExAllocatePool(NonPagedPool, sizeof(process));
  20. if (NT_SUCCESS(status))
  21. {
  22. processName = PsGetProcessImageFileName(process);
  23. DbgPrint("PID:%d,processName:%s\n", pid, processName);
  24. }

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegStr)
{

	pDriverObj->DriverUnload = MyUnload;

	DbgPrint("DriverEntry...\n");

	//1.暴力枚举PID,枚举进程
	for (ULONG i = 0; i < 65535; i += 4)
	{
		SearchProcessPID(i);
	}
	return STATUS_SUCCESS;
}
//暴力枚举PID,枚举进程
NTSTATUS SearchProcessPID(ULONG pid)
{
	NTSTATUS status = STATUS_SUCCESS;
	PEPROCESS process = NULL;
	PUCHAR processName;
	status = PsLookupProcessByProcessId((HANDLE)pid, &process);
	processName = ExAllocatePool(NonPagedPool, sizeof(process));
	if (NT_SUCCESS(status))
	{
		processName = PsGetProcessImageFileName(process);
		DbgPrint("PID:%d,processName:%s\n", pid, processName);
	}
	

方法3和方法1原理相同,枚举eprocess结构体的ActiveProcessLinks链表实现,代码如下

[cpp] view plain copy

print?

  1. //通过EPROCESS枚举进程
  2. NTSTATUS SearchProcessEPROCESS()
  3. {
  4. PEPROCESS process=NULL,firstProcess=NULL;
  5. NTSTATUS status = STATUS_SUCCESS;
  6. PLIST_ENTRY plist;
  7. process = firstProcess = PsGetCurrentProcess();
  8. do
  9. {
  10. PUCHAR ProcessNmae = NULL;
  11. ProcessNmae = PsGetProcessImageFileName(process);
  12. DbgPrint("PID:%d,ProcessName:%s\n", (HANDLE)PsGetProcessId(process), ProcessNmae);
  13. plist = (PLIST_ENTRY)((ULONG)process + ACTIVE_PROCESS_LINK);
  14. process = (PEPROCESS)((ULONG)plist->Flink - ACTIVE_PROCESS_LINK);
  15. if (process == firstProcess)
  16. {
  17. break;
  18. }
  19. } while (process != NULL);
  20. return status;
  21. }

//通过EPROCESS枚举进程
NTSTATUS SearchProcessEPROCESS()
{
	PEPROCESS process=NULL,firstProcess=NULL;
	NTSTATUS status = STATUS_SUCCESS;
	PLIST_ENTRY plist;
	process = firstProcess = PsGetCurrentProcess();
	do
	{
		PUCHAR ProcessNmae = NULL;
		ProcessNmae = PsGetProcessImageFileName(process);
		DbgPrint("PID:%d,ProcessName:%s\n", (HANDLE)PsGetProcessId(process), ProcessNmae);
		plist = (PLIST_ENTRY)((ULONG)process + ACTIVE_PROCESS_LINK);
		process = (PEPROCESS)((ULONG)plist->Flink - ACTIVE_PROCESS_LINK);
		if (process == firstProcess)
		{
			break;
		}
	} while (process != NULL);

	return status;
}

jpg 改 rar

时间: 2024-10-29 20:55:16

r0遍历系统进程方法总结的相关文章

iOS中数组遍历的方法及比较

数组遍历是编码中很常见的一种需求,我们来扒一拔iOS里面都有什么样的方法来实现,有什么特点. 因为iOS是兼容C语言的,所以C语言里面的最最常见的for循环遍历是没有问题的. 本文中用的数组是获取的系统的语言数组,大约有30多个数据,虽然还不够模拟大批量的数据,但对于方法的验证是没有问题的了. NSArray *langArray = [[NSUserDefaults standardUserDefaults] arrayForKey:@"AppleLanguages"]; 第一种方法

集合框架(一) ----------Map集合遍历的方法

import java.util.*; /** * Map集合遍历的方法 * @author Administrator * */public class Test2 { public static void main(String[] args) { Map<String,String> map=new HashMap<String,String>(); /*Java 提供两种不同的类型: * 引用类型和原始类型(或内置类型). * Int是java的原始数据类型, * Inte

笔记-ARX实体遍历DXF方法

ARX实体遍历DXF方法 a.       遍历DXF的主要依赖这两个函数: 获取ads_name: acdbGetAdsName(ads, objid) 获取DXF链表: acdbEntGet(ads) b.       另外关于返回DXF链表的结构 Restype: DXF Code,详见DXF帮助文档说明,常用的100-所属类 8-图层 Resval: DXF Code的值,这个值为Union类型,参考DXF帮助文档中的类型,例如DXF=100时为字符串,DXF=40时,为double型

java集合类遍历删除方法测试以及使用场景记录

package test0; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; /**

jsp c标签不遍历的方法

生产中遇到过不需要遍历的事情. 一般遍历必须要 <c:forEach items="${resultObj.xxx}" var="data" varStatus="status"> <c:forEach> 可是现在遍历了会变麻烦,于是就寻找不用遍历的方法. <c:if test="${resultObj.lxxx[0] == 0}">checked="checked"&l

细说数组常用遍历的方法

前言 本文主要介绍数组常见遍历方法:forEach.map.filter.find.every.some.reduce,它们有个共同点:不会改变原始数组. 一.forEach:遍历数组 var colors = ["red","blue","green"]; // ES5遍历数组方法 for(var i = 0; i < colors.length; i++){ console.log(colors[i]);//red blue green

js数组遍历的方法

前言 在工作或者学习中,我们经常处理基本数据类型,其中数组更是天天见面,js中数组遍历的方法种类众多,所以在这里,我总结了一下,准备写一写关于数组遍历的常见方法,废话少说,请少侠看代码. 测试用例 var arr = [1,2,3,4,5,6] 方法一  for 循环 for循环,也是最常见的,最简单的    for(var i=0; i<arr.length;i++){        console.log(arr[i]);    }; 方法二 for in 循环遍历数组的属性```  for

jQuery 遍历 - find() 方法

jQuery 遍历参考手册 实例 搜索所有段落中的后代 span 元素,并将其颜色设置为红色: $("p").find("span").css('color','red'); 亲自试一试 定义和用法 find() 方法获得当前元素集合中每个元素的后代,通过选择器.jQuery 对象或元素来筛选. 语法 .find(selector) 参数 描述 selector 字符串值,包含供匹配当前元素集合的选择器表达式. 详细说明 如果给定一个表示 DOM 元素集合的 jQu

jquery中object对象循环遍历的方法

一个朋友问对象如何转为数组,当我问他为啥要转得时候,他告诉我,数组可以用js循环遍历,而对象则不可以.其实呢,对象同样可以循环遍历的啊.不用转换也可以循环!说明你对js或者jquery的某些操作不是很熟练!在这里我简单介绍一下! 案例 我们看如下对象: ? 1 2 3 4 5 6 7 8 9 var data={   张三:69,   李四:72,   王五:90,   二麻子:88,   前端博客:100,   haorooms : 98,   王大壮:99 } 假如上面是后台返回的一个key