VC EXE程序删除自身

2023-05-16

在开发程序过程中,有许多情况中都需要执行程序自己把自己从物理磁盘上删除,例如,卸装程序,一些黑客程序获取信息后自清除等,我们把这些具有自删除功能的程序统称为“自杀”程序。对于一名程序员,想必都有在程序中使用代码删除物理磁盘文件的经历吧,我们只需要简单的调用DeleteFile API函数就可以搞定,但是该函数并不能删除自己,当它执行删除自己时,将会导致出现“无法删除文件:拒绝访问。源文件可能正被使用”的错误提示,其原因是由于本程序在执行删除自己代码时仍处于内存中,在Windows中,不可以删除正在执行中的程序。  

    为了实现程序自删除功能,我们可以通过多进程的方法解决这个问题。可执行文件在结束返回前,创建一个运行命令窗口的新进程(在Windows98中为Command进程,在Windows2000/XP中为CMD进程),当然该命令窗口以隐藏方式执行,并通过传递参数执行删除功能。为了避免可执行文件的映像还在内存中就执行删除,需要把当前进程设置为实时优先级,而命令窗口进程设置为很低的IDLE优先级,这样首先可执行文件结束返回,再运行命令窗口的删除命令,就实现了该文件自身的删除功能。  

    下面我们就一起动手制作“自杀”(具有自删除功能)程序,程序在Visual C++6.0中开发编译。  

    首先,启动Visual C++6.0,新建一个MFC AppWizard(exe)类型的项目,项目名为SelfDelete,选择基于对话框模式创建程序框架。  

    接下来,打开资源编辑器,添加一个按钮控件,设置内容为开始“自杀”,如图一所示:  

    启动ClassWizard,为新添加的控件新建CLICK事件处理函数,再打开该函数,添加“自杀”代码如下:  

