创建线程的方式打开记事本

news2024/11/24 14:29:45

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验


今天操作系统课老师讲到进程,提出了一个有趣的小实验:能否以系统调用的方式利用 Windows 创建进程的系统调用函数来打开一个软件。闲着蛋疼的我立马来了兴趣,姑且写一个玩玩(


头文件


  • <windows.h>:包含了 Windows API 的核心功能。
  • <tchar.h>:提供了一种跨平台的方式来处理 UnicodeANSI 字符集,防止出现一些编码错误。
  • <cstdio>:包含了 C 标准输入输出函数的声明。

CreateThread


CreateThread Windows API 中的一个函数,用于创建一个新的线程。

这就是我们程序的核心函数,其函数的原型如下:

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES   lpThreadAttributes,
  SIZE_T                  dwStackSize,
  LPTHREAD_START_ROUTINE  lpStartAddress,
  LPVOID                  lpParameter,
  DWORD                   dwCreationFlags,
  LPDWORD                 lpThreadId
);

参数说明:

  • lpThreadAttributes:指向 SECURITY_ATTRIBUTES 结构的指针,用于指定新线程的安全性。可以设置为 NULL,表示使用默认的安全性。
  • dwStackSize:指定新线程的堆栈大小。可以设置为 0 0 0,表示使用默认的堆栈大小。
  • lpStartAddress:指向线程函数的指针,表示新线程的入口点。线程函数的原型为DWORD WINAPI ThreadProc(LPVOID lpParameter),其中lpParameter为传递给线程函数的参数。
  • lpParameter:传递给线程函数的参数,可以是任意类型的指针。
  • dwCreationFlags:指定线程的创建标志。可以设置为 0 0 0,表示无特殊标志。
  • lpThreadId:指向DWORD类型变量的指针,用于接收新线程的标识符。

即:CreateThread 函数创建一个新的线程,并返回该线程的句柄。如果创建线程成功,返回值为线程的句柄;否则返回值为 NULL

句柄

  • 有趣的是,在 Windows 里并没有进程层次的概念,所有进程的地位都是相同的。
  • 在创建进程时,父进程会得到一个特别令牌(句柄),用于控制子进程。
  • 该令牌是可以传递的,即父进程有权将该令牌传递给其他进程,以至于不存在了进程层次的概念。

注意

  • 新线程的入口点是通过 lpStartAddress 参数指定的线程函数。线程函数在新线程中执行,可以执行各种任务。
  • 线程函数的返回值是一个 DWORD 类型的值,表示线程的退出码。
  • 通过 CreateThread 函数创建的线程是可执行的,它可以并发地与其他线程执行,但线程的执行顺序和调度由操作系统决定。
  • 在使用CreateThread函数创建线程后,需要使用 CloseHandle 函数关闭线程句柄,以释放资源。

实现代码


#include <windows.h>
#include <tchar.h>
#include <cstdio>

DWORD WINAPI OpenNotepadThread(LPVOID lpParam) {
    // 定义要打开的应用程序的路径
    LPCTSTR appName = _T("notepad.exe");

    // 创建进程信息结构体
    STARTUPINFO startupInfo;
    PROCESS_INFORMATION processInfo;

    // 初始化进程信息结构体
    ZeroMemory(&startupInfo, sizeof(startupInfo));
    startupInfo.cb = sizeof(startupInfo);
    ZeroMemory(&processInfo, sizeof(processInfo));

    // 创建新进程
    if (!CreateProcess(
        NULL,                   // 指向可执行文件名的指针
        (LPTSTR)appName,        // 命令行参数
        NULL,                   // 进程句柄不可继承
        NULL,                   // 线程句柄不可继承
        FALSE,                  // 不继承句柄
        0,                      // 无特殊标志
        NULL,                   // 使用父进程的环境变量
        NULL,                   // 使用父进程的工作目录
        &startupInfo,           // 启动信息
        &processInfo            // 进程信息
    )) {
        _tprintf(_T("WRONGING:%d\n"), GetLastError());
        return 1;
    }

    // 等待新进程结束
    WaitForSingleObject(processInfo.hProcess, INFINITE);

    // 关闭进程和线程句柄
    CloseHandle(processInfo.hProcess);
    CloseHandle(processInfo.hThread);

    return 0;
}

int main() {
    // 创建线程
    HANDLE hThread = CreateThread(NULL, 0, OpenNotepadThread, NULL, 0, NULL);
    
    if (hThread == NULL) {
        _tprintf(_T("WRONGING:%d\n"), GetLastError());
        return 1;
    }

    // 等待线程结束
    WaitForSingleObject(hThread, INFINITE);

    // 关闭线程句柄
    CloseHandle(hThread);

    return 0;
}

