您的位置:首页 > 其它

修正后的SYSTEM_THREADS与SYSTEM_PROCESSES结构体

2013-08-07 16:33 429 查看
由于最近有个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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: