原文发表于百度空间,2008-10-15
==========================================================================

很古老的东西了,写一写,权当练手吧.
本来以为没什么难度,很科普很傻瓜的东西,但是写的时候还是遇到一些问题,进程信息正确,得到的线程信息总是不正确,后来分析了一下,发现这个ntdll sdk中定义的进程信息结构和线程信息结构都有点问题,可能它是来自《Win2000 Native API》一书,不适用于Windows XP。后来参考WRK修正了一下。线程信息结构也有问题,和WRK中的一样,但是结果仍然不正确,简单分析了一下,得出结构大小应为0x40,最终还是修正了一下,才有正确结果。
最终确定的进程结构如下:

  1. typedef struct _SYSTEM_PROCESSES {
  2. ULONG NextEntryDelta;
  3. ULONG ThreadCount;
  4. LARGE_INTEGER Reserved1[];
  5. LARGE_INTEGER CreateTime;
  6. LARGE_INTEGER UserTime;
  7. LARGE_INTEGER KernelTime;
  8. UNICODE_STRING ProcessName;
  9. KPRIORITY BasePriority;
  10. ULONG ProcessId;
  11. ULONG InheritedFromProcessId;
  12. ULONG HandleCount;
  13. ULONG SessionId;
  14. ULONG_PTR PageDirectoryBase;
  15. VM_COUNTERS VmCounters;
  16. ULONG PrivatePageCount;// add by achillis
  17. IO_COUNTERS IoCounters;
  18. SYSTEM_THREADS Threads[];
  19. } SYSTEM_PROCESSES, *PSYSTEM_PROCESSES;

线程信息结构如下:

  1. typedef struct _SYSTEM_THREADS{
  2. LARGE_INTEGER KernelTime;
  3. LARGE_INTEGER UserTime;
  4. LARGE_INTEGER CreateTime;
  5. ULONG WaitTime;
  6. PVOID StartAddress;
  7. CLIENT_ID ClientId;
  8. KPRIORITY Priority;
  9. LONG BasePriority;
  10. ULONG ContextSwitches;
  11. ULONG ThreadState;
  12. ULONG WaitReason;
  13. ULONG Reversed;//add by achillis
  14. } SYSTEM_THREAD_INFORMATION,*PSYSTEM_THREADS;

红色部分是我增加的,也不知道到底对不对,但是目前为止在我的XP SP2上可以得到正确结果。
枚举进程和线程信息的代码如下:

  1. int ShowProcess(void)
  2. {
  3. NTSTATUS status;
  4. DWORD retlen,truelen;
  5. char *buf=NULL,*p=NULL;
  6. ANSI_STRING ansiStr;
  7. int cnt=;
  8. PSYSTEM_PROCESSES pSysProcess;
  9. PSYSTEM_THREADS pSysThread;
  10. status=ZwQuerySystemInformation(SystemProcessInformation,NULL,,&retlen);
  11. truelen=retlen;
  12. status=ZwAllocateVirtualMemory(NtCurrentProcess(),(PVOID*)&buf,,&retlen,MEM_COMMIT,PAGE_READWRITE);
  13. printf("Size of SYSTEM_THREAD:%d\n",sizeof(SYSTEM_THREADS));
  14. p=buf;
  15. status=ZwQuerySystemInformation(SystemProcessInformation,buf,truelen,&retlen);
  16. do
  17. {
  18. cnt++;
  19. pSysProcess=(PSYSTEM_PROCESSES)buf;
  20. RtlUnicodeStringToAnsiString(&ansiStr,&pSysProcess->ProcessName,TRUE);
  21. printf("Name:%s\n",ansiStr.Buffer);
  22. RtlFreeAnsiString(&ansiStr);
  23. printf("ThreadCnt:%d\t",pSysProcess->ThreadCount);
  24. printf("Priority:%d\t",pSysProcess->BasePriority);
  25. printf("PID:%4d\t",pSysProcess->ProcessId);
  26. printf("PPID:%d\n",pSysProcess->InheritedFromProcessId);
  27. printf("HandleCnt:%d\n",pSysProcess->HandleCount);
  28. //在每一项SYSTEM_PROCESS结构的最后是一个接一个的SYSTEM_THREAD结构
  29. //输出每个线程的信息
  30. if (pSysProcess->ThreadCount&&pSysProcess->ProcessId)
  31. {
  32. DWORD i=;
  33. pSysThread=pSysProcess->Threads;
  34. for (;i<pSysProcess->ThreadCount;i++)
  35. {
  36. printf("Thread[%d] StartAddr:0x%08x\t",i+,pSysThread->StartAddress);
  37. printf("TID:%d\t",pSysThread->ClientId.UniqueThread);
  38. printf("SwitchCnt:%d\n",pSysThread->ContextSwitchCount);
  39. pSysThread++;
  40. }
  41. }
  42. //若NextEntryDelta为0,则表明已结束
  43. if (pSysProcess->NextEntryDelta==)
  44. {
  45. break;
  46. }
  47. buf=buf+pSysProcess->NextEntryDelta;
  48. printf("===============================================================\n");
  49. }while ();
  50. printf("Total:%d\n",cnt);
  51. status=ZwFreeVirtualMemory(NtCurrentProcess(),(PVOID*)&p,&truelen,MEM_RELEASE);
  52. return ;
  53. }

