014 进程遍历

进程遍历 
  ● 枚举
    ○ Windows API
    ○ 数据库 -> 注册表来访问 -> RegQuery函数来获取
    ○ ToolHelp库
      ○ 兼容性比较好
      ○ WIndows 95 就存在
    ○ Process Startus库 EnumProcess 函数 PSAPI.DLL
  ● Tool Help Reference
    ○ Tool Help Structures
      ○ 结构体
      ○ HEAPENTRY32

 1 typedef struct tagHEAPENTRY32 {
 2   SIZE_T    dwSize;            //结构体大小
 3   HANDLE    hHandle;           //堆块句柄
 4   ULONG_PTR dwAddress;          //堆块开始的地址
 5   SIZE_T    dwBlockSize;        //堆块的大小
 6   DWORD     dwFlags;          //标志位
 7   DWORD     dwLockCount;        //不再被使用的 总是设置为0
 8   DWORD     dwResvd;          //保留位不再被使用
 9   DWORD     th32ProcessID;      //使用堆的进程的标识符。
10   ULONG_PTR th32HeapID;        //堆标识符。这不是句柄,只对工具帮助函数有意义。
11 } HEAPENTRY32, *PHEAPENTRY32;

dwFlags

Value Meaning
LF32_FIXED

固定的内存块,不可移动位置

LF32_FREE

没有被使用的内存块

LF32_MOVEABLE

可移动的内存块,可移动位置

      ○ HEAPLIST32 堆

1 typedef struct tagHEAPLIST32 {
2   SIZE_T    dwSize;          //结构体大小
3   DWORD     th32ProcessID;      //进程标识符
4   ULONG_PTR th32HeapID;        //堆标识符
5   DWORD     dwFlags;          //标志位
6 } HEAPLIST32, *PHEAPLIST32;

dwFlags

Value Meaning
HF32_DEFAULT

进程默认堆

      ○ MODULEENTRY32 模块 任何一个进程都是由多个模块

 1 typedef struct tagMODULEENTRY32 {
 2   DWORD   dwSize;                        //结构体大小
 3   DWORD   th32ModuleID;                    //这个成员不再被使用,并且总是被设置为1。
 4   DWORD   th32ProcessID;                   //模块的进程的标识符
 5   DWORD   GlblcntUsage;                   //模块的负载计数,通常不太有意义,通常等于0xFFFF。
 6   DWORD   ProccntUsage;                   //模块的负载计数,通常不太有意义,通常等于0xFFFF。
 7   BYTE    *modBaseAddr;                   //模块的基本地址在拥有过程的上下文中。
 8   DWORD   modBaseSize;                   //模块大小
 9   HMODULE hModule;                     //在拥有过程的上下文中对模块的句柄。
10   TCHAR   szModule[MAX_MODULE_NAME32 + 1];       //模块名字
11   TCHAR   szExePath[MAX_PATH];              //模块地址
12 } MODULEENTRY32, *PMODULEENTRY32;

      ○ PROCESSENTYR32 进程

 1 typedef struct tagPROCESSENTRY32 {
 2   DWORD     dwSize;              //结构体大小
 3   DWORD     cntUsage;             //这个成员不再使用,并且总是被设置为0。
 4   DWORD     th32ProcessID;          //进程标识符
 5   ULONG_PTR th32DefaultHeapID;        //这个成员不再使用,并且总是被设置为0.
 6   DWORD     th32ModuleID;           //这个成员不再使用,并且总是被设置为0.
 7   DWORD     cntThreads;            //进程启动,执行的线程数
 8   DWORD     th32ParentProcessID;      //创建这个过程的过程的标识符(它的父进程)。
 9   LONG      pcPriClassBase;         //这个过程创建的任何线程的基本优先级。
10   DWORD     dwFlags;              //这个成员不再使用,并且总是被设置为零。
11   TCHAR     szExeFile[MAX_PATH];      //进程的可执行文件的名称。要检索可执行文件的完整路径
12 } PROCESSENTRY32, *PPROCESSENTRY32;

      ○ THREADENTRY32 线程

