修正後的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;
相關文章
- 結構體與共用體結構體
- 類與結構體結構體
- Swift 類與結構體Swift結構體
- Swift,結構體與類Swift結構體
- 指令集結構與微體系結構
- MySQL整體架構與記憶體結構MySql架構記憶體
- [Virtualization]ESXi體系結構與記憶體管理(一)體系結構記憶體
- 結構體最後的零長度陣列結構體陣列
- Structs And Interfaces「結構體與介面」Struct結構體
- Gef與MVC體系結構MVC
- C# 結構體與類的區別C#結構體
- 企業的資訊體系與資訊結構
- oracle記憶體結構與管理Oracle記憶體
- Oracle體系結構之-Oracle後臺程式Oracle
- iOS Swift結構體與類的方法排程iOSSwift結構體
- C++中結構體與類的區別C++結構體
- ios/oc中的結構體 與字串互轉iOS結構體字串
- 結構體中套用其他_結構體結構體
- 結構體的大小結構體
- MySQL體系結構與儲存引擎MySql儲存引擎
- N層結構與中介軟體(zt)
- 指標體系與樹型結構指標
- 修改vue打包後的結構Vue
- FLIP-147:支援包含結束任務的 Checkpoint 操作與作業結束流程修正
- TCP/IP協議與OSI體系結構總結TCP協議
- 合金的晶體結構與哪些因素有關
- Oracle體系結構:記憶體結構和程式結構(轉)Oracle記憶體
- 結構體結構體
- 【體系結構】SCN與checkpoint(檢查點)
- 上下文 Context 與結構體 StructContext結構體Struct
- Oracle體系結構概述與SQL解析剖析OracleSQL
- 第五章——結構體與類(序)結構體
- go結構體物件是否值得Reset然後複用??Go結構體物件
- 與物料管理結構的連結
- 與會計結構的連結
- Redis資料結構—連結串列與字典的結構Redis資料結構
- Oracle體系結構之-記憶體結構Oracle記憶體
- HDFS的體系結構