【旧文章搬运】ZwQuerySystemInformation枚举进线程信息
原文发表于百度空间,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枚举进线程信息的更多相关文章
- 【旧文章搬运】更正一个枚举PspCidTable时的错误
原文发表于百度空间及看雪论坛,2009-02-27 看雪论坛地址:https://bbs.pediy.com/thread-82919.htm============================= ...
- 【旧文章搬运】PspCidTable概述
原文发表于百度空间,2009-03-28========================================================================== PspCi ...
- 【旧文章搬运】炉子给的SYSTEM_HANDLE_TYPE有点错误
原文发表于百度空间,2008-12-03========================================================================== 今天写程序 ...
- 【旧文章搬运】Windows句柄表分配算法分析(一)
原文发表于百度空间,2009-03-30========================================================================== 阅读提示: ...
- 【旧文章搬运】Windbg+Vmware驱动调试入门(三)---Windbg基本调试入门
原文发表于百度空间,2009-01-09========================================================================== 这一节的内 ...
- 【旧文章搬运】对抗RKU的StealthCode检测
原文发表于百度空间,2009-07-02========================================================================== 快一个月没 ...
- 【旧文章搬运】CsrssWalker学习笔记
原文发表于百度空间及看雪论坛,2009-05-13 看雪论坛地址:https://bbs.pediy.com/thread-89708.htm============================= ...
- 【旧文章搬运】Windows句柄表分配算法分析(实验部分)
原文发表于百度空间,2009-03-31========================================================================== 理论结合实 ...
- 【旧文章搬运】PspCidTable攻与防
原文发表于百度空间,2009-03-29========================================================================== PspCi ...
随机推荐
- 《Java虚拟机原理图解》 1.2.3、Class文件中的常量池详解(下)
CONSTANT_Fieldref_info, CONSTANT_Name_Type_info) 一般而言,我们在定义类的过程中会定义一些 field 字段,然后会在这个类的其他地方(如方法中)使用到 ...
- iOS中创建自定义的圆角按钮
iOS中很多时候都需要用到指定风格的圆角按钮,尽管UIButton提供了一个方式创建圆角按钮: + (id)buttonWithType:(UIButtonType)buttonType;//指定bu ...
- 深入浅出:Linux设备驱动之字符设备驱动
一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流 ...
- 彻底理解javascript 中的事件对象的pageY, clientY, screenY的区别和联系。
说到底, pageY, clientY, screenY的计算,就是要找到参考点, 它们的值就是: 鼠标点击的点----------- 和参考点指点----------的直角坐标系的距离 stacko ...
- 改动Xmodem/Zmodem上传下载路径
SecureCRT能够使用Xmodem/Zmodem方便的上传和下载文件. 在Session ptions =>Xmodem/Zmodem => Directories中设置 选项=& ...
- Spring Boot 使用Java代码创建Bean并注冊到Spring中
从 Spring3.0 開始,添加了一种新的途经来配置Bean Definition,这就是通过 Java Code 配置 Bean Definition. 与Xml和Annotation两种配置方式 ...
- Multi-company rules
Object Name Domain 说明 Point of Sale Point Of Sale Order [('company_id', '=', user.company_id.id)] 指派 ...
- MySQL之常见问题总结
MySQL总是崩溃 首先你应该试着找出问题MySQLd守护进程是否死掉或你的问题是否与你的客户有关.你能够用MySQLadmin version检查你的MySQLdserver正常运行了多长时间.假设 ...
- HDU 3820 Golden Eggs( 最小割 奇特建图)经典
Golden Eggs Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- androidproject有红色叹号的解决方式
首先,查看SDK版本号,一般有两处.第一处是project.properties文件里的target=android-?改动成自己工程相应的SDK版本号.第二处是manifest文件里, androi ...