在上述代码中,我定义了一个名为 OpenNotepadThread 的函数,它是一个线程函数,用于打开记事本应用程序。该函数的参数类型为LPVOID,表示一个指向任意类型的指针。然后创建进程信息结构体 STARTUPINFOPROCESS_INFORMATION,并对其进行了初始化。

接下来调用 CreateProcess 函数用于创建一个新的进程,返回进程的句柄和线程的句柄。它的参数包括可执行文件名、命令行参数、进程句柄和线程句柄是否可继承等信息。如果创建进程成功,返回值为 0 0 0;否则返回值为 1 1 1

调用 WaitForSingleObject 函数用于等待一个对象的状态变为可信,即等待进程结束。它的参数包括要等待的对象句柄和等待的时间,这里使用 INFINITE 表示无限等待,直到进程结束。

当进程结束后,需要调用 CloseHandle 函数关闭进程和线程的句柄,释放资源。


测试效果


image-20230920011044280

🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗🤗

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

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

相关文章

跨平台编程开发工具Xojo 2023 Release mac中文版功能介绍

Xojo mac是一款跨平台的软件开发工具&#xff0c;它允许开发人员使用一种编程语言来创建应用程序&#xff0c;然后可以在多个操作系统上运行。Xojo 2023是Xojo开发工具的最新版本&#xff0c;它提供了许多功能和改进&#xff0c;以帮助开发人员更轻松地构建高质量的应用程序。 …

【洛谷】P2004 领地选择

原题链接&#xff1a;https://www.luogu.com.cn/problem/P2004 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 整体思路&#xff1a;二维前缀和 &#xff08;模板在这https://blog.csdn.net/m0_62531913/article/details/132712831?spm1001.2014.30…

[安洵杯 2019]easy_web md5强碰撞 preg_match绕过

比较简单 url一看就存在一个cmd 和 base64 我们尝试给cmd传递参数 但是没有效果 所以我们就去看看 img里面是什么 直接放到瑞士军刀看看 知道了加密方法 我们去看看能不能返回 index.php代码 TmprMlpUWTBOalUzT0RKbE56QTJPRGN3 返回了 接下俩就是代码审计了 <?php erro…

Python ---使用Fake库向clickhouse造数据小案例

每次insert太麻烦了 先在clickhosue中建表 test_user表 CREATE TABLE dwh.test_user (name String,age Int32,address String,phone String,email String ) ENGINE MergeTree() ORDER BY name; 此时表中暂无数据 用Python脚本来造一些数据 from faker import Faker from c…

Matlab图像处理-灰度级到彩色空间变换法

灰度级到彩色空间变换法 灰度图像转换为具有多种颜色渐变的连续彩色图像。该方法的基本概念是对任意输入像素的灰度级进行三个独立的变换。然后&#xff0c;将三个变换结果分别发送到彩电电视监视器的红、绿、蓝通道。该方法产生一个合成图像&#xff0c;其彩色内容受变换函数…

地球+卫星运动轨迹

由于工作中&#xff0c; 需要追踪卫星&#xff0c; 记录一下最近的工作成果&#xff0c; 分别有俩个方案&#xff0c; 一个是基于市面上主流的Threejs&#xff0c; 另外一个是基于Cesium&#xff0c; 还尝试过使用&#xff0c; Planetary.js&#xff0c; 效果其实还蛮好&#x…

vSphere 7.0 Update 3提示vCLS虚拟机没有兼容的主机的问题即物理机开启CPU “Monitor/Mwait”功能的方法

本文讲解在华为物理服务器上开启CPU "Monitor/Mwait"功能的方法&#xff0c;以解决vSphere 7.0 Update 3平台上vCLS代理虚拟机提示没有与虚拟机兼容的主机&#xff0c;无法开机&#xff0c;且一直尝试启动反复告警的问题。 一、问题实况 1、VC升级到7.0.3后&#x…

Linux系统编程(三):进程

参考引用 UNIX 环境高级编程 (第3版)黑马程序员-Linux 系统编程 1. 进程相关概念 1.1 程序和进程 程序&#xff0c;是指编译好的二进制文件&#xff0c;在磁盘上&#xff0c;不占用系统资源 (CPU、内存、打开的文件、设备、锁…) 程序 → 剧本 (纸) 进程与操作系统原理联系紧…

基于Yolov8的野外烟雾检测(3):动态蛇形卷积(Dynamic Snake Convolution),实现暴力涨点 | ICCV2023