1 typedef struct tagTHREADENTRY32 {
2   DWORD dwSize;              //结构体大小
3   DWORD cntUsage;             //这个成员不再使用,并且总是被设置为零。
4   DWORD th32ThreadID;          //线程标识符
5   DWORD th32OwnerProcessID;      //创建线程的进程的标识符。
6   LONG  tpBasePri;           //线程优先级 0最小 31最大
7   LONG  tpDeltaPri;          //这个成员不再使用,并且总是被设置为零。
8   DWORD dwFlags;            //这个成员不再使用,并且总是被设置为零。
9 } THREADENTRY32, *PTHREADENTRY32;

  ● Tool Help Function
    ○ CreateToolhelp32Snapshot          //创建当前进程快照
    ○ Heap32First                //检索由进程分配的堆的第一个块的信息。
    ○ Heap32ListFirst              //检索由指定进程分配的第一个堆的信息。
    ○ Heap32ListNext              //检索由进程分配的下一堆的信息。
    ○ Heap32Next                //检索一个进程分配的下一个堆的信息。
    ○ Module32First                //检索有关进程的第一个模块的信息。
    ○ Module32Next              //检索与进程或线程相关的下一个模块的信息。
    ○ Process32First              //检索系统快照中遇到的第一个进程的信息。
    ○ Process32Next              //检索系统快照中记录的下一个进程的信息。
    ○ Thread32First              //检索系统快照中记录的第一个线程信息
    ○ Thread32Next              //检索系统快照中记录的下一个线程信息
    ○ Toolhelp32ReadProcessMemory     //将分配给另一个进程的内存复制到应用程序提供的缓冲区。

  ● Process32First function

 1 #include <windows.h>
 2 #include <tlhelp32.h>
 3 #include <tchar.h>
 4 #include <stdio.h>
 5
 6 int main( void )
 7 {
 8     //创建系统快照
 9     HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
10     if( hProcessSnap == INVALID_HANDLE_VALUE )
11     {
12         printf("创建系统快照错误代码:%d", GetLastError());
13     }
14     PROCESSENTRY32 pe32 = {0};
15     pe32.dwSize = sizeof(PROCESSENTRY32);
16     if(!Process32First(hProcessSnap, &pe32))
17     {
18         DWORD dwError = GetLastError();
19         if(dwError == ERROR_NO_MORE_FILES)
20         {
21             //没有任何快照信息
22         }
23     }
24
25     do
26     {
27         _tprintf(TEXT("PID:%d\t"), pe32.th32ProcessID);
28         _tprintf(TEXT("File:%s\r\n"),pe32.szExeFile);
29         if(!_tcscmp(TEXT("QQ.exe"), pe32.szExeFile))
30         {
31             HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pe32.th32ProcessID);
32             if(hModuleSnap == INVALID_HANDLE_VALUE)
33             {
34             }
35             MODULEENTRY32 me32 = {0};
36             me32.dwSize = sizeof(MODULEENTRY32);
37             /*
38             if(Module32First(hModuleSnap.&me32))
39             {
40             }
41             */
42             do
43             {
44                 _tprintf(TEXT("Module Name:%s\t"), me32.szModule);
45                 _tprintf(TEXT("Module Base: 0x%x\t"),me32.modBaseAddr);
46                 _tprintf(TEXT("Module Path:%s\r\n"),me32.szExePath);
47             }
48             while(Module32Next(hModuleSnap,&me32));
49             CloseHandle(hModuleSnap);
50         }
51     }while (Process32Next(hProcessSnap,&pe32));
52     CloseHandle(hProcessSnap);
53    return 0;
54 }
时间: 2024-07-28 16:42:40

014 进程遍历的相关文章

Linux内核编程:Linux2.6内核源码解析_进程遍历 &nbsp; &nbsp; &nbsp; &nbsp;

