修正后的SYSTEM_THREADS与SYSTEM_PROCESSES结构体
由于最近有个32位程序需要向64位系统移植,其中程序中使用了ZwQuerySystemInformation函数来枚举系统中的进程与线程信息,但是移植后的程序在Windows x64下工作不正常。现象是获取到的进程/线程信息混乱,不正确。通过查询WRK以及Win2k源码,将结构体中的成员进行了修改,最终编译出的程序可以正常显示。
由于ZwQuerySystemInformation属于Windows的未文档化函数,网络上可以搜索到的结构体都是基于Win32下逆向得到的,因此可能有些偏差。
最明显的问题就是HANDLE与ULONG的区别。在Windows下,HANDLE类型被定义为typedef HANDLE PVOID * 。在32位平台下,sizeof(HANDLE) == sizeof(ULONG) == 4,因此可能是当时逆向的人没有多想就把HANDLE类型写成了ULONG类型,这样写在32位平台下是不会出错的,但是到了64位平台下,HANDLE类型就变成了8字节,而ULONG类型在编译器中被定义为ULONG32类型即32位无符号整数,造成了结构体内成员偏移的偏差。
在Windows下,进程ID是HANDLE类型表示的,而不是ULONG类型。在平台移植的时候是需要注意的!因为太多人喜欢把进程ID用ULONG类型进行表示了
typedef struct _SYSTEM_THREADS
{
LARGE_INTEGER KernelTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER CreateTime;
ULONG WaitTime;
PVOID StartAddress;
CLIENT_ID ClientID;
KPRIORITY Priority;
KPRIORITY BasePriority;
ULONG ContextSwitchCount;
ULONG ThreadState;
KWAIT_REASON WaitReason;
ULONG Reserved; //Add
}SYSTEM_THREADS,*PSYSTEM_THREADS;
typedef struct _SYSTEM_PROCESSES
{
ULONG NextEntryDelta;
ULONG ThreadCount;
ULONG Reserved[6];
LARGE_INTEGER CreateTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER KernelTime;
UNICODE_STRING ProcessName;
KPRIORITY BasePriority;
HANDLE ProcessId; //Modify
HANDLE InheritedFromProcessId;//Modify
ULONG HandleCount;
ULONG SessionId;
ULONG_PTR PageDirectoryBase;
VM_COUNTERS VmCounters;
SIZE_T PrivatePageCount;//Add
IO_COUNTERS IoCounters; //windows 2000 only
struct _SYSTEM_THREADS Threads[1];
}SYSTEM_PROCESSES,*PSYSTEM_PROCESSES;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了