系統(tǒng)的Win32服務(wù)和設(shè)備驅(qū)動(dòng)信息也是很重要的,我們希望探測(cè)每個(gè)服務(wù)/設(shè)備啟動(dòng)程序的具體路徑,狀態(tài),類型,啟動(dòng)方式等等信息。我們還希望對(duì)服務(wù)進(jìn)行控制,比如停止,啟動(dòng)和刪除操作。大家可以參閱《淺析Windows2000/XP服務(wù)與后門技術(shù)》獲得更多關(guān)于Win32服務(wù)的信息。
關(guān)機(jī)也不是那么的單調(diào)的,您可以注銷自己的系統(tǒng),如果您要離開(kāi)當(dāng)然就需要鎖定了。最近大家都不喜歡關(guān)機(jī),太麻煩了,所以都習(xí)慣使用冬眠,系統(tǒng)將會(huì)為我們保留當(dāng)前信息,不過(guò)還有支持電源管理的關(guān)機(jī)和休眠。Windows2000的用戶注意了,我們同樣可以使用XP系統(tǒng)下的帶有到記時(shí)與消息提示的關(guān)機(jī)和重啟功能了。
系統(tǒng)的版本信息是比較固定的,主要包括操作系統(tǒng)的指紋,注冊(cè)組織/用戶,主機(jī)名和系統(tǒng)相關(guān)目錄等信息。
說(shuō)了這么多,我們也該談?wù)勅绾螌?shí)現(xiàn)了。
1.窗口信息 MS為我們提供了打開(kāi)特定桌面和枚舉桌面窗口的函數(shù)。 hDesk=OpenDesktop(lpszDesktop,0,FALSE,DESKTOP_ENUMERATE); //打開(kāi)我們默認(rèn)的Default桌面; EnumDesktopWindows(hDesk,(WNDENUMPROC)EnumWindowProc,0); //枚舉打開(kāi)桌面上的所有窗口,由回調(diào)函數(shù)實(shí)現(xiàn)。 BOOL __stdcall EnumWindowProc(HWND, LPARAM); //在回調(diào)函數(shù)中,我們可以獲得窗口的標(biāo)題和相關(guān)進(jìn)程,線程信息; GetWindowText(hWnd,szWindowText,dwMaxCount); GetWindowThreadProcessId(hWnd,&dwPID);
2.設(shè)備驅(qū)動(dòng)器信息(服務(wù)和設(shè)備驅(qū)動(dòng)器差不多,在此不做重復(fù)) 設(shè)備驅(qū)動(dòng)信息有服務(wù)控制管理器(SCM)來(lái)管理的,我要打開(kāi)服務(wù)控制管理器,并枚舉所有的設(shè)備驅(qū)動(dòng)器。 OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); //以所有權(quán)限打開(kāi)服務(wù)控制管理器; EnumServicesStatus(schManager,dwDeviceType,dwDeviceState, EnumStatus,dwBufSize,&dwBytesNeeded, &dwDevicesReturned,&dwResumeHandle)) //枚舉所有設(shè)備的當(dāng)前狀態(tài); CloseServiceHandle(schManager); //記住,在結(jié)束訪問(wèn)后要關(guān)閉服務(wù)句柄; OpenService(schManager,szDeviceName,SERVICE_ALL_ACCESS); //打開(kāi)特定的設(shè)備驅(qū)動(dòng)器; QueryServiceConfig(schDevice,lpDeviceConfig, 1024*8,&dwBytesNeeded); //查詢驅(qū)動(dòng)器的服務(wù)配置信息; QueryServiceStatus(schDevice,&DeviceStatus); //查詢?cè)O(shè)備驅(qū)動(dòng)器的當(dāng)前狀態(tài); QueryServiceConfig2(schDevice,SERVICE_CONFIG_DESCRIPTION, (LPBYTE)lpDeviceDescription,8*1024,&dwBytesNeeded) //查詢?cè)O(shè)備的描述信息; StartService(schDevice,0,NULL); //啟動(dòng)設(shè)備; ControlService(schDevice,SERVICE_CONTROL_STOP,&DeviceStatus); //停止設(shè)備; DeleteService(schDevice); //刪除設(shè)備;
3.磁盤信息 我們希望獲得系統(tǒng)所有磁盤的信息,包括軟盤,硬盤,光盤等等; GetLogicalDriveStrings(dwBufferLength,lpBuffer); //獲得邏輯設(shè)備的信息; GetVolumeInformation(lpRootPathName,lpVolumeNameBuffer, dwVolumeNameSize,&dwVolumeSerialNumber, &dwMaximumComponentLength,&dwFileSystemFlags, lpFileSystemNameBuffer,dwFileSystemNameSize); //獲得磁盤卷信息,包括卷名稱和格式類型; GetDiskFreeSpaceEx(lpRootPathName,&FreeBytesAvailable, &TotalNumberOfBytes,&TotalNumberOfFreeBytes); //探測(cè)磁盤的空間使用情況;
4.環(huán)境變量 我們可以從注冊(cè)表中獲得環(huán)境塊的信息:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment,當(dāng)然要使用注冊(cè)表的函數(shù)。 RegOpenKeyEx(HKEY_LOCAL_MACHINE,RegKey,0,KEY_QUERY_value,&hKey); //打開(kāi)注冊(cè)表的鍵; RegEnumvalue(hKey,dwIndex,EnvironVariable, &dwVariableLength,NULL,NULL,NULL,NULL); //查詢我們需要的信息值; GetEnvironmentVariable(EnvironVariable,EnvironString,1024); //獲得環(huán)境變量的字符串信息; 5.事件記錄信息 OpenEventLog(NULL,szLog); //打開(kāi)時(shí)間日志記錄; GetOldestEventLogRecord(hEvent,&dwThisRecord); //獲得最新的日志信息,以便繼續(xù)查找; ReadEventLog(hEvent,EVENTLOG_FORWARDS_READ │ EVENTLOG_SEQUENTIAL_READ, 0,pEventLogRecord,1024*32,&dwRead,&dwNeeded) //讀去日志信息; LookupAccountSid(NULL,pSid,szName,&dwName,szDomain,&dwDomain,&SNU); //獲取賬戶的SID,以便獲得賬戶的用戶名稱; GetNumberOfEventLogRecords(hEvent,&dwTotal); //獲得事件日志的總數(shù); CloseEventLog(hEvent); //不要忘記關(guān)閉事件句柄; 6.網(wǎng)絡(luò)共享 我們使用第二等級(jí)的網(wǎng)絡(luò)共享搜索; NetShareEnum(NULL,dwLevel,(PBYTE *)&pBuf,MAX_PREFERRED_LENGTH,&entriesread,&totalentries,&resume); //列舉所有的共享目錄及相關(guān)信息; NetApiBufferFree(pBuf); //釋放緩沖區(qū); NetShareDel(NULL,(char *)lpShareNameW,0); //刪除網(wǎng)絡(luò)共享目錄; 7.網(wǎng)絡(luò)適配器信息 我們要探測(cè)NIC的信息和網(wǎng)絡(luò)流量; GetAdaptersInfo(&AdapterInfo,&OutBufLen); //獲取適配器信息; 8.系統(tǒng)性能 獲取系統(tǒng)的存儲(chǔ)器使用情況; GetPerformanceInfo(&PerfInfo,sizeof(PERformACE_INformATION)) //獲取系統(tǒng)性能信息;
出處:藍(lán)色理想
責(zé)任編輯:藍(lán)色
上一頁(yè) 剖析Windows任務(wù)管理器開(kāi)發(fā)原理與實(shí)現(xiàn) 下一頁(yè) 剖析Windows任務(wù)管理器開(kāi)發(fā)原理與實(shí)現(xiàn)<3>
|