热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于dll注入读取任务管理器中指定进程的详细信息

关键字注入dll,遍历ListView技术调研背景QA测试程序时,往往需要关注进程的性能指标,比如:CPU,

关键字

注入dll,遍历ListView


技术调研背景

QA测试程序时,往往需要关注进程的性能指标,比如:CPU,GPU,内存,显存。最终根据各个采样数据,生成基于时间轴的状态表(类似任务管理器的性能图表)

难点:

  1. 通过代码中调用API,某些进程详情信息很难获取(比如GPU占用率和显存使用量),而且这需要修改测试程序的代码:在项目中定时获取相关指标。
  2. 人工定时获取相关指标不现实(之前QA是间隔几十秒手动记录)当然后来利用系统工具(性能计数器)可以实现部分信息的定时记录。

线索及相关测试结果

1. 任务栏管理器的“详细信息”页面,是使用ListView的UI控件实现的,其class name是“SysListView32”,获取到该列表的HWND句柄后,通过遍历ListView可以读取所有行列信息。

ListView的相关API:ListView_GetColumn macro (commctrl.h) - Win32 apps | Microsoft Learn

2. 注意:因为任务栏管理器是基于管理员权限运行的,访问其相关对象需要自己的进程也以管理员权限启动。

3. 获取到ListView句柄后(可以通过SPY抓取 或遍历适配任务栏管理器的所有子窗口),利用API VirtualAllocEx + WriteProcessMemory,尝试跨进程读取ListView的对象,但是失败了。参考:

通过句柄获取或遍历SysListView32和SysTreeView32控件的数据信息_浮世的博客-CSDN博客_systreeview32

4. 既然跨进程访问ListView不可行,尝试注入dll到任务栏管理器进程,在注入的dll中遍历ListView的行列信息,测试成功!(注意:注入dll的执行进程 必须也以管理员权限启动 否则无法注入dll到任务管理器)

缺点:

该方法是基于UI上的窗口句柄HWND的遍历获取,用户必须显式打开任务管理器 并将页面切换到“详细信息”。

运行结果截图:

 

在注入dll中的测试代码如下所示。注意:因为系统封装的ListView相关的宏接口,都是用SendMessage访问list属性的,所以这些宏接口都可以在非UI线程调用。

#include
#include
#define TEXTSIZE 256
void TestFunc()
{
// 该句柄即是任务管理器的“详细信息”页面的列表控件句柄,可以用spy抓取,也可以遍历所有子控件并通过claaname判断:“SysListView32”
HWND hListViewOfProcessDetail = (HWND)0X00202666;
//获得窗口类名, 任务管理器的“详细信息”的list控件,其classname是“SysListView32”
TCHAR lpClassName[TEXTSIZE];
GetClassName(hListViewOfProcessDetail, (LPWSTR)lpClassName,
TEXTSIZE - 1);
// 遍历各个列的索引号和列名
// 注意:此处测试结果发现,实际的列索引并不是UI上显示的索引顺序,而是“选择列”页面上已经选中的项的索引号。
for (size_t i &#61; 0; i <10; i&#43;&#43;) {
TCHAR buf[TEXTSIZE] &#61; {0};
LV_COLUMN temp;
temp.mask &#61; LVCF_TEXT;
temp.pszText &#61; buf;
temp.cchTextMax &#61; TEXTSIZE;
ListView_GetColumn(hListViewOfProcessDetail, i, &temp);
if (buf[0] &#61;&#61; 0)
break;
wchar_t txt[200];
swprintf_s(txt, 200, L"index:%d columnName:%s", (int)i, buf);
//MessageBox(0, txt, txt, 0);
}
// 获取列表的总行数
int nCount &#61; ListView_GetItemCount(hListViewOfProcessDetail);
for (int i &#61; 0; i TCHAR processName[TEXTSIZE] &#61; {0}; // exe name
LV_ITEM lvi;
// 指定列的索引号&#xff0c;索引0始终是进程名称列。
// 注意&#xff1a;索引号并不是UI上所看到的从左到右的索引。
// 查找索引号的方法&#xff1a;打开“详细信息”的“选择列”窗口&#xff0c;
// 该窗口从上到下&#xff0c;所选中的项&#xff0c;其列索引以1开始依次递增
// &#xff08;索引0始终是进程“名称”这一列的index&#xff09;
lvi.iSubItem &#61; 0;
lvi.pszText &#61; processName;
lvi.cchTextMax &#61; TEXTSIZE;
SendMessage(hListViewOfProcessDetail, LVM_GETITEMTEXT, i,
(LPARAM)&lvi);
MessageBox(0, processName, L"wangshaohui test", 0);
}
};

列索引示意图&#xff08;设置给LV_ITEM::iSubItem的索引值&#xff09;


结束语&#xff1a;

据悉&#xff0c;也可以用python获取任务管理器的进程详情&#xff0c;尚未调查确认。




推荐阅读
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 本文通过基准测试(Benchmark)对.NET Core环境下Thrift和HTTP客户端的微服务通信性能进行对比分析。基准测试是一种评估系统或组件性能的方法,通过运行一系列标准化的测试来衡量其表现。 ... [详细]
  • 面试题总结_2019年全网最热门的123个Java并发面试题总结
    面试题总结_2019年全网最热门的123个Java并发面试题总结 ... [详细]
  • 使用Tkinter构建51Ape无损音乐爬虫UI
    本文介绍了如何使用Python的内置模块Tkinter来构建一个简单的用户界面,用于爬取51Ape网站上的无损音乐百度云链接。虽然Tkinter入门相对简单,但在实际开发过程中由于文档不足可能会带来一些不便。 ... [详细]
  • C#实现文件的压缩与解压
    2019独角兽企业重金招聘Python工程师标准一、准备工作1、下载ICSharpCode.SharpZipLib.dll文件2、项目中引用这个dll二、文件压缩与解压共用类 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • javax.mail.search.BodyTerm.matchPart()方法的使用及代码示例 ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 本文详细介绍了Apache POI库在处理Word (.docx) 文件时的核心模块XWPFDocument及其主要功能。文章涵盖了文档的段落、表格、页眉和页脚的处理方法,并提供了具体的代码示例。 ... [详细]
  • 本文介绍了如何使用Python爬取妙笔阁小说网仙侠系列中所有小说的信息,并将其保存为TXT和CSV格式。主要内容包括如何构造请求头以避免被网站封禁,以及如何利用XPath解析HTML并提取所需信息。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
author-avatar
爱在西元前2502938591
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有