写到这儿又想起了经典的Hook ZwQuerySystemInfoamation隐藏进程,其实SYSTEM_PROCESS结构中的NextEntryDelta作为指向下一个结构的偏移量,其作用类似于指针,使整体构成了一个单链表,要隐藏就是从链表中删除一个元素而已,简单的数据结构知识,呵呵~

【旧文章搬运】ZwQuerySystemInformation枚举进线程信息的更多相关文章

  1. 【旧文章搬运】更正一个枚举PspCidTable时的错误

    原文发表于百度空间及看雪论坛,2009-02-27 看雪论坛地址:https://bbs.pediy.com/thread-82919.htm============================= ...

  2. 【旧文章搬运】PspCidTable概述

    原文发表于百度空间,2009-03-28========================================================================== PspCi ...

  3. 【旧文章搬运】炉子给的SYSTEM_HANDLE_TYPE有点错误

    原文发表于百度空间,2008-12-03========================================================================== 今天写程序 ...

  4. 【旧文章搬运】Windows句柄表分配算法分析(一)

    原文发表于百度空间,2009-03-30========================================================================== 阅读提示: ...

  5. 【旧文章搬运】Windbg+Vmware驱动调试入门(三)---Windbg基本调试入门

    原文发表于百度空间,2009-01-09========================================================================== 这一节的内 ...

  6. 【旧文章搬运】对抗RKU的StealthCode检测

    原文发表于百度空间,2009-07-02========================================================================== 快一个月没 ...

  7. 【旧文章搬运】CsrssWalker学习笔记

    原文发表于百度空间及看雪论坛,2009-05-13 看雪论坛地址:https://bbs.pediy.com/thread-89708.htm============================= ...

  8. 【旧文章搬运】Windows句柄表分配算法分析(实验部分)

    原文发表于百度空间,2009-03-31========================================================================== 理论结合实 ...

  9. 【旧文章搬运】PspCidTable攻与防

    原文发表于百度空间,2009-03-29========================================================================== PspCi ...

随机推荐

  1. .net core mvc启动顺序以及主要部件1

    原文:.net core mvc启动顺序以及主要部件1 首先我是新人一个写这些东西也是为了增加记忆,有不对的地方请多多指教. 说回正题,打开Program.cs文件,看到在有个CrateWebHost ...

  2. ipython结合virtualenv使用

    1.virtualenv使python的开发环境相互隔离,隔离环境可以安装自己的依赖包,避免冲突 2.ipython是交互使用python变的便利 3.在virtualenv环境里使用ipython即 ...

  3. 安装ftp服务器

    Linux安装ftp组件 1  安装vsftpd组件 安装完后,有/etc/vsftpd/vsftpd.conf文件,是vsftp的配置文件. [root@bogon ~]# yum -y insta ...

  4. 深入浅出:Linux设备驱动之字符设备驱动

    一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流 ...

  5. CentOS下常用的 19 条命令

    玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因为我们只需要掌握我们最常用的命令就可以了.当然你也可以在使用时去找一下 ...

  6. Java经常使用类及其经常用法

    1.ArrayList java.util.ArrayList<E> add(E e) //插入尾部 add(int index, E element) remove(int index) ...

  7. LA4043 - Ants(二分图完备最佳匹配KM)

    option=com_onlinejudge&Itemid=8&page=show_problem&problem=2044">https://icpcarch ...

  8. bash仅仅读的环境变量

    环境变量名 变量的用途 $0 程序的名字 $1~$9 命令參数1~9的值 $* 全部命令行參数的值 $@ 全部命令行參数的值.假设$@被""包含.即"$@",这 ...

  9. Linux性能查看与分析--命令行工具介绍

    本文介绍工作中常用的几个linux性能查看命令:top,sar,vmstat,iostat,pidstat等. 1.top top是最常用的linux性能分析工具,它能够实时的显示系统中各个进程的资源 ...

  10. 光流(optical flow)和openCV中实现

    转载请注明出处! ! ! http://blog.csdn.net/zhonghuan1992 光流(optical flow)和openCV中实现 光流的概念:        是Gibson在195 ...