系统的Win32服务和设备驱动信息也是很重要的,我们希望探测每个服务/设备启动程序的具体路径,状态,类型,启动方式等等信息。我们还希望对服务进行控制,比如停止,启动和删除操作。大家可以参阅《浅析Windows2000/XP服务与后门技术》获得更多关于Win32服务的信息。
关机也不是那么的单调的,您可以注销自己的系统,如果您要离开当然就需要锁定了。最近大家都不喜欢关机,太麻烦了,所以都习惯使用冬眠,系统将会为我们保留当前信息,不过还有支持电源管理的关机和休眠。Windows2000的用户注意了,我们同样可以使用XP系统下的带有到记时与消息提示的关机和重启功能了。
系统的版本信息是比较固定的,主要包括操作系统的指纹,注册组织/用户,主机名和系统相关目录等信息。
说了这么多,我们也该谈谈如何实现了。
1.窗口信息 MS为我们提供了打开特定桌面和枚举桌面窗口的函数。 hDesk=OpenDesktop(lpszDesktop,0,FALSE,DESKTOP_ENUMERATE); //打开我们默认的Default桌面; EnumDesktopWindows(hDesk,(WNDENUMPROC)EnumWindowProc,0); //枚举打开桌面上的所有窗口,由回调函数实现。 BOOL __stdcall EnumWindowProc(HWND, LPARAM); //在回调函数中,我们可以获得窗口的标题和相关进程,线程信息; GetWindowText(hWnd,szWindowText,dwMaxCount); GetWindowThreadProcessId(hWnd,&dwPID);
2.设备驱动器信息(服务和设备驱动器差不多,在此不做重复) 设备驱动信息有服务控制管理器(SCM)来管理的,我要打开服务控制管理器,并枚举所有的设备驱动器。 OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); //以所有权限打开服务控制管理器; EnumServicesStatus(schManager,dwDeviceType,dwDeviceState, EnumStatus,dwBufSize,&dwBytesNeeded, &dwDevicesReturned,&dwResumeHandle)) //枚举所有设备的当前状态; CloseServiceHandle(schManager); //记住,在结束访问后要关闭服务句柄; OpenService(schManager,szDeviceName,SERVICE_ALL_ACCESS); //打开特定的设备驱动器; QueryServiceConfig(schDevice,lpDeviceConfig, 1024*8,&dwBytesNeeded); //查询驱动器的服务配置信息; QueryServiceStatus(schDevice,&DeviceStatus); //查询设备驱动器的当前状态; QueryServiceConfig2(schDevice,SERVICE_CONFIG_DESCRIPTION, (LPBYTE)lpDeviceDescription,8*1024,&dwBytesNeeded) //查询设备的描述信息; StartService(schDevice,0,NULL); //启动设备; ControlService(schDevice,SERVICE_CONTROL_STOP,&DeviceStatus); //停止设备; DeleteService(schDevice); //删除设备;
3.磁盘信息 我们希望获得系统所有磁盘的信息,包括软盘,硬盘,光盘等等; GetLogicalDriveStrings(dwBufferLength,lpBuffer); //获得逻辑设备的信息; GetVolumeInformation(lpRootPathName,lpVolumeNameBuffer, dwVolumeNameSize,&dwVolumeSerialNumber, &dwMaximumComponentLength,&dwFileSystemFlags, lpFileSystemNameBuffer,dwFileSystemNameSize); //获得磁盘卷信息,包括卷名称和格式类型; GetDiskFreeSpaceEx(lpRootPathName,&FreeBytesAvailable, &TotalNumberOfBytes,&TotalNumberOfFreeBytes); //探测磁盘的空间使用情况;
4.环境变量 我们可以从注册表中获得环境块的信息:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment,当然要使用注册表的函数。 RegOpenKeyEx(HKEY_LOCAL_MACHINE,RegKey,0,KEY_QUERY_value,&hKey); //打开注册表的键; RegEnumvalue(hKey,dwIndex,EnvironVariable, &dwVariableLength,NULL,NULL,NULL,NULL); //查询我们需要的信息值; GetEnvironmentVariable(EnvironVariable,EnvironString,1024); //获得环境变量的字符串信息; 5.事件记录信息 OpenEventLog(NULL,szLog); //打开时间日志记录; GetOldestEventLogRecord(hEvent,&dwThisRecord); //获得最新的日志信息,以便继续查找; 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); //获得事件日志的总数; CloseEventLog(hEvent); //不要忘记关闭事件句柄; 6.网络共享 我们使用第二等级的网络共享搜索; NetShareEnum(NULL,dwLevel,(PBYTE *)&pBuf,MAX_PREFERRED_LENGTH,&entriesread,&totalentries,&resume); //列举所有的共享目录及相关信息; NetApiBufferFree(pBuf); //释放缓冲区; NetShareDel(NULL,(char *)lpShareNameW,0); //删除网络共享目录; 7.网络适配器信息 我们要探测NIC的信息和网络流量; GetAdaptersInfo(&AdapterInfo,&OutBufLen); //获取适配器信息; 8.系统性能 获取系统的存储器使用情况; GetPerformanceInfo(&PerfInfo,sizeof(PERformACE_INformATION)) //获取系统性能信息;
出处:蓝色理想
责任编辑:蓝色
上一页 剖析Windows任务管理器开发原理与实现 下一页 剖析Windows任务管理器开发原理与实现<3>
|