【Rust调用Windows API】杀掉指定进程(包括兄弟进程、子进程、父进程)

前言

前面一篇文章写了使用Rust调用Windows API 获取正在运行的全部进程信息 ,本篇实现杀掉指定进程。

通过标准库可以管理当前进程创建的子进程,要 kill 掉子进程也比较容易,这里不赘述了,主要实现通过调用Windows API来杀掉兄弟进程、子进程,甚至通过提权可以杀掉父进程。

依赖

进程管理主要用到 processthreadsapi.h 头文件,详细的接口文档请前往微软官方文档查看。

Cargo.toml中添加 processthreadsapi 这个feature

winapi = { version = "0.3.9", features = ["processthreadsapi"] }

实现

大致步骤

  1. 获取指定进程的文件句柄
  2. 杀掉进程
  3. 释放进程句柄

提权:本篇只讲最简单的用户操作提权方法,调用Windows API提权的实现见本系列《Rust调用Windows API》后面的文章

获取进程句柄

进程句柄的获取需要调用 OpenProcess 这个函数

pub fn OpenProcess(dwDesiredAccess: DWORD,bInheritHandle: BOOL,dwProcessId: DWORD,
) -> HANDLE;

这个函数需要传入三个参数,主要关注第一个和第三个参数

  • dwDesiredAccess:对该进程的访问权限,多个权限用或位运算符|拼接,全部权限见官方文档。特例:如果调用方进程拥有并开启了 SeDebugPrivilege特权,此参数可以忽略,后续提权的方案也是通过获得该特权来实现对任意进程的完全访问,一般进程是没有这个特权的。
  • dwProcessId:指定进程的描述符,也就是进程PID

OpenProcess这个函数在日常开发中使用的频率是比较高的,每次使用需要的权限也不固定,因此这里我将第一个参数向外抛出,由调用方指定,下面是Rust调用实现

