-
2020-05-13 20:18:21
假设某天我突发奇想,想要实现:
输入一个进程名字,输出该进程的句柄、内存占用、CPU使用情况。
ok,那我们来看下如何扯出这个程序,以下演示程序基于vs2008,更高版本可能会有字符问题。
1)在系统中查找是否存在指定进程名的进程:
这里需要用到windows提供的几个API函数:CreateToolhelp32Snapshot、Process32First和Process32Next。
函数的简单介绍:
HANDLE WINAPI CreateToolhelp32Snapshot( __in DWORD dwFlags, __in DWORD th32ProcessID );
函数功能:创建指定进程的快照,快照包括进程的堆栈、模块、线程;
参数:
dwFlags:获取系统进程快照的类型;当指定为TH32CS_SNAPPROCESS,表示在快照中包括系统中的所有进程,此时将忽略th32ProcessID的设置。
th32ProcessID:指定要获取进程快照的进程ID;为0表示当前进程;此参数只有在dwFlags设置了TH32CS_SNAPHEAPLIST或者TH32CS_SNAPMODULE后才有效。
返回值:当函数调用成功返回快照句柄,否则返回INVALID_HANDLE_VALUE。在得到系统进程快照句柄后,需要调用Process32First函数查找系统进程快照中的第一个进程。
详情:https://docs.microsoft.com/en-us/windows/win32/api/tlhelp32/nf-tlhelp32-createtoolhelp32snapshot
Process32First函数
BOOL WINAPI Process32First( __in HANDLE hSnapshot, __in_out LPPROCESSENTRY32 lppe );
函数功能:获取进程快照中的第一个进程信息
参数:
hSnapshot:系统进程快照的句柄;
Lppe:指向PROCESSNTRY结构的结构体指针,进程的详细信息保存在此结构体中:
typedef struct tagPROCESSENTRY32 { DWORD dwSize;//结构大小 DWORD cntUsage;//此进程的引用计数 DWORD th32ProcessID;//进程ID ULONG_PTR th32DefaultHeapID;//进程默认堆ID DWORD th32ModuleID;//进程模块ID DWORD cntThreads;//此进程开启的线程计数 DWORD th32ParentProcessID;//父进程ID LONG pcPriClassBase;//线程优先权 DWORD dwFlags;//保留 TCHAR szExeFile[MAX_PATH];//进程名 } PROCESSENTRY32, *PPROCESSENTRY32;
返回值:当函数列举到进程时返回true,否则返回false。
详情:https://docs.microsoft.com/en-us/windows/win32/api/tlhelp32/nf-tlhelp32-process32first
Process32Next函数:
BOOL WINAPI Process32Next( __in HANDLE hSnapshot, __in_out LPPROCESSENTRY32 lppe );
函数功能:获取进程快照中下一个进程信息;
参数和返回值与Process32Next函数基本一致
详情:https://docs.microsoft.com/en-us/windows/win32/api/tlhelp32/nf-tlhelp32-process32next
OpenProcess函数:HANDLE OpenProcess( DWORD dwDesiredAccess, //想拥有的该进程的访问权限 BOOL bInheritHandle, //所得到的进程句柄是否可以被继承 DWORD dwProcessId//需要被打开的进程的PID );
函数功能:打开已存在的进程对象,返回进程句柄;
返回值:函数成功,返回指定进程的句柄,失败返回NULL。
具体的实现代码:
std::vector<HANDLE> GetProcessHandle(LPCWSTR lpName) { DWORD dwPid = 0; HANDLE hProcess = NULL; HANDLE hProcessSnap; PROCESSENTRY32 pe32; std::vector<HANDLE> hProcessGroup; do{ hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//获取系统所有进程的快照 if (hProcessSnap == INVALID_HANDLE_VALUE) { //日志 break; } pe32.dwSize = sizeof(PROCESSENTRY32); if (!Process32First(hProcessSnap, &pe32))//获取第一个进程信息 { //日志 CloseHandle(hProcessSnap); break; } int namelen = 200; char name[201] = { 0 }; do { if (NULL != wcsstr(pe32.szExeFile, lpName)) {//查找匹配字符串 dwPid = pe32.th32ProcessID; hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);//获取进程句柄 hProcessGroup.push_back(hProcess); } } while (Process32Next(hProcessSnap, &pe32)); CloseHandle(hProcessSnap);//记得释放句柄 }while(0); return hProcessGroup; }
这里使用的vector存储多个进程句柄,是因为实际系统中,可能有多个同名的进程,比如Chrome每个页面都是一个进程。
到这里,我们就可以获得的当前系统中指定进程名的所有操作句柄了。
下一篇,将介绍如何使用进程句柄获取进程当前的CPU占用。本文为作者原创,如需转载,请在评论区征得作者同意,原创链接:https://blog.csdn.net/anranjingsi/article/details/106104403
更多相关内容 -
weblogic守护进程:监控weblogic进程,当发现进程停止时调用重启脚本重启
2019-02-25 22:13:51#功能:weblogic守护进程:监控weblogic进程,当发现进程停止时调用重启脚本重启 #参数:进程唯一标识码,例如“weblogic” #依赖脚本:数据库操作脚本dbExecurteSQL.sh,weblogic重启脚本$PSSC_DOMAIN/startPssc.sh... -
Process-Monitor:允许监视Windows中的进程的API
2021-05-12 09:58:58过程监控器允许在Windows中监视进程的API。 主要特点: 允许启动和重新启动过程; 允许检索过程信息(句柄,ID,状态(正在工作,正在重启,已停止)); 允许通过方法调用停止进程(无需重新启动),然后重新启动;... -
windows 进程监控,脚本实现
2021-05-13 16:23:54一:main.vbs文件 Set ws = CreateObject("Wscript.Shell") ws.run "cmd /c minotor.bat",0 REM 让minotor.bat的运行处于后台当中,即不...::需要守护的进程启动命令,等号后面接路径 set _processCmd=C:\Users\mi\Desk一:main.vbs文件
Set ws = CreateObject("Wscript.Shell") ws.run "cmd /c minotor.bat",0 REM 让minotor.bat的运行处于后台当中,即不显示黑窗口
二:minotor.bat文件
::检测时间间隔,5秒 set _interval=5 ::需要守护的进程名称 set _processName=test.exe ::需要守护的进程启动命令,等号后面接路径 set _processCmd=C:\Users\mi\Desktop\dalongyun\test\test\Debug\test.exe ::set _processCmd=test.exe ::需要守护的进程预估启动完毕所需时间,单位:秒 set _processTimeout=1 ::进程用户名,一般是Administrator set _username=adminstrator :LOOP set /a isAlive=false ::tasklist /FI "username eq %_username%" | find /C "%_processName%" > temp.txt tasklist | find /C "%_processName%" > temp.txt set /p num= < temp.txt del /F temp.txt if "%num%" == "0" ( start %_processCmd% | echo start %_processName% at %time% choice /D y /t %_processTimeout% > nul ) if "%num%" NEQ "0" echo %_processName% is running choice /D y /t %_interval% >nul goto LOOP
使用方法:根据个人监控的exe文件的不同,改下路径就行。然后双击vbs文件即可,它会去调用bat文件。
然后打开任务管理器,即可看到test.exe运行起来了。
手动关闭test.exe,它会自动重启。 -
windows进程监控
2018-06-12 17:36:28最近开发一个进程监控的服务,由于对windows api不熟,所以折腾了小两周才完全跑通,特记录一下1 由于需求需要根据进程名来进行监控,所以首先要根据进程名来获取进程句柄(同名进程可能有多个,比如,起了多个...最近开发一个进程监控的服务,由于对windows api不熟,所以折腾了小两周才完全跑通,特记录一下
1 由于需求需要根据进程名来进行监控,所以首先要根据进程名来获取进程句柄(同名进程可能有多个,比如,起了多个notepad.exe)//通过进程名获取进程句柄集// 返回值为 同名进程个数(不超过20个)int getProcessHandle(LPCWSTR lpName, HANDLE pH[20]){int num = 0;HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (INVALID_HANDLE_VALUE == hSnapshot){return 0;}PROCESSENTRY32 pe = { sizeof(pe) };BOOL fOk;for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe)){
if (!_tcsicmp(pe.szExeFile, lpName)){pH[num++] = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID);}// 同名进程超过20个,返回20个if (num > 20){num = 20;break;}}CloseHandle(hSnapshot);return num;}
2 根据进程句柄来获取程序开始运行的时间(多个同名进程里最早的一个)
earliesttime = COleDateTime::GetCurrentTime();
for (i = 0; i < number; i++)
{
GetProcessTimes(hProcess[i], &ftCreation, &ftExit, &ftKernel, &ftUser);
if ((earliesttime - (COleDateTime(ftCreation))).GetTotalSeconds() > 0){
earliesttime = ftCreation;
}}
3 创建子线程,来监听该程序名的所有进程句柄的结束事件,将结束时间写入redis
for (int j = 0; j < number; j++){
pDataArray[ncount]->hProcess[j] = hProcess[j];
}
pDataArray[ncount]->procname = _strdup(name);
pDataArray[ncount]->num = number;hThreadArray[ncount] = (HANDLE)_beginthreadex(NULL, 0, &MyThreadFunction, pDataArray[ncount], 0, NULL);
unsigned int _stdcall MyThreadFunction(LPVOID lpParam)
{
char endtime[BUFFERSIZE] = "";
char buffer[BUFFERSIZE] = "";
char buff[BUFFERSIZE] = "";
HANDLE hProcess[20];
int number = 0;
int flag = 1;
DWORD nret;
redisContext* c;
COleDateTime timeCreation, timeNow;PMYDATA pDataArray = (PMYDATA)lpParam;
// printf("thread--------------name=[%s]-----tid=[%ld]\n", pDataArray->procname, GetCurrentThreadId());
if (pDataArray->num > 1)
{
nret = WaitForMultipleObjects(pDataArray->num, pDataArray->hProcess, TRUE, TIMEOUT);
}
else if (pDataArray->num == 1)
{
nret = WaitForSingleObject(pDataArray->hProcess[0], TIMEOUT);
}
switch (nret)
{
case WAIT_OBJECT_0:
// 所有同名进程都结束,则写endtime
number = getProcessHandle(T2W((LPTSTR)CString(pDataArray->procname).GetBuffer(NULL)), hProcess);
if (!number)
{
sprintf_s(buff, BUFFERSIZE, "%s", removeSuffix(pDataArray->procname, ".exe"));
_strlwr_s(buff, BUFFERSIZE);
timeNow = COleDateTime::GetCurrentTime();
sprintf_s(endtime, "%02d:%02d:%02d", timeNow.GetHour(), timeNow.GetMinute(), timeNow.GetSecond(), BUFFERSIZE);
sprintf_s(buffer, "rpush %s|%s|%04d-%02d-%02d endtime|%s", mac, buff, timeNow.GetYear(), timeNow.GetMonth(), timeNow.GetDay(), endtime);
// 将进程结束时间写入 redis
c = redisConnect(redisip, redisport);
if (c->err)
{
printf("Connect to redisServer failed:%s\n", c->errstr);
redisFree(c);
return -1;
}
if (rpushString(c, buffer))
{
printf("setString error [%s]\n", buffer);
}
redisFree(c);
}
break;
case WAIT_TIMEOUT:
// 超时,退出
;;
break;
case WAIT_ABANDONED_0:
;;
break;
case WAIT_FAILED:
// 函数调用失败,比如传递了一个无效的句柄
;;
break;
}
return 0;
}
4 将监控事件做成定时事件,30秒跑一次
timer_id = timeSetEvent(TIMEOUT+1000, 1, (LPTIMECALLBACK)onTimeFunc, DWORD(1), TIME_PERIODIC);
5 套上SCManager框架,将程序做成服务,把状态传入SCManager
-
windows系统下Powershell,cmd 实现进程监控重启
2021-08-02 09:51:42以Python 进程监控为例,该进程为京东网站数据分布式爬取程序,实现windows下网络连接失败等其他原因造成的进程异常结束,实现进程重启; 脚本如下,将如下脚本赋值到文本文件,后缀名改为bat;直接在Powershell...以Python 进程监控为例,该进程为京东网站数据分布式爬取程序,实现windows下网络连接失败等其他原因造成的进程异常结束,实现进程重启;
脚本如下,将如下脚本赋值到文本文件,后缀名改为bat;直接在Powershell窗口运行即可;:restart set /A ProgramCntLevel=1 REM 进程数量赋值 for /F %%i in ('tasklist ^| findstr python ^| find /v /c ""') do (set ProgramCount=%%i) if %ProgramCount% GEQ %ProgramCntLevel% ( REM 进程意外结束,等待重启 timeout /T 300 /NOBREAK ) if %ProgramCount% LSS %ProgramCntLevel% ( REM 简单的Python程序为例,或者调用start命令将程序放置后台 python.exe begin.py REM start /b python begin.py ) goto restart pause
-
获取指定进程的内存和cpu使用率
2020-10-02 21:37:22实时获取指定进程的内存和cpu占用情况,刷新频率为100ms,是为工程写的,为了测试有效抓的msn的内存和cpu信息 -
windows下批处理监控进程
2020-03-28 09:50:28:loopping-n5127.0.0.1tasklist|find/i“nginx.exe”if%errorlevel%==1(start “nginx.exe”)goto:loop脚本作用是每五秒进行一次检测,进程列表是否有指定名称的软件,如有...本文链接地址: windows下批处理监控进程... -
Windows 内存监控 日志
2013-08-10 00:13:59Qt实现的一个监控程序内存的小程序,由于工作需要!自己实现的!有很多的Bug,但是不影响使用!可以参考 -
如何监控windows进程的句柄、内存和cpu(三)
2020-05-15 22:04:46紧接上文,接下来就是获取进程的句柄数,句柄就是windows进程中各种对象的标识,一般应用程序会通过句柄来执行各种操作,通过监控设备的句柄,我们可以大致判断出进程是否存在异常,比如句柄泄漏,会导致系统卡顿,... -
Linux进程资源监控命令
2021-06-02 16:21:45一、进程实时监控pidstat工具 1、pidstat 概述 pidstat是sysstat工具的一个命令,用于监控全部或指定进程的cpu、内存、线程、设备IO等系统资源的占用情况。pidstat首次运行时显示自系统启动开始的各项统计信息,... -
windows下强大的系统监视工具Procmon(Process Monitor)
2021-12-22 11:07:35Process Monitor是微软推荐的一款系统监视攻击,能供实时显示文件系统、注册表、网络连接于进程活动的攻击工具。它整合了一些工具,其中Folemon专门用来监视系统中的任何文件操作过程,Regmon用来监视注册表的读写... -
stealthInjector:使用直接系统调用将 shellcode 注入远程进程
2021-05-31 10:23:36隐形注射器使用直接系统调用将 shellcode 注入远程进程。 直接系统调用将绕过许多 AV/EDR 检测技术,例如 API 用户态挂钩和监控。 系统调用是通过读取 ntdll.dll 而不是使用硬编码程序集动态检索的。 动态检索系统... -
windows下监控进程的脚本
2019-09-28 00:15:23Linux下面似乎有守护进程的概念,Windows下面其实也很简单,dos批处理就可以搞定:-) 需要了解如下几个命令,tasklist +find,ping。tasklist是列出所有进程,可以指定只列出某用户的进程,用... -
Windows 程序监控脚本【任务计划可实现自动监控程序】
2020-05-29 12:01:33rem 定义需监控程序的进程名和程序路径,可根据需要进行修改 set AppName=NetbootM.exe set AppPath=E:\sdyc-v1.3\ title 进程监控 cls echo. echo 进程监控开始…… echo. rem 定义循环体 :startjc ... -
通过SNMP实现进程监控及进程路径
2018-07-04 15:36:06通过snmp实现进程监控代码: SNMP监控OID的 WALK 请求方式: /** * */ package com.hfvast.monitor.snmp; import java.io.IOException; import java.util.Vector; import org.apache.log4j.Logger; import org.... -
基于分布式环境的子进程监控软件设计与实现
2020-10-17 21:31:21针对分布式系统环境下,计算资源代理对其子进程监控的方法单一,且不能准确获取子进程运行状态的问题,提出了一种根据子进程的窗口句柄定时检测子进程运行状态的方法。该方法首先根据子进程的不同类型采用不同的方法... -
windows服务守护进程
2020-04-29 13:55:29windows服务守护进程为什么选择用服务来守护进程注册服务双服务互相守护服务启动进程并保活启动进程进程保活 最近做一个项目, 保护我们云电脑中的计费程序等应用程序、脚本,不被用户结束。 综合各种方案,最终选择... -
强大的 API 监控工具 之 Win32Exts for API Monitor 介绍
2020-04-15 14:54:442、 开始监控进程 执行批处理: Api_Monitor 16进制的进程窗口句柄 或者直接运行: rundll32 "%cd%\win32exts.dll",MyAnyHookApi_RunDll32 --hwnd=16进制的进程窗口句柄 即可开始监控。 对于无窗口进程,则可以... -
WIN32练习项目(函数调用监视器)
2020-08-26 18:03:25通过内存注入方式向目标进程victim注入DLL,监视程序可以通过IAT HOOK监视目标进程调用MessageBoxA,CreateFileA,通过inline HOOK监视victim自己实现的Add函数。另外,监视程序还可以远程调用这三个函数。 二、运行... -
一文带你掌握监控进程技术实现
2021-02-28 23:55:08文章目录1.技术应用背景2.效果展示3.功能代码实现4.知识背景清单5.WMI相关概念6.WMI架构解析 1.技术应用背景 目前已知在杀毒厂商以及游戏厂商的安全对抗过程...下图展示的是开启监控程序,这是进行监控电脑上包括系统自 -
创建Windows Service,定时监控客户端服务程序
2013-11-21 11:58:45创建Windows Service,启动客户端服务程序,启动定时器,定时监控客户端服务程序是否正常,通讯方式采用WCF以及同步事件。 -
[Windows] 系统调用(R3 进入 R0)
2020-09-07 23:13:53通过 int 0x2e(软中断自陷) 或 SysEnter (快速系统调用),主动进入内核。 引发异常或硬件中断,被迫进入内核。 通过 int 0x2e 进入内核(xp以下) 一般 R3 的 API 最终都会去调用 NT 函数,在 NT 函数中根据该... -
windows终端事件日志监控指南
2019-08-22 17:30:29windows事件监控指南 推荐收集的活动日志 账户使用情况 收集和审核用户帐户信息。 跟踪本地帐户使用情况有助于安全分析人员检测传递哈希活动和其他未经授权的帐户使用情况。 还可以跟踪其他信息,例如远程桌面登录,... -
windows查看java进程详细信息的几种方法
2021-08-28 11:54:16仅查看java任务列表 ...对某个方法的调用进行定时监控。 watch 观测方法执行数据,能方便的观察到指定方法的调用情况,如:返回值、抛出异常、入参等。 $ watch cn.javastack.springbootbestpracti -
Zabbix自动监控Top10进程
2018-12-28 19:59:04简介 zabbix([`zæbiks])是一个基于WEB界面的提供分布式系统监视以及网络监视功能的... 可以直接调用键值process.resource[java,cpu_p]来监控进程 转自: http://www.51testing.com/html/05/n-4456205.html -
系统性能监控分析(Linux,Windows)
2021-12-21 10:49:22Windows系统性能分析思路和实践 4.1 性能监视器综述 4.2 性能监视器工具介绍 4.3 系统监控分析实践 4.4 资源监视器介绍和实践 5. Tomcat监控:Probe 5.1 Tomcat的常规监控项 5.2 Probe安装 5.3 Probe配置 5.4 Probe... -
hook方式进程创建监控,进程保护
2019-05-30 22:46:19关于进程创建, xp系统:CreatProcessW->CreateProcessInternalW->NtCreateProcessEx->NtCreatSection Vista以上:CCreatProcessW->CreateProcessInternalW->NtCreateUserProcess->... -
Linux用户态进程如何监控内存被写事件
2019-06-01 08:23:33上周了解到一个很好玩的问题,即 如何捕获到“一块...正好,也碰到了一个JVM踩内存的问题,就思考了一把,完成了一个简单的demo,可以 监控每一个内存写事件。 至于内存的内容是否变成特定的值,那就在每一次捕获到... -
用vs2015 C/C++创建windows守护进程
2022-04-02 10:07:05C/C++创建windows守护进程