电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

剖析Windows任务管理器开发原理与实现


发布日期:2019/7/21
 

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);

//探测磁盘的空间使用情况

上一篇:利用Diskpart工具为Windows系统磁盘增容

下一篇:Cairo的未来不是梦?