轉自“看雪論壇”--NtQuerySystemInformation

ProcessExplorer原理分析之句柄處理 by sucsor/RCT
1,如何獲得各進程的句柄
  使用NtQuerySystemInformation函數的SystemHandleInformation=16號功能.
  其相關結構定義如下:
  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_HANDLE_INFORMATION{
      ULONG NumberOfHandles;
      SYSTEM_HANDLE_TABLE_ENTRY_INFO Handles[1];
  } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
  該功能號獲取系統內所有進程的句柄放在Handles裏,個數由NumberOfHandles標識,
  每個句柄由UniqueProcessId來區分屬於那個不同的進程.
2,如何得到句柄的信息
  首先ProcessExploer 要打開該進程(OpenProcess),然後根據使用DuplicateHandle,將目標進程的句柄和要關閉的句柄(這不是唯一的辦法,不過PE是這樣做的)
  做爲參加傳入,得到該句柄執行體對象的在本進程內的句柄,然後通過DeviceIoControl將該句柄傳到ProcessExploer的驅動中,
  通過使用PsLookupProcessByProcessId得到進程有內核對象,然後使用KeAttachProcess函數切換到進程的上下文中,
  再通過使用ObReferenceObjectByHandle得到對象,再通過ObQueryNameString得到對象的名稱信息,根據對象的結構,還可以得到其他的相關信息,
  比如打開的句柄數和引用計數及一些訪問控制信息.
  
3,如何關閉某進程中的句柄
  如同二中提到的通過一系統的函數可以切換到進程的上下文,在該進程上下文中,即可調用ZwClose來關閉本進程的句柄,需要的參數只是句柄,
  這個句柄在第一步中已經得到.
  
4,ObQueryNameString並不是對於所有的對象都能得到名稱,對於文件對象的名稱可能需要進一步使用文件系統提供的相關函數來獲取名稱信息.

5,有誤之外請各位指正,謝謝.
ProcessExplorer逆向中,不過總體來說只要代碼思路有了,相信大家一看便知.
如果可能的話,會將代碼按部分貼出來.只是可能....:)  

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