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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章