目录 1.Yolov8介绍 2.野外火灾烟雾数据集介绍 3.Dynamic Snake Convolution 3.1 Dynamic Snake Convolution加入到yolov8 4.训练结果分析 5.系列篇 1.Yolov8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最…

ggplot2做图(填坑中)

数据 df <- data.frame(x 1:10, y 1:10, f c(rep("A", 5), rep("B", 5))) 做图 1. 散点图 (scatter plot) # scatter plot scatter_plot <- function(df, metadata) {identical(rownames(df), rownames(metadata))data <- cbind(df, metada…

JavaScript系列从入门到精通系列第一篇:JavaScript语言简介和它代码初体验

一&#xff1a;简介 1&#xff1a;起源 JavaScript诞生于1995年&#xff0c;它的出现主要是用于处理网页中的前端验证&#xff0c; 所谓的前端验证&#xff0c;就是指检查用户输入的内容是否符合一定的规则。 2&#xff1a;简史 JavaScript是由网景公司发明&#xff0c;起初命…

安全测试:文件上传漏洞检测

文件上传漏洞 是一种安全漏洞&#xff0c;允许攻击者将恶意文件上传到目标服务器&#xff0c;从而可能导致恶意代码执行、服务器瘫痪或其他不安全的情况。 假设您正在测试一个网络应用程序&#xff0c;该应用程序允许用户上传文件&#xff0c;例如用户头像。你怀疑应用程序可能…

QT实现相关功能

1、文本的保存 mianwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include<QFontDialog> //字体对话框 #include<QFont> //字体类 #include<QMessageBox> //消息对话框 #…

伦敦银交易所数据全面吗?

据伦敦市场的数据显示&#xff0c;每天平均有超过1900万盎司的黄金和1.7亿盎司的白银交易在发生&#xff0c;而且实际的数量可能是这个数字几倍&#xff0c;因为许多的交易发生都在私人市场&#xff0c;不会产生交易信息报告&#xff0c;所以我们难以准确评估市场上所有的金银交…

ROS2 驱动思岚G4雷达(ydlidar)- Rviz显示

记录G4雷达的配置 系统环境为&#xff1a;Ubuntu22.04 配置步骤 1、安装雷达SDK 2、构建 G4 雷达 ROS2 项目工程文件 3、使用Rviz可视化界面显示 1、安装雷达SDK 1.1 安装CMake YDLidar SDK需要CMake 2.8.2作为依赖项 Ubuntu 18.04或者Ubuntu 22.04 sudo apt install cmak…

【AI语言模型】阿里推出音视频转文字引擎

一、前言 阿里的音视频转文字引擎可以正式使用,用户可体验所有AI功能,含全文概要、章节速览、发言总结等高阶AI功能。通过阿里云主账号登录,可享受以下权益: 每日登录,自动获得2小时转写时长; 每邀请1名好友注册并登录通,邀请者可获得2小时转写时长; 输入口令即可获得…

3288S Android11 适配红外遥控功能(超详细)

目录 一、rk3288平台红外遥控介绍二、原理图分析三、配置设备树并使能红外遥控功能四、打开红外打印功能&#xff0c;查看红外遥控的用户码和键值五、将查看到的红外遥控用户码和键值添加到设备树和.kl文件六、Android红外遥控.kl文件映射知识和使用添加新的.kl文件七、补充&am…

Learn Prompt-Prompt 高级技巧:思维链 Chain of Thought Prompting

Jason Wei等作者对思维链的定义是一系列的中间推理步骤&#xff08; a series of intermediate reasoning steps &#xff09;。目的是为了提高大型语言模型&#xff08;LLM&#xff09;进行复杂推理的能力。 思维链通常是伴随着算术&#xff0c;常识和符号推理等复杂推理任务出…

【大数据】Doris 构建实时数仓落地方案详解(三):Doris 实时数仓设计

本系列包含&#xff1a; Doris 构建实时数仓落地方案详解&#xff08;一&#xff09;&#xff1a;实时数据仓库概述Doris 构建实时数仓落地方案详解&#xff08;二&#xff09;&#xff1a;Doris 核心功能解读Doris 构建实时数仓落地方案详解&#xff08;三&#xff09;&#…

GDB 调试 Coredump

在计算机系统中运行程序时&#xff0c;问题经常发生&#xff0c;而且通常很难找到根源。幸运的是&#xff0c;有一种叫做 coredump 的文件可以帮助我们找到问题的源头。本文将解释什么是 coredump&#xff0c;它是如何工作的&#xff0c;以及如何利用它来定位问题。 01 什么是…