void CSelfDeleteDlg::OnButton1()    
{    
   // TODO: Add your control notification handler code here    
   SHELLEXECUTEINFO sei;  
   TCHAR szModule [MAX_PATH],szComspec[MAX_PATH],szParams [MAX_PATH];  
   //获取文件路径名  
   if((GetModuleFileName(0,szModule,MAX_PATH)!=0) &&  
        (GetShortPathName(szModule,szModule,MAX_PATH)!=0) &&  
            (GetEnvironmentVariable("COMSPEC",szComspec,MAX_PATH)!=0))  
   {  //设置命令行参数。  
      lstrcpy(szParams,"/c del ");  
      lstrcat(szParams, szModule);  
      lstrcat(szParams, " > nul");  

      //初始化SHELLEXECUTEINFO结构成员  
      sei.cbSize = sizeof(sei); //设置类型大小。  
      //命令窗口进程句柄,ShellExecuteEx函数执行时设置。  
      sei.hwnd = 0;  
      sei.lpVerb = "Open";        //执行动作为“打开执行”。  
      sei.lpFile = szComspec;      //执行程序文件全路径名称。  
      sei.lpParameters = szParams; //执行参数。  
      sei.lpDirectory = 0;  
      //显示方式,此处使用隐藏方式阻止出现命令窗口界面。  
      sei.nShow = SW_HIDE;  
      //设置为SellExecuteEx函数结束后进程退出。  
      sei.fMask = SEE_MASK_NOCLOSEPROCESS;  
      //创建执行命令窗口进程。  
      if(ShellExecuteEx(&sei))  
      {  //设置命令行进程的执行级别为空闲执行,这使本程序有足够的时间从内存中退出。    
         SetPriorityClass(sei.hProcess,IDLE_PRIORITY_CLASS);  
         //设置本程序进程的执行级别为实时执行,这本程序马上获取CPU执行权,快速退出。    
         SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS);  
         SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL);    
         //通知Windows资源浏览器,本程序文件已经被删除。  
         SHChangeNotify(SHCNE_DELETE,SHCNF_PATH,szModule,0);  
         //执行退出程序  
         EndDialog(0);  
       }  
   }  
}  


    如果上面代码中的注释还不能帮助你理解代码的意义,请不要着急,后面我们还要对这些代码做详细的讲解。现在,你可以开始编译该程序项目,运行一下程序,请在Windows资源浏览器中仔细观察程序文件,当你按下“开始自杀”按钮后几秒,该程序文件从Windows资源浏览器中消失了,这也正在本程序想要得到的效果。  
    体验了“自杀”程序的神奇之后,让我们回过头来好好的分析一下实现“自杀”功能的代码。    
    前面我们已经谈过,实现“自杀”功能的核心是在程序中创建一个命令窗口新进程,通过向命令窗口进程传递del命令和参数来删除程序文件。命令窗口程序是由环境变量COMSPEC定义的,Win9x/ME使用COMMAND.COM,WinNT/2K/XP使用CMD.COM。程序把命令字符串“/c del filename > nul”传递给命令窗口,其中filename是需要删除文件的全路径文件名,文件名需要转换为8.3格式;/c开关用于命令窗口退出。    
    在实现代码中,首先就需要获取当前程序模块的全路径,并将其转化为命令窗口需要的8.3格式。代码中GetModuleFileName(0,szModule,MAX_PATH)函数实现了获取当前程序模式的全路径名称,并存放到变量szModule中。接着使用GetShortPathName(szModule,szModule,MAX_PATH)函数将szModule变量中的程序模块全路径名称转换成命令窗口需要的8.3格式。另外,还调用GetEnvironmentVariable("COMSPEC",szComspec,MAX_PATH)函数从系统环境变量COMSPC中获取了命令窗口程序的全路径。接下来,需要将存放在变量szModule中的具有8.3格式的程序模块全路径字符串组合成命令字符串“/c del ”+szModule+ “> nul”。    
    有了这些信息之后,就可以调用ShellExecuteEx() API函数创建一个新的命令窗口进程,该函数需要一个SHELLEXECUTEINFO类型的参数,调用ShellExecuteEx()函数必须需要初始化这个类型参数,有关SHELLEXECUTEINFO类型的详细说明请参阅MSDN。本处通过该参数将命令窗口进程的执行动作设为Open、执行文件为命令窗口(路径由szComspec提供)、执行文件参数为上面组合而成的命令字符串、显示方式为隐藏方式(隐藏方式可以阻止出现命令窗口界面)。    
    命令窗口通过调用ShellExecuteEx()函数以单独的进程运行,它的窗口句柄在SHELLEXECTUEINFO结构中的成员变量hProcess定义。自删除需要解决一个特殊的问题,即主程序必须在命令窗口删除它之前退出并关闭其打开的文件句柄。为了做到这一点,我们必须同步两个独立、并行的进程:当前程序进程和命令窗口进程。这可以通过操作CPU资源优先级来临时降低命令窗口的运行优先级别。这样,主程序将分配到CPU的所有资源直到其正常退出,而阻塞其它任何命令窗口的执行直到主程序结束。下面代码实现调整两个进程的执行优先级:    
    //设置命令行进程的执行级别为空闲执行,   
    //这使本程序有足够的时间从内存中退出。    
    SetPriorityClass(sei.hProcess,IDLE_PRIORITY_CLASS);    
    //设置本程序进程的执行级别为实时执行,   
    //这本程序马上获取CPU执行权,快速退出。    
    SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS);    
    SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL);    

    到此,自杀”功能基本实现。最后还需要做的事是调用SHChangeNotify(SHCNE_DELETE,SHCNF_PATH,szModule,0) 函数通知Windows资源浏览器已成功删除了程序文件。如果用户当前Windows资源浏览器窗口正处于程序文件目录的话,这个通知是非常必要的,它会导致Windows资源浏览器马上从程序文件目录列表中删除该程序文件项。做完了以上工作,一定要调用退出程序的代码,此处使用了EndDialog()函数,如果不及时退出程序的话,命令窗口进程就不能正常删除程序文件,其原因在前面我们已经研究过。

