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

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

目录

进程基础

进程的定义与概念

进程的组成

创建进程

可执行文件

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;
      }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

有哪些好用的eHR人事系统?国内外HR软件选型指南分享

在人力资源管理信息化这个问题上&#xff0c;不同行业的企业对人力资源管理软件的需求侧重点不一样&#xff0c;并且通常企业规模决定了企业需求的强烈程度&#xff0c;以及能花在这个软件采购上的预算。 首先需要对公司需要人力资源软件的目的和基本需求加以明确。你为什么想用…

软件测试必问必背面试题

01 软件测试理论部分 1.1 测试概念 1. 请你分别介绍一下单元测试、集成测试、系统测试、验收测试、回归测试 单元测试&#xff1a;完成最小的软件设计单元&#xff08;模块&#xff09;的验证工作&#xff0c;目标是确保模块被正确的编码集成测试&#xff1a;通过测试发现与…

【Linux】探索网络编程:TCP/UDP协议解析与Socket应用实例

文章目录 前言&#xff1a;1. 预备知识1.1 理解源IP地址和目的IP地址1.2 认识端口号1.3 理解"端口号"和"进程ID"1.4 理解源端口号和目的端口号1.5 认识TCP协议1.6 认识UDP协议1.6 TCP vs UDP 可靠性1.7 网络字节序 2. socket 编程接口2.1 socket 常见API2.…

为了SourceInsight从Linux回到Windows

什么是SourceInsight 现在上网搜索这个软件&#xff0c;大多数说他是一个代码阅读软件&#xff1b;但是在官方的说法里面&#xff0c;这是一款支持多语言的编辑器。大概长这样&#xff1a; 看起来十分老旧是吧&#xff0c;但是他其实他已经是第四代了哈哈哈。其实这个软件是我…

LeetCode 全排列

思路&#xff1a;这是一道暴力搜索问题&#xff0c;我们需要列出答案的所有可能组合。 题目给我们一个数组&#xff0c;我们很容易想到的做法是将数组中的元素进行排列&#xff0c;如何区分已选中和未选中的元素&#xff0c;容易想到的是建立一个标记数组&#xff0c;已经选中的…

开发电商ERP系统需要接入哪些平台API?

跟随全渠道发展趋势&#xff0c;很多实体商家开设电商店铺&#xff0c;为消费者提供便捷的购物体验&#xff0c;增强消费者的满意度&#xff0c;同时也提升了企业自身的市场竞争力。为了满足商家业务拓展需求&#xff0c;很多原本主要服务于实体商贸企业的ERP服务商&#xff0c…

vim快捷键 提高工作效率

目录 1. :set nu 显示行号 :set nonu 取消显示行号 2. End 快速移动光标到行尾 3. Home 快速移动光标到行首 4. 10G 快速移动光标到第10行 5. G 快速到文件的底部 6. 1G 快速到第一行 &#xff08;gg&#xff09; 7. …

[Mysql] 的基础知识和sql 语句.教你速成(下)——数据库的约束篇

目录 前言 约束 一.我们为什么需要约束 二.常见的约束类型 NOT NULL 约束 UNIQUE 约束 DEFAULT 约束 PRIMARY KEY FOREIGN KEY CHECK约束 原因&#xff1a; 结尾 前言 距离上篇的更新已经快两周了,这个时候大伙都已经考完了吧!现在更新多少有点马后炮,但是没办法呀…

Kubernetes基于helm安装 harbor

Kubernetes基于helm安装 harbor 之前harbor的安装都是借助docker完成一键安装部署&#xff0c;安装完成之后harbor组件均运行到一台机器上面&#xff0c;本文实践harbor在k8s环境中的部署。 准备工作 根据harbor官方要求&#xff1a; Kubernetes cluster 1.20Helm v3.2.0 …

精准定位推广盲点?Xinstall数据监测让每一分投入都见成效!

在这个数字化时代&#xff0c;App的推广早已不再是简单的“上线即成功”。面对激烈的市场竞争和日益挑剔的用户&#xff0c;如何精准监测推广数据&#xff0c;优化营销策略&#xff0c;成为了每个开发者与营销人员不得不面对的挑战。而在这个关键时刻&#xff0c;Xinstall作为一…

