WIN32核心编程 - 进程操作(一) 进程基础 - 创建进程 - 进程句柄

news2024/12/25 10:03:09

  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> 链接点击跳转博客主页

目录

进程基础

进程的定义与概念

进程的组成

创建进程

可执行文件

CreateProces

执行流程

GetStartupInfo

进程终止 

进程句柄

创建进程

打开进程

进程提权

内核模拟

回溯对象

自身进程

 


  • 进程基础

    • 进程的定义与概念

      • 什么是进程?

      • 进程可以被定义为一个执行中程序的实例。

      • 进程提供了程序执行所需的所有资源和环境。

      • 进程与程序的区别

      • 程序是一组指令和静态数据的集合,它是存储在磁盘或其他永久存储设备上的一个文件。

      • 进程,与之相对,是程序的动态执行实例。程序本身不执行任何操作;当它被操作系统加载到内存并开始执行时,它变成一个或多个进程。

    • 进程的组成

      • 进程内存布局(代码段、数据段、堆、栈等)

      • 代码段(Text Segment)

        • 也称为文本区域,包含程序的可执行代码。

        • 通常是只读的,以防止程序自我修改。

      • 数据段(Data Segment)

        • 存储程序中的全局变量和静态变量。

        • 根据变量是否初始化分为初始化的数据段和未初始化的数据段(BSS)。

      • 堆(Heap)

        • 用于动态内存分配,如C中的malloc或C++中的new操作。

        • 堆的大小可以在运行时动态扩展和收缩。

      • 栈(Stack)

        • 存储函数的局部变量、函数参数、返回地址等。

        • 每当调用新函数时,系统会自动在栈上分配空间。函数返回时,相应的栈空间被释放。

      • 进程上下文和环境

      • 包含了操作系统用于管理和调度进程的所有信息。这包括进程的状态(运行、就绪、等待)、程序计数器、寄存器内容、打开的文件描述符、安全属性、进程ID等。

创建进程

  • 可执行文件

    • Windows 平台的可执行文包括exe、dll、sys 等扩展名的文件。

      • exe是指可执行(executable),创建进程必须使用exe 文件。

      • dll是动态链接库,一些基础、共用的代码和数据存在于 d1l文件中。

      • sys 是内核驱动程序。

      • Windows 平台的可执行文件基本都是PE格式的。

  • CreateProces

    • #include <iostream>
      #include <Windows.h>
      
      int main()
      {
      	STARTUPINFO si;
      	PROCESS_INFORMATION pi;
      	ZeroMemory(&si, sizeof(si));
      	ZeroMemory(&pi, sizeof(pi));
      	si.cb = sizeof(si);
      
      	TCHAR szCmd[] = TEXT("notepad.exe \"123.txt\"");
      
      	CreateProcess(
      		/*TEXT("C:\\Windows\\System32\\notepad.exe")*/NULL,
      		szCmd,
      		NULL,
      		NULL,
      		FALSE,
      		CREATE_NEW_CONSOLE,
      		NULL,
      		NULL,
      		&si,
      		&pi);
      
      	return 0;
      }
  • 执行流程

    • 进程的启动过程

      • 进程的启动通常是由用户发起的一个事件,如双击应用程序图标、从命令行运行可执行文件、系统启动时自动运行等。

      • 用户行为或触发事件:用户通过各种方式请求启动一个程序,如通过用户界面或命令行。

      • 操作系统响应:操作系统响应这一请求,调用相关系统函数例如 CreateProcessShellExecute 等。

      • 创建进程对象:操作系统分配进程标识符(PID),创建进程所需的内核对象和数据结构。

      • 分配资源:为新进程分配内存,打开必需的系统资源和文件。

      • 创建主线程:操作系统创建进程的主线程,并将其指向程序的入口点。

      • 开始执行:主线程开始执行,加载程序代码到内存,初始化程序,开始执行程序指令。

      • 加载需要的动态链接库:程序如果依赖于其他动态链接库(DLLs),操作系统将它们加载到进程空间中。

      • 执行完成:主线程执行完成后,它将退出。如果是多线程程序,所有线程都结束后,进程才真正结束。

    • 主线程和工作线程

      • 当一个进程启动时,操作系统会创建一个线程来执行程序代码,这个线程被称为主线程。在多线程程序中,除了主线程外,还可以创建额外的线程,这些线程称为工作线程。

      • 主线程:

        • 是程序执行的入口点。

        • 负责执行程序初始化和调用其他线程。

        • 主线程结束时,通常意味着进程的结束。

      • 工作线程:

        • 是由主线程显式创建的用于执行特定任务的线程。

        • 可以同时执行多个任务,与主线程并行工作。

        • 可以提高应用程序性能,尤其是在多核处理器上运行时。

  • GetStartupInfo

    • #include <iostream>
      #include <Windows.h>
      
      int main()
      {
      	STARTUPINFO si = { sizeof(si) };
      	GetStartupInfo(&si);
      
      	return 0;
      }

