熱點推薦:
您现在的位置: 電腦知識網 >> 操作系統 >> Windows系統管理 >> 正文

詳談進程與端口的映射

2013-11-11 21:41:16  來源: Windows系統管理 

  關於進程與端口映射的文章已經有很多了我把我對fport的分析也寫出來讓大家知道fport是如何工作的fportexe是由foundstone team出品的免費軟件可以列出系統中所有開放的端口都是由那些進程打開的而下面所描述的方法是基於fport v如果和你機器上的fport有出入請檢查fport版本
  
  首先它檢測當前用戶是否擁有管理員權限(通過讀取當前進程的令牌可知當前用戶是否具有管理權限請參考相關歷程)如果沒有打印一句提示後退出然後設置當前進程的令牌接著用ZwOpenSection函數打開內核對象\Device\PhysicalMemory這個對象用於對系統物理內存的訪問ZwOpenSection函數的原型如下:
  
  NTSYSAPI
  NTSTSTUS
  NTAPI
  ZwOpenSection(
   Out PHANDLE sectionHandle
   IN ACCESS_MASK DesiredAccess
   IN POBJECT_ATTRIBUTES ObjectAttributes
   }
  (見ntddkh)
  
  第一個參數得到函數執行成功後的句柄
  第二個參數DesiredAccess為一個常數可以是下列值:
   #define SECTION_QUERY x
   #define SECTION_MAP_WRITEx
   #define SECTION_MAP_READ x
   #define SECTION_MAP_EXECUTE x
   #define SECTION_EXTEND_SIZE x
  
   #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY| SECTION_MAP_WRITE | SECTION_MAP_READ | SECTION_MAP_EXECUTE | SECTION_EXTEND_SIZE)
   (見ntddkh)
  第三個參數是一個結構包含要打開的對象類型等信息結構定義如下:
   typedef struct _OBJECT_ATTRIBUTES {
   ULONG Length
   HANDLE RootDirectory
   PUNICODE_STRING ObjectName
   ULONG Attributes
   PVOID SecurityDescriptor // Points to type SECURITY_DESCRIPTOR
   PVOID SecurityQualityOfService // Points to type SECURITY_QUALITY_OF_SERVICE
   } OBJECT_ATTRIBUTES
   typedef OBJECT_ATTRIBUTES *POBJECT_ATTRIBUTES
   (見ntdefh)
  對於這個結構的初始化用一個宏完成:
   #define InitializeObjectAttributes( p n a r s ) {  (p)>Length = sizeof( OBJECT_ATTRIBUTES )  (p)>RootDirectory = r  (p)>Attributes = a  (p)>ObjectName = n  (p)>SecurityDescriptor = s (p)>SecurityQualityOfService = NULL }
   (見ntdefh)
  那麼打開內核對象\Device\PhysicalMemory的語句如下:
  WCHAR PhysmemName[] = L\\Device\\PhysicalMemory
  void * pMapPhysicalMemory
  HANDLE pHandle
  
  bool OpenPhysicalMemory()
  {
   NTSTATUS status
   UNICODE_STRING physmemString
   OBJECT_ATTRIBUTES attributes
   RtlInitUnicodeString( &physmemString PhysmemName ) //初始化Unicode字符串函數原型見ntddkh
   InitializeObjectAttributes( &attributes &physmemString
  OBJ_CASE_INSENSITIVE NULL NULL ) //初始化OBJECT_ATTRIBUTES結構
   status = ZwOpenSection(pHandle SECTION_MAP_READ &attributes ) //打開內核對象\Device\PhysicalMemory獲得句柄
   if( !NT_SUCCESS( status ))
   return false
   pMapPhysicalMemory=MapViewOfFile(pHandleFILE_MAP_READ
  xx)
   //從內存地址x開始映射x個字節
   if( GetLastError()!=)
   return false
   return true
  }
  
   為什麼要從x開始映射呢是這樣我們知道在Windows NT/系統分為內核模式和用戶模式也就是我們所說的Ring和Ring在Windows NT/我們所能夠看到的進程都運行在Ring一般情況下系統進程(也就是System進程)的頁目錄(PDE)所在物理地址地址為x或者說系統中最小的頁目錄所在的物理地址為x而頁目錄(PDE)由項組成每項均指向一頁表(PTE)每一頁表也由個頁組成而每頁的大小為K*=(x)所以上面從物理地址x開始映射了x個字節(具體描述見WebCrazy的文章<<小議Windows NT/的分頁機制>>)
  
   程序打開打開內核對象\Device\PhysicalMemory後繼續用函數ZwOpenFile打開內核對象\Device\Tcp和Device\UdpZwOpenFile
  函數的原型如下:
  NTSYSAPI
  NTSTATUS
  NTAPI
  ZwOpenFile(
   OUT PHANDLE FileHandle
   IN ACCESS_MASK DesiredAccess
   IN POBJECT_ATTRIBUTES ObjectAttributes
   OUT PIO_STATUS_BLOCK IoStatusBlock
   IN ULONG ShareAccess
   IN ULONG OpenOptions
   )
  (見ntddkh)
  
  第一個參數返回打開對象的句柄
  第二個參數DesiredAccess為一個常數可以是下列值:
   #define FILE_READ_DATA( x ) // file & pipe
   #define FILE_LIST_DIRECTORY ( x ) // directory
   #define FILE_WRITE_DATA ( x ) // file & pipe
   #define FILE_ADD_FILE ( x ) // directory
   #define FILE_APPEND_DATA ( x ) // file
   #define FILE_ADD_SUBDIRECTORY ( x ) // directory
   #define FILE_CREATE_PIPE_INSTANCE ( x ) // named pipe
   #define FILE_READ_EA ( x ) // file & directory
   #define FILE_WRITE_EA ( x ) // file & directory
   #define FILE_EXECUTE ( x ) // file
   #define FILE_TRAVERSE ( x ) // directory
   #define FILE_DELETE_CHILD( x ) // directory
   #define FILE_READ_ATTRIBUTES( x ) // all
   #define FILE_WRITE_ATTRIBUTES ( x ) // all
   #define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | xFF)
   #define FILE_GENERIC_READ(STANDARD_RIGHTS_READ |FILE_READ_DATA |FILE_READ_ATTRIBUTES |FILE_READ_EA |SYNCHRONIZE)
   #define FILE_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |FILE_WRITE_DATA |FILE_WRITE_ATTRIBUTES |FILE_WRITE_EA|FILE_APPEND_DATA|SYNCHRONIZE)
   #define FILE_GENERIC_EXECUTE(STANDARD_RIGHTS_EXECUTE |FILE_READ_ATTRIBUTES |FILE_EXECUTE |SYNCHRONIZE)
   (見ntdefh)
  第三個參數是一個結構包含要打開的對象類型等信息結構定義見上面所述
  第四個參數返回打開對象的屬性是一個結構定義如下:
   typedef struct _IO_STATUS_BLOCK {
   union {
  NTSTATUS Status
  PVOID Pointer
   }
  
   ULONG_PTR Information
   } IO_STATUS_BLOCK *PIO_STATUS_BLOCK
  
   #if defined(_WIN)
   typedef struct _IO_STATUS_BLOCK {
   NTSTATUS Status
   ULONG Information
   } IO_STATUS_BLOCK *PIO_STATUS_BLOCK
   #endif
   (見ntddkh)
  第五個參數ShareAccess是一個常數可以是下列值:
   #define FILE_SHARE_READ x // winnt
   #define FILE_SHARE_WRITE x // winnt
   #define FILE_SHARE_DELETEx // winnt
   (見ntddkh)
  第六個參數OpenOptions也是一個常數可以是下列的值:
   #define FILE_DIRECTORY_FILEx
   #define FILE_WRITE_THROUGH x
   #define FILE_SEQUENTIAL_ONLY x
   #define FILE_NO_INTERMEDIATE_BUFFERING x
   #define FILE_SYNCHRONOUS_IO_ALERTx
   #define FILE_SYNCHRONOUS_IO_NONALERTx
   #define FILE_NON_DIRECTORY_FILE x
   #define FILE_CREATE_TREE_CONNECTION x
   #define FILE_COMPLETE_IF_OPLOCKEDx
   #define FILE_NO_EA_KNOWLEDGE x
   #define FILE_OPEN_FOR_RECOVERYx
   #define FILE_RANDOM_ACCESS x
   #define FILE_DELETE_ON_CLOSE x
   #define FILE_OPEN_BY_FILE_ID x
   #define FILE_OPEN_FOR_BACKUP_INTENT x
   #define FILE_NO_COMPRESSIONx
   #define FILE_RESERVE_OPFILTER x
   #define FILE_OPEN_REPARSE_POINT x
   #define FILE_OPEN_NO_RECALLx
   #define FILE_OPEN_FOR_FREE_SPACE_QUERY x
   #define FILE_COPY_STRUCTURED_STORAGEx
   #define FILE_STRUCTURED_STORAGE x
   #define FILE_VALID_OPTION_FLAGS xffffff
   #define FILE_VALID_PIPE_OPTION_FLAGSx
   #define FILE_VALID_MAILSLOT_OPTION_FLAGS x
   #define FILE_VALID_SET_FLAGS x
   (見ntddkh)
   
  那麼打開內核對象\Device\Tcp和\Device\Udp的語句如下:
  WCHAR physmemNameTcp[]=L\\Device\\TCP
  WCHAR physmemNameUdp[]=L\\Device\\UDP
  HANDLE pTcpHandle
  HANDLE pUdpHandle
  
From:http://tw.wingwit.com/Article/os/xtgl/201311/8981.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.