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

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

typedef struct _SYSTEM_PROCESSES {
ULONG NextEntryDelta;
ULONG ThreadCount;
LARGE_INTEGER Reserved1[];
LARGE_INTEGER CreateTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER KernelTime;
UNICODE_STRING ProcessName;
KPRIORITY BasePriority;
ULONG ProcessId;
ULONG InheritedFromProcessId;
ULONG HandleCount;
ULONG SessionId;
ULONG_PTR PageDirectoryBase;
VM_COUNTERS VmCounters;
ULONG PrivatePageCount;// add by achillis
IO_COUNTERS IoCounters;
SYSTEM_THREADS Threads[];
} SYSTEM_PROCESSES, *PSYSTEM_PROCESSES;

线程信息结构如下:

typedef struct _SYSTEM_THREADS{
LARGE_INTEGER KernelTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER CreateTime;
ULONG WaitTime;
PVOID StartAddress;
CLIENT_ID ClientId;
KPRIORITY Priority;
LONG BasePriority;
ULONG ContextSwitches;
ULONG ThreadState;
ULONG WaitReason;
ULONG Reversed;//add by achillis
} SYSTEM_THREAD_INFORMATION,*PSYSTEM_THREADS;

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

int ShowProcess(void)
{
NTSTATUS status;
DWORD retlen,truelen;
char *buf=NULL,*p=NULL;
ANSI_STRING ansiStr;
int cnt=;
PSYSTEM_PROCESSES pSysProcess;
PSYSTEM_THREADS pSysThread;
status=ZwQuerySystemInformation(SystemProcessInformation,NULL,,&retlen);
truelen=retlen;
status=ZwAllocateVirtualMemory(NtCurrentProcess(),(PVOID*)&buf,,&retlen,MEM_COMMIT,PAGE_READWRITE);
printf("Size of SYSTEM_THREAD:%d\n",sizeof(SYSTEM_THREADS));
p=buf;
status=ZwQuerySystemInformation(SystemProcessInformation,buf,truelen,&retlen);
do
{
cnt++;
pSysProcess=(PSYSTEM_PROCESSES)buf;
RtlUnicodeStringToAnsiString(&ansiStr,&pSysProcess->ProcessName,TRUE);
printf("Name:%s\n",ansiStr.Buffer);
RtlFreeAnsiString(&ansiStr);
printf("ThreadCnt:%d\t",pSysProcess->ThreadCount);
printf("Priority:%d\t",pSysProcess->BasePriority);
printf("PID:%4d\t",pSysProcess->ProcessId);
printf("PPID:%d\n",pSysProcess->InheritedFromProcessId);
printf("HandleCnt:%d\n",pSysProcess->HandleCount);
//在每一项SYSTEM_PROCESS结构的最后是一个接一个的SYSTEM_THREAD结构
//输出每个线程的信息
if (pSysProcess->ThreadCount&&pSysProcess->ProcessId)
{
DWORD i=;
pSysThread=pSysProcess->Threads;
for (;i<pSysProcess->ThreadCount;i++)
{
printf("Thread[%d] StartAddr:0x%08x\t",i+,pSysThread->StartAddress);
printf("TID:%d\t",pSysThread->ClientId.UniqueThread);
printf("SwitchCnt:%d\n",pSysThread->ContextSwitchCount);
pSysThread++;
}
}
//若NextEntryDelta为0,则表明已结束
if (pSysProcess->NextEntryDelta==)
{
break;
}
buf=buf+pSysProcess->NextEntryDelta;
printf("===============================================================\n");
}while ();
printf("Total:%d\n",cnt);
status=ZwFreeVirtualMemory(NtCurrentProcess(),(PVOID*)&p,&truelen,MEM_RELEASE);
return ;
}

写到这儿又想起了经典的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. 转:Linux字符编码方式

    首先,解释一下字符集: 汉字编码: * GB2312字集是简体字集,全称为GB2312(80)字集,共包括国标简体汉字6763个. * BIG5字集是台湾繁体字集,共包括国标繁体汉字13053个. * ...

  2. 开源天气预报api整理

    高德天气:https://lbs.amap.com/api/webservice/guide/api/weatherinfo/? github上对开源api的整理:https://github.com ...

  3. 【Mybatis】 Mybatis在xml文件中处理大于号小于号的方法【问题】

    处理大于小于号的方法: https://www.cnblogs.com/winner-0715/p/6132755.html 第一种方法:用转义字符把">"和"&l ...

  4. android开发教程之使用线程实现视图平滑滚动示例

    最近一直想做下拉刷新的效果,琢磨了好久,才走到通过onTouch方法把整个视图往下拉的步骤,接下来就是能拉下来,松开手要能滑回去啊.网上看了好久,没有找到详细的下拉刷新的例子,只有自己慢慢琢磨了.昨天 ...

  5. STM8S---选项字节(Option Byte)写操作之IO复用

    功能实现目标   通过对选项字节的写操作来实现TIM2的CH3通道的PWM输出IO复用.能够设置为PA3或者PD2输出. 通过STVP方式操作链接 选项字节   选项字节包含芯片硬件特性的配置和存储器 ...

  6. 【转】LINUX 手动建立SWAP文件及删除

    如何在红帽 企业版Linux系统中添加swap文件? 解决方法: 1. 确定swap文件的大小,单位为M.将该值乘以1024得到块大小.例如,64MB的swap文件的块大小是65536. 2. 在ro ...

  7. MBProgressHUD 显示方向异常

    一直在iphone上使用MBProgressHUD做提示信息视图.一直都没有什么问题,但用在ipad上使用时.却有时会出现显示方向不正常.如ipad屏幕是横的,但当MBProgressHUD出现时却依 ...

  8. 出现二个奇葩bug

    1.js中少了个单引號,指定的href嵌套指定的地址.单双引號混合加入的情况下一点都不好找.让人头痛的是在chrome,ie11下没有出现js报错,在IE8下报html页面第一行出错.少了个;号 2. ...

  9. HTML5已定稿:将彻底颠覆原生应用

    2007年W3C(万维网联盟)立项HTML5,直至2014年10月底.这个长达八年的规范最终正式封稿. 过去这些年.HTML5颠覆了PC互联网的格局,优化了移动互联网的体验,接下来.HTML5将颠覆原 ...

  10. IO模型:同步、异步、阻塞、非阻塞

    前言: 在Linux的网络编程中,同步IO(synchronous IO).异步IO(asynchronous IO).阻塞IO(blocking IO).非阻塞IO(non-blocking IO) ...