转载于:https://www.cnblogs.com/rogee/archive/2011/04/30/2033398.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VC EXE程序删除自身 的相关文章

  • ftp网络文件传输服务器,FTP文件传输服务

    FTP 文件传输协议 典型的 xff23 xff0f xff33 架构的应用层协议 xff0c 需要由服务端软件 xff0c 客户端软件两部分共同实现传输功能 需求描述 xff1b 采用FTP虚拟用户的方式 xff0c 添加三个用户 xff
  • 服务器主板上一个处理器性能如何,怎么判断一个CPU才算好

    我们作为一个电脑用户新手来说 xff0c 购买一个好的电脑配置能让我们体验更好的电脑 作为一个电脑核心CPU来说是非常重要的 xff0c 不过大家是新手却不知道如何判断一个CPU的好坏 所以学习啦小编这里就给大家上一堂关于如何选择一个好的C
  • linux添加fuji打印机,Ubuntu16.04下添加打印机FujiXerox CP116w

    今天要打印一份北马的成绩单 不想重启机器了 在Ubuntu下尝试添加打印机 最后成功了 记录一下 打印机型号是FujiXerox CP116w 通过WIFI连接的 在Ubuntu16 04下添加打印机 Add Printer gt Devi
  • 【非常详细】Ubuntu18.04安装显卡驱动和CUDA,CUDNN流程和踩坑记录

    1 预准备 在一个刚安装好的 全新的ubuntu18 04上 xff0c 按下Ctrl 43 Al 43 T打开终端 xff0c 依次输入以下三条指令 xff0c 安装好gcc和cmake gcc是GNU compiler collecti
  • java w3 xml格式化_xml代码在线格式化美化工具 - 代码工具 - W3Cschool

    XML 代码美化 xff1a 在上面的编辑器中输入你手中混乱 压缩或混淆的XML代码 xff0c 点击 格式化 代码 即可实现代码的格式化与美化功能 该编辑器还具备行数显示及语法高亮显示的功能 此外还提供了大量的附加选项来实现个性化的代码美
  • 计算机主板手工,教你DIY一台笔记本(伪),简单粗暴成本低

    教你DIY一台笔记本 伪 xff0c 简单粗暴成本低 2018 11 03 17 25 00 277点赞 561收藏 194评论 这是某个垃圾佬长久以来的执念 xff0c 灵感来自于一个不堪龟速笔记本折磨的夜晚 因为某些原因 xff0c 个
  • Openstack 安装部署指南翻译系列 之 Manila服务安装(Share Storage)

    上面左边是我的个人微信 xff0c 如需进一步沟通 xff0c 请加微信 右边是我的公众号 Openstack私有云 xff0c 如有兴趣 xff0c 请关注 1 1 1 1 Manila服务 安装 xff08 Share Storage
  • Clang与libc++abi库安装

    系统ubuntu64位 Clang4 0 参考 xff1a 1 https github com yangyangwithgnu use vim as ide 0 1 其中 第7章 工具链集成 2 http clang llvm org g
  • pandas处理较大数据量级的方法 - chunk,hdf,pkl

    前情提要 工作原因需要处理一批约30G左右的CSV数据 xff0c 数据量级不需要hadoop的使用 xff0c 同时由于办公的本本内存较低的缘故 xff0c 需要解读取数据时内存不足的原因 操作流程 xff1a 方法与方式 首先是读取数据
  • Objective-C --- UIView (基础运用)

    为什么80 的码农都做不了架构师 xff1f gt gt gt 1 创建 UIView view 61 UIView alloc init 2 位置 frame view frame 相对父视图的位置 view bounds 相对自己的位置
  • Debian8.2 xfce桌面设置双屏

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 最近想折腾 Xfce xff0c 而且 Fedora 的包都好老啊 xff0c 所以换了 Arch Linux 果然装完就有的折腾了 xff1a Xfce 4 0 居然不支
  • 【转】好东西!sqlite3中BLOB数据类型存储大对象运用示例

    1 常用接口 个人比较喜欢sqlite 使用最方便 xff0c 唯一的准备工作是下载250K的源 xff1b 而且作者很热心 xff0c 有问必答 以下演示一下使用sqlite的步骤 xff0c 先创建一个数据库 xff0c 然后查询其中的
  • Qt实现MFC的WM_IDLE机制.doc

    win32 有一个消息是 WM IDLE 而在MFC里面的也有 一个virtualBOOLOnIdle LONGlCount 的函数与之相对应 xff0c 而在MSDN中对该函数的解释是 xff1a Override this member
  • ERROR: Kernel configuration is invalid.

    最简单的linux hello的驱动源程序 span class hljs comment 下面是驱动源代码 span span class hljs preprocessor include lt linux init h gt span
  • i2c中start和restart的区别

    有的硬件芯片提供了一个个寄存器 xff0c 供我们很好的操作i2c xff0c 但是 xff0c 在用的时候 xff0c 我们是不知道他到地是怎么操作的 xff0c 下边 xff0c 我就探讨下i2c中的start和restart的区别 s
  • Linux——常见的N个问题

    一 如何建立多用户 提醒大家一句 xff0c 别一直使用root用户 xff0c 因为root用户在系统中有着至高无上的权力 xff0c 一不小心 就可能破坏系统 比如我们想删除 temp目录下的文件却将命令不小心输成 rm temp xf
  • animate css组合,Vue---CSS动画之animate.css库

    animation完成一个动画效果 代码基本结构搭建 使用与过渡动画相同的代码结构 hello world change var vm 61 new Vue el 39 root 39 data show true methods hand
  • P1661 扩散

    P1661 扩散 题目描述 一个点每过一个单位时间就会向四个方向扩散一个距离 xff0c 如图 两个点a b连通 xff0c 记作e a b 当且仅当a b的扩散区域有公共部分 连通块的定义是块内的任意两个点u v都必定存在路径e u a0
  • java 返回两个list_Java 获取两个List的交集和差集,以及应用场景操作

    背景介绍 在实际项目中 xff0c 特别是一些管理后台类的项目 xff0c 会遇到底层数据是按照一对多关系的数据表存储的管理界面 列表页是一对多关系中一对应的数据列表 xff0c 二级的详情页中是一对多关系中多对应的多条数据展示 通常二级页
  • 微服务注册中心注册表与hashcode实现golang版

    背景 基于负载均衡的服务调用 基于负载均衡的服务相互调用指的是通过基于Lvs Haproxy Nginx等负载均衡软件来构建一个负载均衡服务 xff0c 所有的服务调用都通过负载均衡器 从负载均衡的这种模式下其实有两个主要的问题 xff1a