shark云原生-日志体系-filebeat高级配置(适用于生产)

文章目录 1. filebeat.inputs 静态日志收集器2. filebeat.autodiscover 自动发现2.1. autodiscover 和 inputs2.2. 如何配置1.2.1. Providers 提供者1.2.2. Providers kubernetes templates1.2.3. 基于提示&#xff08;hints&#xff09;的自动发现支持的 **hints**的完整列表&…

2024 AI工程师世界博览会

6月24日至6月27日在旧金山举行的 AI 工程师世界博览会是AI 从业者和爱好者的首要活动之一。本次年度会议展示了人工智能技术的最新进展&#xff0c;并提供了对行业趋势的宝贵见解。 模型不是壁垒 大型语言模型&#xff08;LLMs&#xff09;的快速发展是会议的中心主题。OpenAI…

element-ui Tree之懒加载叶子节点强制设置父级半选效果

效果&#xff1a; 前言&#xff1a; 我们是先只展示一级的&#xff0c;二级的数据是通过点击之后通过服务器获取数据&#xff0c;并不是全量数据直接一起返回回来的。 问题&#xff1a; 当你设置了默认选中的子节点&#xff0c;但是由于刚进入页面此时tree中数据暂是没有这个…

深入解读:如何解决微调扩散模型时微调数据集和训练数据集之间的差距过大问题?

Diffusion Models专栏文章汇总&#xff1a;入门与实战 前言&#xff1a;在微调扩散模型的时候经常会遇到微调数据集和训练数据集之间的差距过大&#xff0c;导致训练效果很差。在图像生成任务中并不明显&#xff0c;但是在视频生成任务中这个问题非常突出。这篇博客深入解读如何…

代码随想录算法训练营第69天:图论7[1]

代码随想录算法训练营第69天&#xff1a;图论7 109. 冗余连接II 卡码网题目链接&#xff08;ACM模式&#xff09;(opens new window) 题目描述 有向树指满足以下条件的有向图。该树只有一个根节点&#xff0c;所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节…

5分钟读懂GPS-RTK实时动态技术,建议收藏!

由于”智慧工地“理念的兴起和发展&#xff0c;目前越来越多的企业将信息技术手段融合于施工现场安全管理&#xff0c;构建智能化的安全监管模式。基于此&#xff0c;蓝牙LORA融合定位技术、UWB超宽带定位技术、GPS-RTK定位技术等信息技术也越来越频繁出现在大众视野。然而&…

单片机软件架构连载(4)-结构体

枚举、指针、结构体&#xff0c;我愿称为C语言"三板斧"。 用人话来讲&#xff0c;几乎所有c语言高阶编程&#xff0c;都离不开这这3个知识点的应用。 今天站在实际产品常用的角度&#xff0c;给大家讲一下结构体。 1.结构体概念 结构体可以用来构建更复杂的数据结…

Diffusion模型的微调和引导

留意后续更新&#xff0c;欢迎关注微信公众号&#xff1a;组学之心 Diffusion模型的微调和引导 微调&#xff08;fine-tuning&#xff09;&#xff1a; 从一个已经训练过的模型开始训练&#xff0c;我们就可以从一个学会如何“去噪”的模型开始训练&#xff0c;相对于随机初始…

c++:动态内存变量

典型的C面向对象编程 元素 (1)头文件hpp中类的定义 (2)源文件cpp中类的实现&#xff08;构造函数、析构函数、方法&#xff09; (3)主程序 案例 (1)用C来编程“人一天的生活” (2)“人”的属性&#xff1a;name、age、male (3)“人”的方法&#xff1a;eat、work(coding/shop…

【免费可视化工具】助力风电行业智能化管理

在绿色能源日益成为全球共识的今天&#xff0c;风电作为清洁能源的重要组成部分&#xff0c;正以前所未有的速度发展。然而&#xff0c;随着风电场规模的扩大和数量的增加&#xff0c;如何高效、直观地管理和监控风电资源成为了一个亟待解决的问题。 而山海鲸可视化这款免费可…