进程终止 

  • 进程终止是操作系统中进程生命周期的最后一个阶段。
    • ExitProcess
      • #include <iostream>
        #include <Windows.h>
        
        /*
        	void ExitProcess
        	(
        		[in] UINT uExitCode //进程和所有线程的退出代码
        	);
        
        */
        
        int main()
        {
        	//结束自身
        	ExitProcess(0/*GetExitCodeProcess*/);
        
        	return 0;
        }
    • TerminateProcess
      • #include <iostream>
        #include <Windows.h>
        
        /*
        	
        	BOOL TerminateProcess
        	(
        		[in] HANDLE hProcess,		//终止进程句柄
        		[in] UINT   uExitCode		//进程退出代码
        	);
        
        */
        
        int main()
        {
        	STARTUPINFO si = { 0 };
        	si.cb = sizeof(si);
        	PROCESS_INFORMATION pi = { 0 };
        
        	BOOL bRet = CreateProcess(
        		TEXT("D:\\Debug\\PE_Die\\die.exe"),
        		NULL,
        		NULL,
        		NULL,
        		FALSE,
        		CREATE_NEW_CONSOLE,
        		NULL,
        		NULL,
        		&si,
        		&pi
        	);
        	if (bRet == 0) return 0;
        	system("pause");
        
        	TerminateProcess(pi.hProcess, 0/*GetExitCodeProcess*/);
        
        	return 0;
        }

进程句柄

  • 创建进程

    • CreateProcess - ProcessInformation - ProcessHandle

      typedef struct _PROCESS_INFORMATION {
      HANDLE hProcess;     //新创建进程的句柄。 
      HANDLE hThread;      //新创建的进程的主线程的句柄。 
      DWORD dwProcessId;   
      DWORD dwThreadId;
      } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
      
  • 打开进程

    • OpenProcess

      • 打开一个已经存在的进程并获取对应进程句柄。
      • #include <iostream>
        #include <Windows.h>
        
        int main()
        {
        	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 2036/*进程ID*/);
        	if (hProcess != NULL)
        	{
        		if (!TerminateProcess(hProcess, 0))
        		{
        			std::cout << GetLastError() << std::endl;
        		}
        	}
        
        	return 0;
        }

  • 进程提权

    • OpenProcessToken;

    • LookupPrivilegeValue;

    • AdjustTokenPrivileges;

    #include <iostream>
    #include <Windows.h>
    
    int main()
    {
        HANDLE hProcess = NULL;
        HANDLE hToken = NULL;
        LUID luid = { 0 };
        TOKEN_PRIVILEGES tp = { 0 };
    
        if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
        {
            std::cout << "OpenProcessToken ErrorCode -> " << GetLastError() << std::endl;
            return 0;
        }
    
        if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
        {
            std::cout << "LookupPrivilegeValue ErrorCode -> " << GetLastError() << std::endl;
            return 0;
        }
    
        tp.PrivilegeCount = 1;
        tp.Privileges[0].Luid = luid;
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    
        AdjustTokenPrivileges(
            hToken,
            FALSE,
            &tp,
            sizeof(TOKEN_PRIVILEGES),
            NULL,
            NULL);
    
        if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
        {
            return 0;
        }
    
        return 0;
    }
    

        

内核模拟

  • 示例代码
#include <iostream>
#include <Windows.h>

int main()
{
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 2576/*进程ID*/);
    if (hProcess != NULL)
    {
        printf("%x \r\n", hProcess);
        system("pause");
    }

    return 0;
}
  • 定位进程

  • 查找句柄

        

回溯对象

