Sec Hotspot 首页  排行榜  收藏本站  技术博客  RSS
统计信息
已收录文章数量:18849 篇
已收录公众号数量:91 个
本站文章为爬虫采集,如有侵权请告知
已收录微信公众号
阿里云先知 网安寻路人 网信中国 区块链大本营 白说区块链 区块链投资家 区块链官微 区块链铅笔Blockchain HACK学习呀 二道情报贩子 合天智汇 小白帽学习之路 小米安全中心 弥天安全实验室 SAINTSEC SecPulse安全脉搏 TideSec安全团队 360安全卫士 游侠安全网 计算机与网络安全 安全祖师爷 安全学习那些事 腾讯安全联合实验室 黑客技术与网络安全 安全圈 腾讯御见威胁情报中心 Python开发者 Python之禅 编程派 Python那些事 Python程序员 安全威胁情报 吾爱破解论坛 行长叠报 安在 i春秋 嘶吼专业版 E安全 MottoIN 网信防务 网安杂谈 数说安全 互联网安全内参 漏洞战争 安全分析与研究 邑安全 ChaMd5安全团队 天融信阿尔法实验室 安全牛 SecWiki 安全学术圈 信安之路 漏洞感知 浅黑科技 Secquan圈子社区 奇安信集团 奇安信 CERT 国舜股份 雷神众测 盘古实验室 美团安全应急响应中心 瓜子安全应急响应中心 顺丰安全应急响应中心 蚂蚁金服安全响应中心 携程安全应急响应中心 滴滴安全应急响应中心 字节跳动安全中心 百度安全应急响应中心 腾讯安全应急响应中心 网易安全应急响应中心 OPPO安全应急响应中心 京东安全应急响应中心 Bypass CNNVD安全动态 安恒应急响应中心 天融信每日安全简报 奇安信威胁情报中心 看雪学院 黑白之道 水滴安全实验室 安全客 木星安全实验室 云鼎实验室 绿盟科技安全预警 白帽汇 深信服千里目安全实验室 腾讯玄武实验室 长亭安全课堂 FreeBuf 绿盟科技 nmask
网络安全编程:结束进程
本文来自公众号:计算机与网络安全   2021.02.23 08:53:24


一次性 付费 进群, 长期 免费 索取资料。

微信群 回复公众号: 微信群 QQ群 460500587


微信公众号:计算机与网络安全

ID:Computer-network


通常情况下,让程序自行结束是最理想的状态。在进程正常进行退出时,会调用ExitProcess()函数。利用调用SendMessage()函数发送WM_CLOSE消息到目标窗口的方法,会让程序正常结束而退出。本文介绍类似任务管理器的功能,强制结束某个指定的进程。


1. 结束指定进程的示例代码


通过结束一个记事本,说明如何结束其他进程。结束记事本进程的代码如下:

#include <Windows.h>int main(int argc, char* argv[]){  HWND hNoteWnd = FindWindow(NULL, "无标题 - 记事本");  if ( hNoteWnd == NULL )  {    return -1;  }  DWORD dwNotePid = 0;  GetWindowThreadProcessId(hNoteWnd, &dwNotePid);  if ( dwNotePid == 0 )  {    return -1;  }  HANDLE hNoteHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwNotePid);  if ( hNoteHandle == NULL )  {    return -1;  }  BOOL bRet = TerminateProcess(hNoteHandle, 0);  if ( bRet == TRUE )  {    MessageBox(NULL, "结束进程成功", NULL, MB_OK);  }  CloseHandle(hNoteHandle);  return 0;}

编译连接上面的程序,然后打开一个空的记事本程序,运行这个编译好的程序,会发现记事本程序的进程被结束掉了,这里的程序弹出一个简单的对话框,提示“结束进程成功”。


2. 结束进程所需API函数说明


在上面的程序代码中,结束进程的API函数一共用到了4个,分别是FindWindow()、GetWindowThreadProcessId()、OpenProcess()和TerminateProcess()。


GetWindowThreadProcessId()函数的定义如下:

DWORD GetWindowThreadProcessId( HWND hWnd, LPDWORD lpdwProcessId);

参数说明如下。


hWnd: 窗口句柄,代码中的窗口句柄是由 FindWindow()函数获取的。


lpdwProcessId: 该参数是一个指向 DWORD 类型的指针,用户返回窗口句柄所对应的进程 ID。


GetWindowThreadProcessId()函数在得到进程 ID 后,将进程 ID 传递给 OpenProcess() 函数来得到进程的句柄。OpenProcess()函数的定义如下:

HANDLE OpenProcess( DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId);

参数说明如下。


dwDesiredAccess: 打开进程欲获得的访问权限,该参数为了方便,可以始终为 PROCESS_ALL_ACCESS。


bInheritHandle: 指定获取的句柄是否可以继承,一般选择不继承,传递值为 FALSE。


dwProcess: 指定欲打开的进程 ID 号,该进程 ID 号是由 GetWindowThreadProcessId()获得的。


该函数的返回值为进程的句柄,通过这个句柄就可以调用 TerminateProcess()函数来进行结束。TerminateProcess()函数的定义如下:

BOOL TerminateProcess( HANDLE hProcess, UINT uExitCode);

参数说明如下。


hProcess: 欲结束进程的进程句柄,该句柄已经由 OpenProcess()函数得到。


uExitCode: 进程的退出码,通常为 0 值。


通过一些列的API函数,完成了一个结束进程的程序。结束程序时的第一步是得到窗口的句柄,如果这个进程没有窗口,是不是就没有办法通过程序去结束进程了?其实还是有办法的。


从上面的3个API函数中可以看到,通过进程的窗口可以得到进程的ID,通过进程的ID可以得到进程的句柄。他们内部本身都是有关联的,因此,在需要使用相关资源时,如果不能直接得到的时候,不妨通过这样的方式逐步去得到。


参考文献:C++ 黑客编程揭秘与防范(第3版)


微信公众号:计算机与网络安全

ID:Computer-network