ProcessHacker實現原理(一)
枚舉進程:調用NtQuerySystemInformation函數,第一個參數爲SystemProcessInformation(枚舉值 = 5),第二個參數返回類型SYSTEM_PROCESS_INFORMATION。原型如下:
typedef struct _SYSTEM_PROCESS_INFORMATION
{
ULONG NextEntryOffset;
ULONG NumberOfThreads;
LARGE_INTEGER WorkingSetPrivateSize; // since VISTA
ULONG HardFaultCount; // since WIN7
ULONG NumberOfThreadsHighWatermark; // since WIN7
ULONGLONG CycleTime; // since WIN7
LARGE_INTEGER CreateTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER KernelTime;
UNICODE_STRING ImageName;
KPRIORITY BasePriority;
HANDLE UniqueProcessId;
HANDLE InheritedFromUniqueProcessId;
ULONG HandleCount;
ULONG SessionId;
ULONG_PTR UniqueProcessKey; // since VISTA (requires SystemExtendedProcessInformation)
SIZE_T PeakVirtualSize;
SIZE_T VirtualSize;
ULONG PageFaultCount;
SIZE_T PeakWorkingSetSize;
SIZE_T WorkingSetSize;
SIZE_T QuotaPeakPagedPoolUsage;
SIZE_T QuotaPagedPoolUsage;
SIZE_T QuotaPeakNonPagedPoolUsage;
SIZE_T QuotaNonPagedPoolUsage;
SIZE_T PagefileUsage;
SIZE_T PeakPagefileUsage;
SIZE_T PrivatePageCount;
LARGE_INTEGER ReadOperationCount;
LARGE_INTEGER WriteOperationCount;
LARGE_INTEGER OtherOperationCount;
LARGE_INTEGER ReadTransferCount;
LARGE_INTEGER WriteTransferCount;
LARGE_INTEGER OtherTransferCount;
SYSTEM_THREAD_INFORMATION Threads[1];
} SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;
其中第一個字段NextEntryOffset代表指向下一個SYSTEM_PROCESS_INFORMATION結構的相對偏移,據此可以遍歷出系統進程鏈
枚舉模塊:調用NtQueryInformationProcess,第二個參數傳遞ProcessBasicInformation,第三個參數返回類型爲PROCESS_BASIC_INFORMATION的變量,其中的PebBaseAddress地址既是PEB的地址。
PEB中的PPEB_LDR_DATA中有三個鏈表,分別是InLoadOrderModuleList,InMemoryOrderModuleList,InInitializationOrderModuleList。遍歷第一個鏈表InLoadOrderModuleList即可獲取所有進程模塊。
枚舉線程:枚舉進程得到SYSTEM_PROCESS_INFORMATION結構體之後,其第二個字段代表當前進程的線程數,最後一個成員表示所有線程的鏈表,循環遍歷即可枚舉該進程所有線程。
枚舉服務:打開SCM管理器OpenSCManager,調用EnumServicesStatusEx枚舉服務,返回服務數量和服務信息的數組如下,遍歷即可。
typedef struct _ENUM_SERVICE_STATUS_PROCESS {
LPTSTR lpServiceName;
LPTSTR lpDisplayName;
SERVICE_STATUS_PROCESS ServiceStatusProcess;
} ENUM_SERVICE_STATUS_PROCESS, *LPENUM_SERVICE_STATUS_PROCESS;
枚舉網絡連接:從iphlpapi.dll獲取導出函數GetExtendedTcpTable和GetExtendedUdpTable,分別調用獲取到TCPV4和TCPV6以及UDPV4和UDPV6的網絡信息結構。
typedef struct {
DWORD dwNumEntries;
MIB_TCPROW_OWNER_MODULE table[ANY_SIZE];
} MIB_TCPTABLE_OWNER_MODULE, *PMIB_TCPTABLE_OWNER_MODULE;
第一個成員表示服務個數,第二個參數包含詳細網絡信息。
typedef struct _MIB_TCPROW_OWNER_MODULE {
DWORD {
DWORD dwState;
} dwState;
DWORD dwLocalAddr;
DWORD dwLocalPort;
DWORD dwRemoteAddr;
DWORD dwRemotePort;
DWORD dwOwningPid;
LARGE_INTEGER liCreateTimestamp;
ULONGLONG OwningModuleInfo[TCPIP_OWNING_MODULE_SIZE];
} MIB_TCPROW_OWNER_MODULE, *PMIB_TCPROW_OWNER_MODULE;
字段dwOwningPid表示使用該網絡連接的PID。。。
枚舉句柄:調用NtQuerySystemInformation,參數一傳遞SystemHandleInformation,返回
typedef struct _SYSTEM_HANDLE_INFORMATION
{
ULONG NumberOfHandles;
SYSTEM_HANDLE_TABLE_ENTRY_INFO Handles[1];
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
NumberOfHandles代表句柄總數。字段二聲明如下:
typedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO
{
USHORT UniqueProcessId;
USHORT CreatorBackTraceIndex;
UCHAR ObjectTypeIndex;
UCHAR HandleAttributes;
USHORT HandleValue;
PVOID Object;
ULONG GrantedAccess;
} SYSTEM_HANDLE_TABLE_ENTRY_INFO, *PSYSTEM_HANDLE_TABLE_ENTRY_INFO;
typedef struct _SYSTEM_PROCESS_INFORMATION
{
ULONG NextEntryOffset;
ULONG NumberOfThreads;
LARGE_INTEGER WorkingSetPrivateSize; // since VISTA
ULONG HardFaultCount; // since WIN7
ULONG NumberOfThreadsHighWatermark; // since WIN7
ULONGLONG CycleTime; // since WIN7
LARGE_INTEGER CreateTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER KernelTime;
UNICODE_STRING ImageName;
KPRIORITY BasePriority;
HANDLE UniqueProcessId;
HANDLE InheritedFromUniqueProcessId;
ULONG HandleCount;
ULONG SessionId;
ULONG_PTR UniqueProcessKey; // since VISTA (requires SystemExtendedProcessInformation)
SIZE_T PeakVirtualSize;
SIZE_T VirtualSize;
ULONG PageFaultCount;
SIZE_T PeakWorkingSetSize;
SIZE_T WorkingSetSize;
SIZE_T QuotaPeakPagedPoolUsage;
SIZE_T QuotaPagedPoolUsage;
SIZE_T QuotaPeakNonPagedPoolUsage;
SIZE_T QuotaNonPagedPoolUsage;
SIZE_T PagefileUsage;
SIZE_T PeakPagefileUsage;
SIZE_T PrivatePageCount;
LARGE_INTEGER ReadOperationCount;
LARGE_INTEGER WriteOperationCount;
LARGE_INTEGER OtherOperationCount;
LARGE_INTEGER ReadTransferCount;
LARGE_INTEGER WriteTransferCount;
LARGE_INTEGER OtherTransferCount;
SYSTEM_THREAD_INFORMATION Threads[1];
} SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;
其中第一個字段NextEntryOffset代表指向下一個SYSTEM_PROCESS_INFORMATION結構的相對偏移,據此可以遍歷出系統進程鏈
枚舉模塊:調用NtQueryInformationProcess,第二個參數傳遞ProcessBasicInformation,第三個參數返回類型爲PROCESS_BASIC_INFORMATION的變量,其中的PebBaseAddress地址既是PEB的地址。
PEB中的PPEB_LDR_DATA中有三個鏈表,分別是InLoadOrderModuleList,InMemoryOrderModuleList,InInitializationOrderModuleList。遍歷第一個鏈表InLoadOrderModuleList即可獲取所有進程模塊。
枚舉線程:枚舉進程得到SYSTEM_PROCESS_INFORMATION結構體之後,其第二個字段代表當前進程的線程數,最後一個成員表示所有線程的鏈表,循環遍歷即可枚舉該進程所有線程。
枚舉服務:打開SCM管理器OpenSCManager,調用EnumServicesStatusEx枚舉服務,返回服務數量和服務信息的數組如下,遍歷即可。
typedef struct _ENUM_SERVICE_STATUS_PROCESS {
LPTSTR lpServiceName;
LPTSTR lpDisplayName;
SERVICE_STATUS_PROCESS ServiceStatusProcess;
} ENUM_SERVICE_STATUS_PROCESS, *LPENUM_SERVICE_STATUS_PROCESS;
枚舉網絡連接:從iphlpapi.dll獲取導出函數GetExtendedTcpTable和GetExtendedUdpTable,分別調用獲取到TCPV4和TCPV6以及UDPV4和UDPV6的網絡信息結構。
typedef struct {
DWORD dwNumEntries;
MIB_TCPROW_OWNER_MODULE table[ANY_SIZE];
} MIB_TCPTABLE_OWNER_MODULE, *PMIB_TCPTABLE_OWNER_MODULE;
第一個成員表示服務個數,第二個參數包含詳細網絡信息。
typedef struct _MIB_TCPROW_OWNER_MODULE {
DWORD {
DWORD dwState;
} dwState;
DWORD dwLocalAddr;
DWORD dwLocalPort;
DWORD dwRemoteAddr;
DWORD dwRemotePort;
DWORD dwOwningPid;
LARGE_INTEGER liCreateTimestamp;
ULONGLONG OwningModuleInfo[TCPIP_OWNING_MODULE_SIZE];
} MIB_TCPROW_OWNER_MODULE, *PMIB_TCPROW_OWNER_MODULE;
字段dwOwningPid表示使用該網絡連接的PID。。。
枚舉句柄:調用NtQuerySystemInformation,參數一傳遞SystemHandleInformation,返回
typedef struct _SYSTEM_HANDLE_INFORMATION
{
ULONG NumberOfHandles;
SYSTEM_HANDLE_TABLE_ENTRY_INFO Handles[1];
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
NumberOfHandles代表句柄總數。字段二聲明如下:
typedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO
{
USHORT UniqueProcessId;
USHORT CreatorBackTraceIndex;
UCHAR ObjectTypeIndex;
UCHAR HandleAttributes;
USHORT HandleValue;
PVOID Object;
ULONG GrantedAccess;
} SYSTEM_HANDLE_TABLE_ENTRY_INFO, *PSYSTEM_HANDLE_TABLE_ENTRY_INFO;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.