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

2016-02-19 16:41 15 1 收藏

关注图老师设计创意栏目可以让大家能更好的了解电脑,知道有关于电脑的更多有趣教程,今天给大家分享剖析Windows任务管理器开发原理与实现教程,希望对大家能有一点小小的帮助。

【 tulaoshi.com - 编程语言 】

  Windows2000/XP内含的任务管理器(Taskmgr)相信大家都熟悉吧,相比之下XP里的要比2000功能更加强大,返回的信息也更加的详细,不过您是否觉得还有很多希望获得的消息没有包含在里面吗?您是否觉得Windows的系统管理工具箱里的东西太分散了吗?下面就让我们看看它们的开发原理,并动手实现一个真正的任务管理器。现在我们是调用Win32API来实现这些功能的,但是大家都说MS隐藏了太多的细节,以后我们将讨论更多关于Windows内核的东东。

  可能大家对任务管理器里最熟悉的功能要数进程管理了,常常我们在怀疑中了病毒/木马的时候都会看看任务管理器里有没有什么特别的进程在运行,所以进程查看器应该是一个非常重要的功能。我们除了需要获得进程的名称外,还有什么呢?当然包括它的进程标识符(ProcessID),用户信息(UserName),CPU使用时间(CPUTime)和存储器的使用情况(MemoryUsage),还有它的优先权(BasePriority)。CPU和Memory信息可以帮助我们分析进程的运行情况,而优先权可以表示进程在CPU分配处理器使用时的优先情况。这些都是通用的进程信息,让我们再看看其他的信息吧。进程的父进程标识符(Parent Process ID),创建时间(Create Time),程序名称等在很多情况下也是我们关心的信息。我们再看看进程相关的性能信息。在Windows下通常有两种模式:内核模式(Kernel: Level 0)和用户模式(User: Level 3),进程往往在两种模式中来回切换,所以可以获得进程在内核模式和用户模式各自的使用时间。同时还包括进程相关的工作集(WorkingSet),分页池(PagedPool),非分页池(NonePagedPool)和页面文件(PageFile)信息。进程相关的I/O操作包括读/写/其他等动作,我们可以获得这些操作的次数和传送数据的数量。

  如果您怀疑某个进程是木马,那您还想获得哪些信息呢?简单的进程名称应该是不够的吧!我们希望获得进程的实际程序的路径,这样可以帮助我们判断究竟是那个程序在运行。前段时间不是在讨论什么进程隐藏的,其中一种就是创建远程线程,而注体往往又是以动态链接库(DLL)的形式存在的,我们就希望看到某个具体进程所包含的所有模块(Module),常常是DLL也。线程是一个大家熟悉的名字,它是Windows系统中的实现体,而进程则是线程运行的环境。一个进程到底创建了多少线程了?我们同样可以枚举进程内部的所有线程信息。如果您发现一个木马进程,下面的动作就应该是分析它的运行机制(如果您对它感兴趣),不过最终您还是要将它结束吧。在Windows2k下,很多系统关键进程在TaskMgr里是不能被结束的,不过现在您不用担心了。好的,对进程的操作当然就包括结束进程。如果您用过中文的XP,您是否常常遇到任务栏假死的情况,虽然您的电脑没有挂掉,但却动弹不得,那好我们也同样可以将任意的进程挂起来,不管您对它做什么动作(除了结束),它都不会有任何的反应。有了挂起进程,同样我们也可以将进程从挂起状态激活哈。

  桌面窗口是大家接触得最多的交互界面了,您是否想获得每个窗口的标题信息呢?当然我们还可以获得与窗口关联的进程,线程与窗口句柄属性。如果大家对VC比较熟悉,就应该知道其中的一个SPY++工具吧,它就可以获得桌面窗口,进程和线程的详细信息,不过现在就不用打开这个,打开那个了,通通搞定了!

  系统性能是每个用户关心的话题。它包括整个系统当前创建的句柄,进程以及线程的数目。还有物理存储器(Physical Memory)的总量和使用情况,系统高速缓存(System Cache)的大小,存储器保留与提交(Commit Charge)状况,当然还有核心分页/非分页池(Kernel Memory)的使用情况。几乎包括了Windows系统下存储器管理的大部分信息。

  虽然现在硬盘的价格已经很低了,不过我还是在用6.4G的小东东,所以常常遇到Low Disk!我们常常要看看硬盘的使用情况,不过每次都要进入我的电脑,太麻烦了。而我们现在可以一次了解所有磁盘的容量和当前使用情况,同时还有它们的格式类型(如FAT,NTFS,CDFS等)和磁盘标签。

  说到环境块,或许不是那么熟悉吧,它包含一些环境变量,而每个环境变量对应一个/多个字符串,您可以在控制面板的SYSTEM/Advanced(系统/高级)里对它们进行设置,包括添加新的环境变量,删除和编辑系统环境变量。