随机推荐

  • cookie txt format

    2019独角兽企业重金招聘Python工程师标准 gt gt gt cookies txt Tab separated columns are Domain Only Sent To Creator Path Secure Expires
  • linux环境变量设置 profile,Linux 环境变量 设置 etc profile

    一 Linux的变量种类 按变量的生存周期来划分 xff0c Linux变量可分为两类 xff1a 1 永久的 xff1a 需要修改配置文件 xff0c 变量永久生效 2 临时的 xff1a 使用export命令声明即可 xff0c 变量在
  • Debian 7 桌面美化

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 安装中文字体 1 文泉驿 查找 xff1a apt cache search wqy 可能输出如下信息 xff1a ttf wqy microhei A droid d
  • mysql编程展示数据_Mysql的列修改成行并显示数据的简单实现

    创建测试表 xff1a DROP TABLE IF EXISTS 96 test 96 CREATE TABLE 96 test 96 96 year 96 int 11 DEFAULT NULL 96 month 96 int 11 DE
  • LINUX:window下使用debian安装虚拟环境

    windows系统下 xff0c 使用debian做开发 xff0c 使用的是python编程语言 首先 xff0c 要安装pip 安装命令 xff1a apt install python3 pip 如果使用这个命令后出现如下错误提示 x
  • 如何“优雅地”进行Jetson nano 学习

    RT 其实就是面对多场景应用时 xff0c nano不可能待在同一个地方 xff0c 要么在车上 xff0c 在机器人上 我们扛着一 个大显示器到处跑肯定是不太现实的 xff0c 当然 xff0c 如果想要锻炼身体的同学另说 xff01 改
  • xmake入门,构建项目原来可以如此简单

    前言 在开发xmake之前 xff0c 我一直在使用gnumake makefile来维护个人C C 43 43 项目 xff0c 一开始还好 xff0c 然而等项目越来越庞大后 xff0c 维护起来就非常吃力了 xff0c 后续也用过一阵
  • haproxy负载均衡

    os xff1a root 64 node1 cat etc system release CentOS release 6 4 Final 参考文章 xff1a http www serverlab ca tutorials linux
  • 无线网络wifi (WPA/WPA2)密码破解方法

    无线网络password破解WPA WPA2教程 本教程用于探索无线路由安全漏洞 xff0c 禁止用于非法用途 xff0c 违者法律必究 xff08 与我无关 xff09 在动手破解WPA WPA2前 xff0c 应该先了解一下基础知识 x
  • 关于心跳ajax请求pending状态(被挂起),stalled时间过长的问题。涉及tcp连接异常。...

    环境 xff1a 景安快云服务器 xff08 听说很垃圾 xff0c 但是公司买的 xff0c 我也刚来 xff09 xff0c CentOS 6 8 x86 64 xff0c Apache xff0c MySQL5 1 xff0c PHP
  • 【遥感专题系列】微波遥感(三、SAR图像特征)

    SAR是主动式侧视雷达系统 xff0c 且成像几何属于斜距投影类型 因此SAR图像与光学图像在成像机理 几何特征 辐射特征等方面都有较大的区别 在进行SAR图像处理和应用前 xff0c 需要了解SAR图像的基本特征 本文主要包括 xff1a
  • Python可以用来做什么?这4个在平常生活中都可以用到

    Python是一个非常好用的程序语言 xff0c 开发的速度非常快 xff0c 你都知道Python可以用来做什么吗 xff1f 下面我将介绍几个简单的小程序 xff0c 你也可以试一试 xff01 1 网易云音乐批量下载 你可以利用Pyt
  • Next.js脚手架进阶 — 完美契合ant-design

    前言 上次入门完了之后感觉意犹未尽 xff0c 总觉得这个脚手架还是不太完美 xff0c 还有可以改进的地方 xff0c 所以为了与人方便也是与己方便 xff0c 就继续写几篇吧 xff5e xff0c 不过既然之前的叫做入门系列 xff0
  • Python实现“淘宝自动发货机器人”

    背景 之前看到朋友下载csdn资源 xff0c 但因为没有下载积分 xff0c 因此他会在淘宝上购买一个叫做 csdn资源代下 的业务 对我来说 xff0c 也许这是一个商机 xff08 因为刚好提交了一个csdn漏洞 xff0c 得到了一
  • Javascript定时器那些事儿

    一 什么是定时器 JS提供了一些原生方法来实现延时去执行某一段代码 xff0c 下面来简单介绍一下 setTimeout 设置一个定时器 xff0c 在定时器到期后执行一次函数或代码段 var timeoutId 61 window set
  • new Date() 方法到底是获取什么时间

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 问题 java 中 xff0c new Date 方法 获取的时间 xff0c 究竟与当前的系统时间有什么关联 xff1f 简单的时刻对应关系吗 xff1f 2 测试环
  • Windows使用

    将压缩包安装的软件放入开始菜单 平台需求配置 平台 本文针对windows平台 xff0c 在win11上进行过测试 xff0c 其他平台请自行确认是否可用 需求 最近在安装软件时 xff0c 发现了一个问题 很多软件直接给一个压缩包 xf
  • Python装饰器高级版—Python类内定义装饰器并传递self参数

    本文重点 xff1a 解决了类里面定义的装饰器 xff0c 在同一个类里面使用的问题 xff0c 并实现了装饰器的类属性参数传递 目录 xff1a 一 基本装饰器 二 在类里定义装饰器 xff0c 装饰本类内函数 三 类装饰器 正文 xff
  • 华为交换机链路聚合命令

    配置链路聚合 1 创建聚合组 sys interface eth trunk 2 2 配置聚合模式为手工模式 interface eth trunk 2 mode manual load balance 表示手工模式 mode lacp l
  • VC EXE程序删除自身

    在开发程序过程中 xff0c 有许多情况中都需要执行程序自己把自己从物理磁盘上删除 xff0c 例如 xff0c 卸装程序 xff0c 一些黑客程序获取信息后自清除等 xff0c 我们把这些具有自删除功能的程序统称为 自杀 程序 对于一名程