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

news2024/11/15 10:40:36

关键字

注入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 <Windows.h>
#include <Commctrl.h>

#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 = 0; i < 10; i++) {
        TCHAR buf[TEXTSIZE] = {0};

        LV_COLUMN temp;
        temp.mask = LVCF_TEXT;
        temp.pszText = buf;
        temp.cchTextMax = TEXTSIZE;

        ListView_GetColumn(hListViewOfProcessDetail, i, &temp);

        if (buf[0] == 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 = ListView_GetItemCount(hListViewOfProcessDetail);
    for (int i = 0; i < nCount; ++i) { // 遍历每一行

        TCHAR processName[TEXTSIZE] = {0}; // exe name

        LV_ITEM lvi;
        // 指定列的索引号,索引0始终是进程名称列。
        // 注意:索引号并不是UI上所看到的从左到右的索引。
        // 查找索引号的方法:打开“详细信息”的“选择列”窗口,
        // 该窗口从上到下,所选中的项,其列索引以1开始依次递增
        // (索引0始终是进程“名称”这一列的index)
        lvi.iSubItem = 0;
        lvi.pszText = processName;
        lvi.cchTextMax = TEXTSIZE;

        SendMessage(hListViewOfProcessDetail, LVM_GETITEMTEXT, i,
                (LPARAM)&lvi);

        MessageBox(0, processName, L"wangshaohui test", 0);
    }
};

列索引示意图(设置给LV_ITEM::iSubItem的索引值)

结束语:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/351908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

37.网络结构与模型压缩、加速-4

37.1 减少网络碎片化程度(分支数量) 模型中分支数量越少,模型速度越快 此结论主要是由实验结果所得。 以下为网络分支数和各分支包含的卷积数目对神经网络速度的影响。 实验中使用的基本网络结构,分别将它们重复10次,然后进行实验。实验结果如下: 由实验结果可知,随着网络…

【JVM与性能调优】JVM常用指令之Javap详解

一、JavaP 命令是什么&#xff1f; JavaP 命令是 Java 语言的一种工具 &#xff0c;Java中一种反汇编器&#xff01; 二、JavaP 命令的作用 帮助开发者深入了解 Java 编译器的机制显示字节代码含义显示编译类文件中的可访问功能和数据查看Java类文件中类和接口的内部结构显示…

Mybatis执行完新增操作后,对象的ID主键被修改了的原因【mybatis-spring-boot-starter开源项目的贡献者解答】

Mybatis执行完新增操作后&#xff0c;对象的Id主键被修改了的原因问题由来问题分析解决方案感谢问题由来 首先说下背景&#xff0c;项目的依赖是&#xff1a;mybatis-spring-boot-starter&#xff1a;1.3.2 进行新增操作后&#xff0c;一般来说入库就算完事了&#xff0c;但是除…

基础篇:04-Eureka服务注册与发现

目录 1.Eureka工程搭建启动 打开Idea-Service控制台 2.user-service接入并启动 2.1 引入pom依赖 2.2 更新配置文件 2.3 启动并查看Eureka信息 2.3 复制模拟多实例部署 3.order-service接入并启动 4.常见问题及解决方案 5.总结 6.推荐阅读资料 因前面提到Netflix相关…

webpack -- 无法将“webpack”项识别为 cmdlet

webpack : 无法将“webpack”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c;请确保路径正确&#xff0c;然后再试一次。 1.检测是否是版本太高而只能使用脚手架进行打包 webpack4.x的打包已经不能用webpack 文件a …

phpStudy服务

1 概述 1.1 安装说明 1. 安装路径不能包含“中文”或者“空格”&#xff0c;否则会报错&#xff08;例如错误提示&#xff1a;Cant change dir to G:\\x65b0\x5efa\x6587\&#xff09;保证安装路径是纯净的&#xff0c;安装路径下不能有已安装的V8版本&#xff0c;若重新安装…

数据结构与算法基础-学习-12-线性表之顺序队

一、个人理解队列是线性表的衍生之一&#xff0c;具有先进先出的特性&#xff0c;在队尾进行插入操作&#xff0c;在队头进行删除操作。队列的存储结构分为两个大类&#xff0c;一种是顺序队&#xff0c;就是用数组实现。另一种就是链队&#xff0c;使用链表实现。顺序队存在真…

20基于主从博弈的智能小区代理商定价策略及电动汽车充电管理MATLAB程序

参考文档&#xff1a;《基于主从博弈的智能小区代理商定价策略及电动汽车充电管理》基本复现仿真平台&#xff1a;MATLABCPLEX/gurobi平台优势&#xff1a;代码具有一定的深度和创新性&#xff0c;注释清晰&#xff0c;非烂大街的代码&#xff0c;非常精品&#xff01;主要内容…