本文示例代码或素材下载

  事件记录对我们分析系统的使用情况有很大的帮助。事件记录分为三种:应用程序,系统和安全。而对应的每种事件又可以分为几种类型,它们分别是常规信息,警告和错误。其中包括记录序号(Record Number),事件类型(Type),标识符(Event ID),

  (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_MACHINESYSTEMCurrentControlSetControlSession ManagerEnvironment,当然要使用注册表的函数。

  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.系统性能

  获取系统的存储器使用情况;

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  GetPerformanceInfo(&PerfInfo,sizeof(PERFORMACE_INFORMATION))

  //获取系统性能信息;

  9.进程/线程/模块信息

  在此我们使用工具帮助函数(ToolHelp32)和系统

  OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY │ TOKEN_ADJUST_PRIVILEGES,&hToken);

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  //打开进程的令牌,提升权限;

  AdjustTokenPrivileges(hToken,FALSE,&TokenPrivileges,sizeof(TOKEN_PRIVILEGES),NULL,NULL);

  //将进程的权限提升到支持调试(Debug);

  CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

  //创建进程的快照;

  Process32First(hProcessSnap,&ProcessEntry32);

  Process32First(hProcessSnap,&ProcessEntry32);

  //枚举所有进程;

  OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,ProcessEntry32.th32ProcessID);

  //打开特定进程,以查询进程相关信息;

  GetProcessTimes(hProcess,&CreateTime,&ExitTime,&KernelTime,&UserTime);

  //获取进程的时间信息;

  GetProcessMemoryInfo(hProcess,&PMCounter,sizeof(PMCounter));

  //获取进程的存储区信息;

  GetPriorityClass(hProcess);

  //获取进程的优先权;

  GetProcessIoCounters(hProcess,&IoCounters);

  //获取进程的IO使用情况;

  CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessID);

  //创建模块快照;

  Module32First(hModuleSnap, &ModuleEntry32);

本文示例代码或素材下载

来源:https://www.tulaoshi.com/n/20160219/1612809.html

延伸阅读
标签: 电脑入门
我们打开开始运行,输入 gpedit.msc 。 在本地组策略编辑器中,依次点击:用户配置管理模块系统Ctrl+Alt+Del选项,并双击右侧列表中的删除任务管理器 将删除任务管理器设置为未配置,即可解决任务管理器打不开与任务管理器被禁用的问题。
标签: 电脑入门
提起Win7的游戏管理器,可以将众多的游戏集成到一个窗口中且能完整地显示每个游戏的详细信息,因此非常方便我们从中选择自己喜欢的游戏来玩。但美中不足的是,Windows7游戏管理器只支持显示微软自己开发的某些游戏(如红心大战)。 我们能否将自己平常喜欢玩的任意一个游戏添加到Win 7的游戏管理器当中呢?答案当然是肯定的。接下来,笔者就以添...
标签: 电脑 网络
第一步 首先打开电脑桌面的“开始”菜单,点击“运行’。 第二步 【运行】的窗口,输入”gpedit.msc“的命令,然后点击”确定“。 第三步 【组策略】的窗口,找到”用户配置“这一项。然后展开”用户配置“——管理模板——系统——找到Ctrl + Alt + Del。”Ctrl + Alt + Del“的右边Ctrl + Alt + Del选项中鼠标右...
标签: 电脑入门
Windows的任务管理器经常会罢工。而产生罢工的原因有很多,面 对这种情况,你应该及时进行全盘扫描,排除病毒和木马对系统的影响。除此以外,还有可能因为组策略设置不当和注册表被修改而导致任务管理器无法正常使用, 还在等什么?赶快让Win7任务管理器重新工作吧。 情况一:重新配置组策略 很多情况下无法打开Win7任务管理器,都是由于在组...
标签: 电脑入门
Windows用户对任务管理器应该非常熟悉,调出Windows的任务管理器可以清楚地查看系统资源和程序进程,还可以结束掉有问题的程序或者进程等。相比之前版本的Windows任务管理器,Windows 8中的任务管理器在功能方面有一些改进和优化,一起来看看。 打开Win8的任务管理器有很多方法:比如在Win8开始屏幕状态下按快捷键Win+X从屏幕左下角的系统功...

经验教程

48

收藏

44
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部