use winapi::shared::minwindef::DWORD;
use winapi::um::winnt::HANDLE;
use winapi::um::errhandlingapi::GetLastError;
use winapi::um::processthreadsapi::OpenProcess;fn open_process(pid: DWORD, access_privilege: DWORD) -> Result<HANDLE, String> {unsafe {// https://learn.microsoft.com/zh-cn/windows/win32/api/processthreadsapi/nf-processthreadsapi-openprocesslet handle = OpenProcess(access_privilege, 0, pid);if handle.is_null() {//  https://learn.microsoft.com/zh-cn/windows/win32/debug/system-error-codes--0-499-return Err(format!("Could not open process {}, code: {}", pid, GetLastError()));}Ok(handle)}
}

杀掉进程

上一步获得了进程的句柄,直接调用 TerminateProcess 函数就可以了,在Rust中定义如下:

pubfn TerminateProcess(hProcess: HANDLE,uExitCode: UINT,
) -> BOOL;

参数解释:

  • hProcess:需要杀掉进程的句柄,前面通过 OpenProcess 获得
  • uExitCode:被杀掉进程的退出代码,和平时调用 exit(0) 传入的 0 含义一样,在winapi中通过 GetExitCodeProcess 函数可以查出被杀掉进程的退出代码

Rust调用实现:

use winapi::um::winnt::HANDLE;
use winapi::um::errhandlingapi::GetLastError;
use winapi::um::processthreadsapi::TerminateProcess;fn kill_process(process_handle: HANDLE) -> Result<(), String> {unsafe {//  https://learn.microsoft.com/zh-cn/windows/win32/api/processthreadsapi/nf-processthreadsapi-terminateprocesslet success = TerminateProcess(process_handle, 0);if success == 0 {CloseHandle(process_handle);return Err(format!("Could not terminate process, code: {}", GetLastError()));}CloseHandle(process_handle);Ok(())}
}

测试

下面写个简单的测试程序验证一下

pub fn test_kill() {print!("Please enter the PID of the process to be queried: ");stdout().flush().unwrap();let mut input = String::new();stdin().read_line(&mut input).unwrap();let pid = input.trim().parse::<i64>().unwrap() as DWORD;let process_handle = open_process(pid, PROCESS_TERMINATE).unwrap();print!("Are you sure you want to kill this process? (y/n): ");stdout().flush().unwrap();input.clear();stdin().read_line(&mut input).unwrap();if input.trim().eq("y") {match kill_process(process_handle) {Ok(_) => println!("Killed"),Err(e) => {eprintln!("Failed to kill process, code: {}", e);input.clear();stdin().read_line(&mut input).unwrap();}}} else {println!("Ignored")}
}fn main() {test_kill();
}

然后在任务管理器中挑一个你当前用户启动的进程,例如我当前登录的用户是 Administrator,选 Everthing.exe 这个进程来测试杀掉它。

注意不能选用户名为SYSTEM的进程,前面有提到其他用户启动的进程或者守护进程或者系统进程需要有特殊权限才能杀掉,需要提权才能杀掉。

在这里插入图片描述
启动测试程序
在这里插入图片描述

再去任务管理器看发现已经不存在 Everthing.exe 这个进程了

提权

尝试不提权杀SYSTEM进程

依旧使用前面的测试程序,我们来尝试杀掉一个 SYSTEM 启动的进程。

注意!!!!! 这一步我们肯定是杀不掉的,因为没有提权处理,但下一步提权后就能真正杀死它了,要谨慎选择要被杀掉的进程,尽量选择一个无关紧要且自己很清楚怎么恢复的进程,否则操作失误可能导致你的电脑瘫痪!!!

这里我选向日葵的客户端,它即使被杀掉也没有太大关系,重新打开向日葵就可以恢复它。

在这里插入图片描述

再次执行前面的测试程序,发现提示了一个code为 5 的系统代码,这个代码就是指访问被拒绝,更多的系统代码见 官方系统错误代码文档

在这里插入图片描述

提权后杀SYSTEM进程

注意:这里只讲最简单的提权方式之一,代码提权方式见后续文章

先把测试进程打包成可执行程序

cargo build --release

第一次打包需要一两分钟编译时间,耐心等待一下,后续打包会使用缓存就很快了,打包完可执行程序就在 你的工程目录/target/release 下,例如我这里的程序叫 rust-learning.exe

右击它选择以管理员身份运行,管理员拥有最高权限,这也是最简单的一种提权方式,这里仅用这种方式验证提权带来的效果

在这里插入图片描述

系统会向你询问是否以管理员运行,然后输入前面的SYSTEM进程PID,这次就可以成功杀掉了

在这里插入图片描述

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

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

相关文章

基于Python的外卖点餐系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

世界坐标系、相机坐标系、图像物理坐标系、像素平面坐标系

坐标系及其转换在计算机视觉领域占据核心地位。理解如何从一个坐标系转换到另一个坐标系&#xff0c;不仅是理论上的需要&#xff0c;也是实际应用中不可或缺的技能。 一、世界坐标系的定义 世界坐标系是一个全局的坐标系统&#xff0c;用于定义场景中物体的位置。在这个坐标…

Pycharm也可以用来查看和操作MySQL数据库?

1.首先确保自己的电脑安装好MySQL MySQL :: Download MySQL Community Server 2.在创建project界面选择Open 打开并选择自己存放sql文件的路径 完成后的效果 3.创建好数据库的连接 4.打开Database视窗 5.给数据库添加新的Schema 6.运行需要查看或者操作的sql文件 7.选择适合的…

1、VMware12安装ubuntu18.04

1、ubuntu18地址获取&#xff1a; Index of /ubuntu-releases/18.04/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2、安装过程&#xff1a; 1、新建虚拟机 2、选择稍后安装操作系统 3.客户机操作系统选择Linux&#xff0c;版本选择Ubuntu 64位 4、点击“自定义…

数据结构查找-哈希表(创建+查找+删除)+(C语言代码)

#include<stdlib.h> #include<stdio.h> #include<stdbool.h> #define NULLKEY -1//单元为空 #define DELKEY -2//单元内容被删除 #define M 20 typedef struct {int key;//关键字int count;//统计哈希冲突探测次数 }HashTable; //插入到哈希表 void InsertHT…

基于Java的周次生成工具类实现

摘要&#xff1a; 本文介绍了一个基于Java的周次生成工具&#xff0c;用于根据指定的年份和周次类型&#xff08;自然周或财务周&#xff09;生成连续的周次列表数据。 需求描述&#xff1a; 根据周次类型&#xff0c;生成连续的周次列表数据。 周次类型分2种&#xff1a; …

为什么华大严选基因是您的最佳选择?品牌特色全解析

《为什么华大严选基因是您的最佳选择&#xff1f;品牌特色全解析》 在当今基因检测市场竞争激烈的环境下&#xff0c;华大严选基因以其卓越的品质和独特的品牌特色脱颖而出&#xff0c;成为众多消费者的首选。作为 DNA 基因检测行业十佳优质品牌和 3・15 重点推荐品牌&#xff…

中仕公考怎么样?国考有三不限岗位吗?

国考有三不限岗位吗? “三不限”岗位&#xff0c;即不限制专业、学历和户籍的岗位。国考中几乎没有“三不限”岗位。因为公务员国考的报考条件通常较为严格&#xff0c;尤其是不限制条件的职位更少见&#xff0c;所以国考中一般是没有三不限岗位的。 与省考公务员不同的是&a…

Day44 | 动态规划 :状态机DP 买卖股票的最佳时机IV买卖股票的最佳时机III

Day44 | 动态规划 &#xff1a;状态机DP 买卖股票的最佳时机IV&&买卖股票的最佳时机III&&309.买卖股票的最佳时机含冷冻期 动态规划应该如何学习&#xff1f;-CSDN博客 本次题解参考自灵神的做法&#xff0c;大家也多多支持灵神的题解 买卖股票的最佳时机【…

inode,请别忽视它!

在Linux文件系统中&#xff0c;inode 是一个不可忽视的核心概念。它不仅是文件系统运行的基石&#xff0c;还在内核、应用程序以及驱动程序开发中扮演着重要角色。如果你曾对文件的底层运作感到困惑&#xff0c;或者在面试中遇到文件系统相关问题&#xff0c;那么理解inode绝对…

x-cmd pkg | howdoi - 无需打开浏览器,轻松搜索编程问题的解决方案

目录 简介首次用户技术特点竞品和相关项目进一步阅读 简介 howdoi 一个在终端中查找编程问题的命令行工具和 python 库&#xff0c;可用于从 Stack Overflow 等编程社区获取搜索问题的答案&#xff0c;并将它们以代码片段的形式显示在命令行中。 首次用户 本文提供了一个dem…

实测运行容器化Tomcat服务器

文章目录 前言一、拉取Tomcat 9.0镜像二、运行容器化Tomcat服务器三、访问Tomcat官网首页测试 总结 前言 运行容器化Tomcat服务器&#xff0c;首先确保正确安装docker&#xff0c;并且已启动运行&#xff0c;具体安装docker方法见笔者前面的博文《OpenEuler 下 Docker 安装、配…

Enhanced Table如何安装?

githup项目地址&#xff1a; https://github.com/fbaligand/kibana-enhanced-table/releases/tag/v1.12.0

R门 - rust第一课陈天 -内存知识学习笔记

内存 #mermaid-svg-1NFTUW33mcI2cBGB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1NFTUW33mcI2cBGB .error-icon{fill:#552222;}#mermaid-svg-1NFTUW33mcI2cBGB .error-text{fill:#552222;stroke:#552222;}#merm…

品融电商:新形势下电商平台如何助力品牌长期经营

品融电商&#xff1a;新形势下电商平台如何助力品牌长期经营 在过去几年中&#xff0c;随着内容电商的兴起&#xff0c;一批新兴品牌通过精准的内容种草和互动营销迅速打开市场&#xff0c;实现了从“0到1”的品牌起步阶段。比如&#xff0c;新品牌SIINSIIN通过小红书等内容电商…

C语言中操作符详解(下)

C语言中操作符详解_下 放在最前面的1、条件操作符&#xff08;三目操作符&#xff09;1.1、定义1.2、举例分析&#xff1a;&#xff08;上代码&#xff09;输出结果&#xff1a;代码的解释&#xff1a; 2、逗号表达式2.1、定义2.2、举例分析&#xff1a;&#xff08;上代码&…

渐进式JavaScript框架Vue 3 入门

目录 前言1. Vue 3 的基础入门1.1 什么是 Vue.js1.2 局部使用 Vue 2. Vue 3 的基本配置2.1 准备 HTML 页面并引入 Vue 模块2.2 创建 Vue 应用实例 3. Vue 的数据绑定与界面渲染3.1 插值表达式 4. 常用指令详解4.1 v-for 指令&#xff1a;列表渲染4.2 v-bind 指令&#xff1a;绑…

LeetCode105.从前序与中序遍历构造二叉树

题目要求 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 提示: 1 < preorder.length < 3000inorder.length preorder.length-3000 < pr…

css-50 Projects in 50 Days(3)

html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>旋转页面</title><link rel"sty…

基于STM32单片机多路无线射频抢答器

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、资料内容 前言 随着科技的不断进步和各类竞赛活动的日益增多&#xff0c;抢答器作为一种重要的竞…