Vue3路由传参

vue3路由和vue2差别不是很大&#xff0c;不过在传参形式上略有改变 在Vue3中使用路由必须引入 useRouter 和 useRoute import { useRoute, useRouter } from vue-routerconst Router useRouter() //跳转const Route useRoute() //获取到值 同Vue2一样&#xff0c;query使用p…

实用调试技巧【下篇】

&#x1f534;本文章是在 Visual Studio 2022&#xff08;VS2022&#xff09;编译环境下进行操作讲解 文章目录3.2.调试的时候查看程序当前信息3.2.1.查看临时变量的值3.2.2.查看内存信息3.2.3.查看调用堆栈3.2.4.查看汇编信息&#x1f973;4.调试实例&#x1f973;5.如何写出&…

【笔记】数据异常检测与修复总结

文章目录一、异常种类1. 对于移动对象的数据异常2. 对于时序数据的异常检测二、异常数据清洗流程三、数据预处理四、异常检测算法五、异常修复算法六、漂移数据清洗一、异常种类 不同的研究对象&#xff0c;有着不同的异常分类方式 1. 对于移动对象的数据异常 异常数据信息&…

leaflet: 数据聚合,显示当前bounds区域中的点的名称列表(078)

第078个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中实现数据聚合的功能 ,左边列出右边可视区域内的marker的名称。这里主要用到了可视区域的范围以及contains函数。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方…

windows11安装sqlserver2022报错

window11安装SQL Server 2022 报错 糟糕… 无法安装SQL Server (setup.exe)。此 SQL Server安装程序介质不支持此OS的语言&#xff0c;或没有SQL Server英语版本的安装文件。请使用匹配的特定语言SQL Server介质;或安装两个特定语言MUI&#xff0c;然后通过控制面板的区域设置…

深入浅出带你学习weblogic中间件常见漏洞

前文 上一篇文章给大家带来了JBOSS中间件漏洞的利用知识&#xff0c;不知道大家学习的如何了&#xff0c;今天给大家带来的是一个比较重要的中间件——weblogic漏洞利用的介绍&#xff0c;按我们之前的顺序&#xff0c;先学习一下什么是WEBLOGIC中间件。 什么是WebLogic? We…

机器学习:Recurrent Neural Network-RNN

应用举例 如果有很多词汇的时候&#xff0c;one-encode会导致很长&#xff0c;可以将不常见的归类到other&#xff0c;也可以用n-gram进行编码 输出的是一个概率分布 相同的词得到不同的结果&#xff0c;需要网络具有记忆&#xff0c;RNN网络的设计就是使得网络具有部分的记忆能…

【Python入门第十一天】Python 运算符

Python 运算符 运算符用于对变量和值执行操作。 Python 在以下组中划分运算符&#xff1a; 算术运算符赋值运算符比较运算符逻辑运算符身份运算符成员运算符位运算符 Python 算术运算符 算术运算符与数值一起使用来执行常见的数学运算&#xff1a; 运算符&#xff1a; 名…

动态网站开发讲课笔记01:网页开发基础

文章目录零、本讲学习目标一、HTML基础&#xff08;一&#xff09;HTML简介1、HTML2、HTML语言的基本格式3、<!DOCTYPE>声明4、html标签5、head标签6、body标签7、编写第一个网页8、关于编写HTML文件的工具9、HTML标签概述&#xff08;1&#xff09;单标签&#xff08;2&…

【论文笔记】图像修复Learning Joint Spatial-Temporal Transformations for Video Inpainting

论文地址&#xff1a;https://arxiv.org/abs/2007.10247 源码地址&#xff1a;GitHub - researchmm/STTN: [ECCV2020] STTN: Learning Joint Spatial-Temporal Transformations for Video Inpainting 一、项目介绍 当下SITA的方法大多采用注意模型&#xff0c;通过搜索参考帧…

webpack 开发环境的基本配置(webpack打包样式资源、html、图片、devserver、开发环境配置、以及其他资源)

A.打包样式资源 1. 创建文件 2. 下载安装 loader 包 npm i css-loader style-loader less-loader less -D 3. 修改配置文件 /*webpack.config.js webpack的配置文件作用: 指示 webpack 干哪些活&#xff08;当你运行 webpack 指令时&#xff0c;会加载里面的配置&#xff…

计算机图形学(Computer Graphics)的学习笔记

目录 1.计算机图形学是什么 2.计算机图形学学什么 3.计算机图形学应用举例 4.计算机图形学主要内容 5.图形的分类 6.图形要素 7.图形的表达方式 8.图形学应用生活中的例子 9.计算机图形学定义 10.用户界面发展方向 11.影视中的变形技术要点 12.虚拟现实的一些技术 …