自身进程

  • GetCurrentProcess
    • #include <iostream>
      #include <Windows.h>
      
      int main()
      {
      	HANDLE hProcess = GetCurrentProcess();
      	TerminateProcess(hProcess, 0);
      	return 0;
      }
  • GetCurrentProcessId
    • #include <iostream>
      #include <Windows.h>
      
      int main()
      {
      	DWORD dwPid = GetCurrentProcessId();
      	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
      	TerminateProcess(hProcess, -1);
      
      	return 0;
      }

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

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

相关文章

iOS App 测试环境升级,遇到的问题以及解决方法

iOS App 测试环境升级&#xff0c;遇到的问题以及解决方法 Mac 实体机升级到 Sonima 14.5 Xcode 升级到 15.3 问题1&#xff1a; Xcode 编译 WebDriverAgent 失败 尝试下载 最新版本的WDA 源码编译&#xff0c;可以编译成功。 问题2&#xff1a;具体坐标直接点击的代码都会报错…

简洁纯文字类的Typecho主题wenso

主题介绍 文章说说类博客网站源码&#xff0c;页面清新简洁。适合文章说说美文博客网站建站使用&#xff0c;响应式手机版本。 本来是dedecms的模板&#xff0c;也比较简单&#xff0c;适合用来搭建一个文学类的&#xff0c;纯文字的网站&#xff0c;简单的改成了typecho&…

nccl 04 nvidia 官方小程序

1&#xff0c;代码重新编辑 为了地毯式地检查结果的正确性&#xff0c;这里修改了代码 主要步骤为 step1: data_p指向的空间中&#xff0c;分别生成随机数&#xff1b; step2: 分别拷贝到gpu的sendbuff的显存中&#xff1b; step3: 通过nccl_all_reduce sum&#xff1b;…

职场办公受欢迎的电脑桌面便签,手机电脑同步的备忘录

在快节奏的职场生活中&#xff0c;有效的时间管理和信息记录变得尤为重要。为了帮助大家更好地应对工作挑战&#xff0c;好用的电脑桌面便签和手机电脑同步的备忘录&#xff0c;好用便签应运而生&#xff0c;成为了当前职场办公中的得力助手。 好用便签是一款备受青睐的电脑桌…

香橙派AIpro实测:YOLOv8便捷检测,算法速度与运行速度结合

香橙派AIpro实测&#xff1a;YOLOv8便捷检测&#xff0c;算法速度与运行速度结合 文章目录 香橙派AIpro实测&#xff1a;YOLOv8便捷检测&#xff0c;算法速度与运行速度结合一、引言二、香橙派AIpro简介三、YOLOv8检测效果3.1 目标检测算法介绍3.1.1 YOLO家族3.1.2 YOLOv8算法理…

Node.js 入门

目录 定义 什么是前端工程化&#xff1f; Node.js 为何能执行 JS&#xff1f; Node.js 安装 使用 Node.js fs 模块 - 读写文件 path 模块 - 路径处理 案例 - 压缩前端 html URL 中的端口号 常见的服务程序 http 模块-创建 Web 服务 浏览时钟&#xff08;案例&#x…

2024最新中级会计职称考试全科题库资料。

1.根据消费税法律制度的规定&#xff0c;下列各项中&#xff0c;属于消费税征税范围的是&#xff08;&#xff09;。 A.汽车轮胎 B.食用酒精 C.铂金首饰 D.体育上用的发令纸 答案&#xff1a;C 解析&#xff1a;选项ABD均不属于消费税的征税范围。 2.甲企业&#xff08;…

2024亚太杯中文赛B题全保姆教程

B题 洪水灾害的数据分析与预测 问题 1. 请分析附件 train.csv 中的数据&#xff0c;分析并可视化上述 20 个指标中&#xff0c;哪 些指标与洪水的发生有着密切的关联&#xff1f;哪些指标与洪水发生的相关性不大&#xff1f;并 分析可能的原因&#xff0c;然后针对洪水的提前预…

基于Arduino平台开源小车的初步使用体验

创作原因&#xff1a;偶然有机会接触到基于Arduino平台的开源智能小车&#xff0c;初步使用后与大家分享。因使用时间不常&#xff0c;可以纯当个乐子看看&#xff0c;感谢大家的阅读&#xff01; 图&#xff1a;一款基于Arduino平台的开源小车 一、开发环境 Misly&#xff1…