/*     *File    : test.c   *Author  : DavidLin        *Date    : 2014-12-07pm        *Email   : [email protected] or [email protected]        *world   : the city of SZ, in China        *Ver     : 000.000.001        *history :     editor      time    

内核级进程遍历

原理 windows中,每个进程都有一个属于自己的EPROCESS结构,这个结构中包含了本程序的基本信息,并且数据中存在进程链表,通过该进程链表(双向链表)可以找到其他进程的EPROCESS 结构,所以可以借此遍历系统中的进程. 使用windbg 可以看到eprocess 的结构体,现摘录重要结构如下: lkd> dt _eprocess -r1 nt!_EPROCESS ... +0x084 UniqueProcessId : Ptr32 Void PID +0x088 ActiveProce

C语言实现windows进程遍历

#include <windows.h> #include <tlhelp32.h> //进程快照函数头文件 #include <stdio.h> int main() { int countProcess=0; //当前进程数量计数变量 PROCESSENTRY32 currentProcess; //存放快照进程信息的一个结构体 currentProcess.dwSize = sizeof(currentProcess); //在使用这个结构之前,先设置它的大小 H

利用NtQuerySystemInformation函数遍历进程,遍历线程,获取线程挂起或运行状态

版权声明:专注于计算机网络安全学习 https://blog.csdn.net/u011672712/article/details/51586030 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

零敲牛皮糖:Linux2.6内核源码解析_进程遍历

/* *File : test.c *Author : DavidLin *Date : 2014-12-07pm *Email : [email protected] or [email protected] *world : the city of SZ, in China *Ver : 000.000.001 *history : editor time do * 1)LinPeng 2014-12-07 created this file! * 2) */ #include <linux

014 进程权限

进程权限 ● 1 DOS 时代 物理内存 同一等级 内存(代码) CPU 程序可以修改操作系统的代码 造成系统的不安全 1.系统不稳定 2.毫无保密性的系统 ● 2 Win XP 出现虚拟内存 ○ 虚拟内存的存在 ○ 杜绝了修改操作系统代码的可能 ○ 无法修改操作系统的代码 ○ 出现了进程 ○ 完全封闭 ○ 开放了一些接口 ○ CreateProcess ○ 打开一个子进程 ○ 父进程拥有子进程的访问权限 ○ 必须拥有一定的权限(用户赋予的权限) ○ XP下并不完全 权限体系 ○ 管理员权限 可

内核模块遍历进程和任务队列保存到proc文件中

实现一个模块用它遍历当前进程的父进程和任务队列,并将遍历的结果输出到一个proc 文件中(遍历可以从 current 当前进程开始,父进程遍历到初始化进程,遍历任务队列可以利用 for_each_process 宏). 下面是我的内核模块的实现部分: /************************************************************ * 使用内核模块从当前进程开始先前遍历,知道找到第一个进程为止 * * 并将遍历的结果保存到proc文件中 * ******

写一个Windows上的守护进程(8)获取进程路径

写一个Windows上的守护进程(8)获取进程路径 要想守护某个进程,就先得知道这个进程在不在.我们假设要守护的进程只会存在一个实例(这也是绝大部分情形). 我是遍历系统上的所有进程,然后判断他们的路径和要守护的进程是否一致,以此来确定进程是否存在. 遍历进程大家都知道用CreateToolhelp32Snapshot系列API,但是他们最后取得的是进程exe名称,不是全路径,如果仅依靠名称就可以达到目的也就罢了,但是有的时候还是得取到全路径,这样会更靠谱一些. 那么问题来了,如何取到进程全路径

进程—进程描述符展开

进程-从进程描述符展开(一) 进程内核栈结构:union task_union 在../include/linux/sched.h中定义了如下一个联合结构用来创建内核栈空间. //../include/linux/sched.h union task_union { struct thread_info thread_info; unsigned long stack[THREAD_SIZE/sizeof(long)]; }: 线程描述符:struct thread_info 每一个进程都有一个