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

剖析Windows任務管理器開發原理與實現

2013-11-11 21:52:15  來源: Windows系統管理 

  Windows/XP內含的任務管理器(Taskmgr)相信大家都熟悉吧相比之下XP裡的要比功能更加強大返回的信息也更加的詳細不過您是否覺得還有很多希望獲得的消息沒有包含在裡面嗎?您是否覺得Windows的系統管理工具箱裡的東西太分散了嗎?下面就讓我們看看它們的開發原理並動手實現一個真正的任務管理器現在我們是調用WinAPI來實現這些功能的但是大家都說MS隱藏了太多的細節以後我們將討論更多關於Windows內核的東東
  
  可能大家對任務管理器裡最熟悉的功能要數進程管理了常常我們在懷疑中了病毒/木馬的時候都會看看任務管理器裡有沒有什麼特別的進程在運行所以進程查看器應該是一個非常重要的功能我們除了需要獲得進程的名稱外還有什麼呢?當然包括它的進程標識符(ProcessID)用戶信息(UserName)CPU使用時間(CPUTime)和存儲器的使用情況(MemoryUsage)還有它的優先權(BasePriority)CPU和Memory信息可以幫助我們分析進程的運行情況而優先權可以表示進程在CPU分配處理器使用時的優先情況這些都是通用的進程信息讓我們再看看其他的信息吧進程的父進程標識符(Parent Process ID)創建時間(Create Time)程序名稱等在很多情況下也是我們關心的信息我們再看看進程相關的性能信息在Windows下通常有兩種模式內核模式(Kernel: Level )和用戶模式(User: Level )進程往往在兩種模式中來回切換所以可以獲得進程在內核模式和用戶模式各自的使用時間同時還包括進程相關的工作集(WorkingSet)分頁池(PagedPool)非分頁池(NonePagedPool)和頁面文件(PageFile)信息進程相關的I/O操作包括讀/寫/其他等動作我們可以獲得這些操作的次數和傳送數據的數量
  
  如果您懷疑某個進程是木馬那您還想獲得哪些信息呢?簡單的進程名稱應該是不夠的吧!我們希望獲得進程的實際程序的路徑這樣可以幫助我們判斷究竟是那個程序在運行前段時間不是在討論什麼進程隱藏的其中一種就是創建遠程線程而注體往往又是以動態鏈接庫(DLL)的形式存在的我們就希望看到某個具體進程所包含的所有模塊(Module)常常是DLL也線程是一個大家熟悉的名字它是Windows系統中的實現體而進程則是線程運行的環境一個進程到底創建了多少線程了?我們同樣可以枚舉進程內部的所有線程信息如果您發現一個木馬進程下面的動作就應該是分析它的運行機制(如果您對它感興趣)不過最終您還是要將它結束吧在Windowsk下很多系統關鍵進程在TaskMgr裡是不能被結束的不過現在您不用擔心了好的對進程的操作當然就包括結束進程如果您用過中文的XP您是否常常遇到任務欄假死的情況雖然您的電腦沒有掛掉但卻動彈不得那好我們也同樣可以將任意的進程掛起來不管您對它做什麼動作(除了結束)它都不會有任何的反應有了掛起進程同樣我們也可以將進程從掛起狀態激活哈
  
  桌面窗口是大家接觸得最多的交互界面了您是否想獲得每個窗口的標題信息呢?當然我們還可以獲得與窗口關聯的進程線程與窗口句柄屬性如果大家對VC比較熟悉就應該知道其中的一個SPY++工具吧它就可以獲得桌面窗口進程和線程的詳細信息不過現在就不用打開這個打開那個了通通搞定了!
  
  系統性能是每個用戶關心的話題它包括整個系統當前創建的句柄進程以及線程的數目還有物理存儲器(Physical Memory)的總量和使用情況系統高速緩存(System Cache)的大小存儲器保留與提交(Commit Charge)狀況當然還有核心分頁/非分頁池(Kernel Memory)的使用情況幾乎包括了Windows系統下存儲器管理的大部分信息
  
  雖然現在硬盤的價格已經很低了不過我還是在用G的小東東所以常常遇到Low Disk!我們常常要看看硬盤的使用情況不過每次都要進入我的電腦太麻煩了而我們現在可以一次了解所有磁盤的容量和當前使用情況同時還有它們的格式類型(如FATNTFSCDFS等)和磁盤標簽
  
  說到環境塊或許不是那麼熟悉吧它包含一些環境變量而每個環境變量對應一個/多個字符串您可以在控制面板的SYSTEM/Advanced(系統/高級)裡對它們進行設置包括添加新的環境變量刪除和編輯系統環境變量
  
  事件記錄對我們分析系統的使用情況有很大的幫助事件記錄分為三種應用程序系統和安全而對應的每種事件又可以分為幾種類型它們分別是常規信息警告和錯誤其中包括記錄序號(Record Number)事件類型(Type)標識符(Event ID)來源(Source)產生時間(Time Generated)用戶名(User)和相關描述信息(Description)有時間大家可以多看看事件信息當然每個網絡管理員對它們應該是很熟悉的不過還包括其他的事件日志信息
  
  Windows系統下的ipconfig /all這個命令我是常常用因為我們使用的是DHCP沒事看看自己的IP地址變了沒有其中包括詳細的網絡適配器的信息包括適配器名稱描述硬件地址和類型IP地址及相應的子網掩碼網關與DHCP服務器地址等不過您是否對網絡流量也感興趣呢?我們當然可以獲得主機接受/發送了多少(非)廣播數據報出現了多少錯誤一共接受/發送了多少信息這些對每個網友都是有用的信息喲
  
  網絡共享往往是大家注意的地方您究竟共享了多少信息它們的文件路徑是什麼還有它們的共享類型信息我們在不需要某些共享資料時當然不要忘了將其刪除以免洩露自己的機密信息
  
  Windows的NT是一個多用戶的系統允許多種類型用戶的存在我們希望獲得用戶賬號的使用期限(Password Expired)記住要不定時的修改用戶的密碼喲以及用戶標識符(User ID)組標識符(Group ID)還有用戶賬號的類型(Type)不同的類型有不同的權限我們當然希望有最High的權力喲!看看系統對某個賬號的磁盤空間使用情況是否有限制(Max Storage)賬號登錄的次數(Number Of Logon)和登錄時間信息(Logon Hours)等對我們分析用戶的使用情況也有幫助的
  
  系統的Win服務和設備驅動信息也是很重要的我們希望探測每個服務/設備啟動程序的具體路徑狀態類型啟動方式等等信息我們還希望對服務進行控制比如停止啟動和刪除操作大家可以參閱《淺析Windows/XP服務與後門技術》獲得更多關於Win服務的信息
  
  關機也不是那麼的單調的您可以注銷自己的系統如果您要離開當然就需要鎖定了最近大家都不喜歡關機太麻煩了所以都習慣使用冬眠系統將會為我們保留當前信息不過還有支持電源管理的關機和休眠Windows的用戶注意了我們同樣可以使用XP系統下的帶有到記時與消息提示的關機和重啟功能了
  
  系統的版本信息是比較固定的主要包括操作系統的指紋注冊組織/用戶主機名和系統相關目錄等信息 
  
  說了這麼多我們也該談談如何實現了
  
  窗口信息
  MS為我們提供了打開特定桌面和枚舉桌面窗口的函數
  hDesk=OpenDesktop(lpszDesktopFALSEDESKTOP_ENUMERATE);
  //打開我們默認的Default桌面
  EnumDesktopWindows(hDesk(WNDENUMPROC)EnumWindowProc);
  //枚舉打開桌面上的所有窗口由回調函數實現
  BOOL __stdcall EnumWindowProc(HWND LPARAM);
  //在回調函數中我們可以獲得窗口的標題和相關進程線程信息
  GetWindowText(hWndszWindowTextdwMaxCount);
  GetWindowThreadProcessId(hWnd&dwPID);
  
  設備驅動器信息
  設備驅動信息有服務控制管理器(SCM)來管理的我要打開服務控制管理器並枚舉所有的設備驅動器
  OpenSCManager(NULLNULLSC_MANAGER_ALL_ACCESS);
  //以所有權限打開服務控制管理器
  EnumServicesStatus(schManagerdwDeviceTypedwDeviceState
  EnumStatusdwBufSize&dwBytesNeeded
   &dwDevicesReturned&dwResumeHandle))
  //枚舉所有設備的當前狀態
  CloseServiceHandle(schManager);
  //記住在結束訪問後要關閉服務句柄
  OpenService(schManagerszDeviceNameSERVICE_ALL_ACCESS);
  //打開特定的設備驅動器
  QueryServiceConfig(schDevicelpDeviceConfig
  *&dwBytesNeeded)
  //查詢驅動器的服務配置信息
  QueryServiceStatus(schDevice&DeviceStatus)
  //查詢設備驅動器的當前狀態
  QueryServiceConfig(schDeviceSERVICE_CONFIG_DESCRIPTION
  (LPBYTE)lpDeviceDescription*&dwBytesNeeded)
  //查詢設備的描述信息
  StartService(schDeviceNULL)
  //啟動設備
  ControlService(schDeviceSERVICE_CONTROL_STOP&DeviceStatus)
  //停止設備
  DeleteService(schDevice)
  //刪除設備
  
  磁盤信息
  我們希望獲得系統所有磁盤的信息包括軟盤硬盤光盤等等
  GetLogicalDriveStrings(dwBufferLengthlpBuffer);
  //獲得邏輯設備的信息
  GetVolumeInformation(lpRootPathNamelpVolumeNameBuffer
  dwVolumeNameSize&dwVolumeSerialNumber
  &dwMaximumComponentLength&dwFileSystemFlags
  lpFileSystemNameBufferdwFileSystemNameSize);
  //獲得磁盤卷信息包括卷名稱和格式類型
  GetDiskFreeSpaceEx(lpRootPathName&FreeBytesAvailable
  &TotalNumberOfBytes&TotalNumberOfFreeBytes);
  //探測磁盤的空間使用情況
  
   From:http://tw.wingwit.com/Article/os/xtgl/201311/9379.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.