两个Activity之间切换时UI部分重叠

书籍 《第一行代码 Android》第三版 开发 环境 Android Studio Jellyfish | 2023.3.1 setContentView android studio自动生成的SecondActivity.kt中自动生成的代码中已经绑定了second_layout.xml的布局资源&#xff0c;通过代码&#xff1a;setContentView(R.layout.secon…

tkinter给按钮设置背景图片

tkinter给按钮设置背景图片 效果代码 效果 代码 import tkinter as tk from PIL import Image, ImageTk# 创建主窗口 root tk.Tk() root.title("按钮背景图片示例")# 加载图片 image Image.open("new.png") photo ImageTk.PhotoImage(image)# 创建按钮…

比Proxmox VE更易用的免费虚拟化平台

之前虚拟化一直玩Proxmox VE&#xff0c;最近发现一个更易用的虚拟化软件CSYun&#xff0c;他与Proxmox VE类似&#xff0c;都是一个服务器虚拟化平台。它不像VMware ESXi那么复杂&#xff0c;对于个人使用者和中小企业是一个比较好的选择。 这个软件所在的网址为&#xff1a;…

Nuxt3 的生命周期和钩子函数(十)

title: Nuxt3 的生命周期和钩子函数&#xff08;十&#xff09; date: 2024/6/30 updated: 2024/6/30 author: cmdragon excerpt: 摘要&#xff1a;本文详细介绍了Nuxt3框架中的五个webpack钩子函数&#xff1a;webpack:configResolved用于在webpack配置解析后读取和修改配置…

PCL从理解到应用【02】PCL环境安装 | PCL测试| Linux系统

前言 本文介绍在Ubuntu18.04系统中&#xff0c;如何安装PCL。 源码安装方式&#xff1a;pcl版本1.91&#xff0c;vtk版本8.2.0&#xff0c;Ubuntu版本18.04。 安装好后&#xff0c;可以看到pcl的库&#xff0c;在/usr/lib/中&#xff1b; 通过编写C代码&#xff0c;直接调用…

2.8亿东亚五国建筑数据分享

数据是GIS的血液&#xff01; 我们现在为你分享东亚5国的2.8亿条建筑轮廓数据&#xff0c;该数据包括中国、日本、朝鲜、韩国和蒙古5个东亚国家完整、高质量的建筑物轮廓数据&#xff0c;你可以在文末查看领取方法。 数据介绍 虽然开源的全球的建筑数据已经有微软的建筑数据…

​埃文科技受邀出席2024 “数据要素×”生态大会​

2024“数据要素”生态大会&#xff08;以下简称“大会”&#xff09;于2024年6月30日在河南省郑州市举办。大会在国家数据局、河南省人民政府等单位的指导下&#xff0c;由中国经济体制改革研究会、中国电子信息产业集团有限公司、郑州市人民政府等共同主办。大会主题为“加快数…

C++字体库开发之字体回退三

代码片段 class FontCoverage { public: using SP std::shared_ptr<FontCoverage>; virtual ~FontCoverage() default; virtual void set(int index, FontTypes::CoverageLevel level) 0; virtual FontTypes::Coverag…

架构 | 数据归档

INDEX 1 通用思路2 快速归档3 归档整体流程&#xff08;完整归档 & 快速归档&#xff09;4 准备阶段4.1 确认归档表4.2 思路&#xff1a;确认归档数据范围 & 归档方案待选&#xff08;重点&#xff09;4.3 归档方式选择 & 业务场景覆盖4.4 确认归档数据范围 & …

Spring源码十:BeanPostProcess

上一篇Spring源码九&#xff1a;BeanFactoryPostProcessor&#xff0c;我们看到ApplicationContext容器通过refresh方法中的postProcessBeanFactory方法和BeanFactoryPostProcessor类提供预留扩展点&#xff0c;他可以在Spring容器的层面对BeanFactroy或其他属性进行修改&#…

微信小程序遮罩层显示

效果展示&#xff1a; wxml页面&#xff1a; <view classmodal-mask wx:if{{showModal}}><view class"modal-container"><view classmodal-content></view><view classmodal-footer bindtap"closeImage">//这个/images/ind…