进程运行时删除启动进程的文件

应用程序启动后修改自身EXE文件或自删除EXE文件 1.子进程等待父进程结束再处理事务(应用程序的自删除); 2.父进程将句柄等信息传递给子进程; 3.将EXE中加载的资源释放为本地文件。 见博客:http://blog.youkuaiyun.com/beanjoy/article/details/9228337 立即下载
精妙代码

作者:陆麟
转载请征得作者同意.
2001.1.12



下面的代码由Gary Nebbett写就.Gary Nebbett乃是WINDOWS NT/2000 NATIVE API REFERENCE的作者.乃NT系统一等一的高手.下面就分析一些他的这段代码.
这段代码在PROCESS没有结束前就将启动PROCESS的EXE文件删除了.

int main(int argc, char *argv[])
{
    HMODULE module = GetModuleHandle(0);
    CHAR buf[MAX_PATH];
    GetModuleFileName(module, buf, sizeof buf);
    CloseHandle(HANDLE(4));
    __asm {
        lea     eax, buf
        push    0
        push    0
        push    eax
        push    ExitProcess
        push    module
        push    DeleteFile
        push    UnmapViewOfFile
        ret
    }
    return 0;
}
现在,我们先看一下堆栈中的东西

偏移 内容
24   0
20   0
16   offset buf
12   address of ExitProcess
8    module
4    address of DeleteFile
0    address of UnmapViewOfFile

调用RET返回到了UnmapViewOfFile,也就是栈里的偏移0所指的地方.当进入UnmapViewOfFile的流程时,栈里见到的是返回地址DeleteFile和HMODUL module.也就是说调用完毕后返回到了DeleteFile的入口地址.当返回到DeleteFile时,看到了ExitProcess的地址,也就是返回地址.和参数EAX,而EAX则是buffer.buffer存的是EXE的文件名.由GetModuleFileName(module, buf, sizeof buf)返回得到.执行了DeleteFile后,就返回到了ExitProcess的函数入口.并且参数为0而返回地址也是0.0是个非法地址.如果返回到地址0则会出错.而调用ExitProcess则应该不会返回.
这段代码的精妙之处在于:
1.如果有文件的HANDLE打开,文件删除就会失败,所以,CloseHandle(HANDLE(4));是十分巧妙的一手.HANDLE4是OS的硬编码,对应于EXE的IMAGE.在缺省情况下,OS假定没有任何调用会关闭IMAGE SECTION的HANDLE,而现在,该HANDLE被关闭了.删除文件就解除了文件对应的一个句柄.
2.由于UnmapViewOfFile解除了另外一个对应IMAGE的HANDLE,而且解除了IMAGE在内存的映射.所以,后面的任何代码都不可以引用IMAGE映射地址内的任何代码.否则就OS会报错.而现在的代码在UnmapViewOfFile后则刚好没有引用到任何IMAGE内的代码.
3.在ExitProcess之前,EXE文件就被删除了.也就是说,进程尚在,而主线程所在的EXE文件已经没了.(WINNT/9X都保护这些被映射到内存的WIN32 IMAGE不被删除.)

Gary Nebbett果然是WIN系列平台的顶尖高手之一.能写出如此代码.独辟蹊径啊:)

实现执行中的exe文件自己删除自己 实现正在执行的程序自删除,在vc++ 6.0实现,使用的c语言 立即下载

相关推荐

中小型微服务系统 硬件设备如何部署,QPS大概多少

作为一名合格的开发工程师,不仅仅要在前期开发阶段对业务和技术有深入了解,知道选用哪种合适的技术,业务如何拆分,还要思考后期线上环境,资源,延迟,性能等如何优化维护以及分布式系统一些线上生产的一些问题。 本篇主要针对之前了解的情况对硬件设备资源做一个简单的介绍: 首先分布式系统线上实践问题,我们应该对公司的流量,各个服务,网管,注册中心应该如何部署,部署多少台机器才合适,每台机器的配置如何,每天整体流量有多少,高峰期的请求量有多少,你的整体系统是否扛得住(注:很多公司现在直接使用K8S docker 实现

wangxuelei036的博客 1万+

在PROCESS没有结束前就将启动PROCESS的EXE文件删除

下面的代码由Gary Nebbett写就.Gary Nebbett乃是WINDOWS NT/2000 NATIVE API REFERENCE的作者.乃NT系统一等一的高手.下面就分析一些他的这段代码. 这段代码在PROCESS没有结束前就将启动PROCESS的EXE文件删除了. int main(int argc, char *argv[]) {     HMODULE module = G

tlovexyj的专栏 1208

基于 MATLAB 的综合能源系统建模案例 

电平衡约束:P_{gt}(t)+P_{grid}(t)-P_{eb}(t)-P_{load}(t)=0,其中 P_{grid}(t) 为与外部电网的交互功率(正表示购电,负表示售电)。- 电锅炉的热输出功率 Q_{eb} 与输入电功率 P_{eb} 的关系为:Q_{eb}=\eta_{eb}\times P_{eb},其中 \eta_{eb} 为电锅炉的热效率。- 燃气轮机的余热回收功率 Q_{gt} 与发电功率也存在一定关系,例如:Q_{gt}=c\times P_{gt},c 为余热回收比例系数。

qq_57128262的博客 1394

总结一个主进程启动子进程,删除主进程文件和目录的问题

首先,我们启动子进程的时候,要修改子进程的工作目录。 ProcessStartInfo pi = new ProcessStartInfo(fileName, arguments) { WorkingDirectory = Path.GetTempPath() }; pp.StartInfo = pi; p...

weixin_30335353的博客 206

一分钟了解 “提示词工程”、“上下文工程”、“驾驭工程”

在大模型刚刚进入大众视野的初期,开发者面临的最大挑战是如何让模型听懂人类的指令。这一阶段被称为提示词工程时代。其核心思想非常直观:通过精心设计输入的文本提示,引导模型输出符合预期的结果。这一时期的开发者更像是“提示词巫师”,他们热衷于寻找所谓的“魔法咒语”。典型的技巧包括角色设定、思维链、少样本学习以及输出格式约束。例如,仅仅在问题前加上一句“请一步步思考”,模型的推理能力往往就能得到显著提升。然而,随着应用场景的复杂化,提示词工程的局限性逐渐暴露。

h a 6 6 6 c k 为 你解决复杂难题! 568

9、 量子支持向量机:从经典到量子的跨越

本文详细介绍了量子支持向量机(QSVM)的基本原理及其在PennyLane和Qiskit框架中的实现方法。从经典SVM的基础知识出发,逐步深入到量子领域的应用,包括如何定义量子核函数、与scikit-learn集成以及在模拟器和实际量子计算机上的训练和评估过程。最后通过表格和流程图总结了不同框架下的实现要点,为未来量子机器学习的研究提供了参考。

weixin_42433737的博客 183

如何让进程退出前删除自身EXE

      下面的代码由 Gary Nebbett 写就。Gary Nebbett 乃是 WINDOWS NT/2000 NATIVE API REFERENCE 的作者,NT 系统一等一的高手。下面就分析一些他的这段代码。      这段代码在PROCESS没有结束前就将启动PROCESS的EXE文件删除了。int main(int argc, char *argv[]) { H

光宇广贞 1418

【WRF-Urban】WUDAPT详解:An Urban Weather, Climate, and Environmental Modeling Infrastructure

WUDAPT详解:An Urban Weather, Climate, and Environmental Modeling Infrastructure

WW、forever的博客 497

微盘c语言删除多余括号,C语言删除多余的括号。怎么办?

满意答案KKYBB2013.01.14采纳率:40%等级:2已帮助:5218人"#include"stdio.h"void main(){char a[100]={0};int i,j,z,m=0,n=0,k=0,b[100]={0};gets(a);if(a[0]=='('){j=1;b[0]=1;for(;a[j]=='(';k++,j++) b[j]=1;if(a[j]=='+'||...

weixin_35060251的博客 296

Linux加密框架中的算法和算法模式(1)——算法介绍

算法和算法模式

yangguoyu8023的博客 2031

深入剖析RK3588系统休眠唤醒机制及驱动适配秘籍

本文深入探讨了RK3588嵌入式系统的休眠唤醒机制及驱动适配技术。首先分析了系统支持的两种休眠模式(Freeze浅度睡眠和Mem深度睡眠)及四种唤醒方式(GPIO中断、蓝牙事件、外设活动和定时器唤醒)的工作原理。重点介绍了驱动适配的三个关键环节:设备树配置要点、驱动代码实现与优化方法,以及驱动与内核电源管理的协同机制。通过GPIO按键唤醒和蓝牙唤醒两个实际案例,展示了具体实现过程并提供了常见问题的解决方案。文章为开发者提供了全面的技术参考,有助于优化系统功耗管理和响应性能,对嵌入式系统开发具有重要指导意义。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 433

Process类调用exe

前言 对Process类调用exe 、传入参数带空格以及返回值问题汇总 1.0 返回值为int 下述代码中fileName为调用的exe路径,入口参数为para,其中多个参数用空格分开,当D:/DD.exe返回值为int类型时。 Process p = new Process(); string fileName = @"D:/DD.exe"; string para ="aa...

qq_37833413的博客 620

【RT-DETR涨点改进】独家Conv改进篇 | 来自TIP 2024顶刊| 引入 DEConv细节增强卷积模块, 能够恢复更多细节信息,提升小目标检测精度、含多种不同模型改进点

本文提出了一种细节增强卷积(DEConv)模块,通过融合多种差异卷积(CDC、ADC、HDC、VDC)来增强图像特征表示能力,特别在边缘和纹理细节提取方面表现突出。该模块采用重参数化技术,在不增加计算成本的情况下,将先验信息融入常规卷积层,显著提升了RT-DETR模型在模糊或遮挡场景下的目标检测精度。实验验证了DEConv在多种骨干网络(ResNet18/50、HGNet等)中的有效性,为实时目标检测系统提供了轻量高效的改进方案。

Ai缝合怪、助力小伙伴高效发论文 449

Linux 2.进程(小技巧:让程序不能被多次运行)

具体做法是程序在执行之初去判断一个特定的文件是否存在,若存在则标明进程已经在运行,若不存在则标明进程没有在运行。然后运行程序时去创建这个文件。意思就是说当我们./a.out去运行程序时,如果当前还没有这个程序的进程运行则运行之,如果之前已经有一个这个程序的进程在运行则本次运行直接退出(提示程序已经在运行)。我们守护进程一般都是服务器,服务器程序只要运行一个就够了,多次同时运行并没有意义甚至会带来错误。因为守护进程是长时间运行而不退出,因此./a.out执行一次就有一个进程,执行多次就有多个进程。

黄色的拉拉的博客 601

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

如何关闭vmware-vmx.exe进程且如何删除不想要的VirtualMachine虚拟机文件

问题:在要删除VirtualMachine虚拟机文件时总是提醒vmware-vmx.exe进程运行,为此要解决问题就要结束此进程。 步骤: 1. win+R弹出命令行输入services.msc进入服务,找到VMwareWorkstation server服务, 2. 鼠标右击属性,设置启动类型从初始的自动改为禁用,点击应用后确定。 3.重启电脑,按Ctrl+Alt+Del进入任务...

qq_42052589的博客 5427

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

使用flock单进程启动,仍然有多个同名进程可以同时运行

最近发现一个现象,我们的后台服务程序里面使用了flock,并且设置了LOCK_EX,结果同一个程序还是可以运行多个进程。不过在通过相关命令排查后,我们知晓了原因。原来是第一次启动后再临时目录/tmp下面创建生成的文件被认为或者定时任务删除了,导致脚本再次拉起的时候,同一个程序运行了两个进程。前几年写过一个linux下程序使用flock单进程启动的介绍。

qq_42896627的博客 262

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Linux C++ 通过PID文件判断进程是否运行

1.环境:Linux localhost.localdomain 3.10.0-1127.el7.x86_64 x86_64 x86_64 x86_64 GNU/Linux 2.文件运行权限:root 3.代码 #include<stdlib.h> #include<stdio.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<unistd.

似水流年 3091

让程序不能被多次运行

怎么让程序不能被多次运行

Li_t0010的博客 717

linux oracle 恢复删除的数据文件

若不小心删除了正在运行的oracle的数据文件,比如指令rm –rf * 等。此时千万不能kill 相关oracle进程以及重启机器。 此时,因为进程还一直占用这里oracle文件。因此,虽然是删除了,但其实文件还在文件系统里吗,并没有释放。 这个看文件系统空间就可以知道。 #df -h 执行指令: [root@pridg lyj]# lsof |grep deleted 第二...

hope_one_day的专栏 265

69_进程之让程序不能被多次运行(指的是守护进程)

平时的程序可以被多次运行,有了守护进程,就可以一直被运行问题,守护进程是长时间运行而不退出,。/a.out执行一次就有一个进程,执行多次就i有多个进程,这样其实不太好,守护进程一般就是服务器,这样的的守护进程运行一次就可以了,不需要多次重复运行,因此我们需要单例运行的功能也就是如果这个程序之前没运行,则运行,若已经运行了,则不再运行第二个了用一个文件的存在与否做标志,具体做法是,一个文件在执行之初...

sanbanzui2008的博客 348

一种巧妙的删除程序自己的方法

档标题:一种巧妙的删除程序自己的方法  近日看到网友询问如何实现程序运行之后把自己删除的方法,不知大家对木马甚么的兴趣实在太浓,还是想要这样的效果:用户只要一运行程序,可执行文件就没有了,可是程序还是在跑,胆小的只怕要喊"鬼呀!","老婆,快出来看上帝"甚么的。其实最典型的用法是写反安装程序. 闲来无事,Bear掰到一种还算巧妙的"删除自己"的方法。 大家都知道,一般的程序运行的时候,可执行文件本

雪客之无聊日记 2118

进程退出前删除自身EXE

下面的代码由Gary Nebbett写就.Gary Nebbett乃是WINDOWS NT/2000 NATIVE API REFERENCE的作者.乃NT系统一等一的高手.下面就分析一些他的这段代码. 这段代码在PROCESS没有结束前就将启动PROCESS的EXE文件删除了. int main(int argc, char *argv[]) { HMODULE module = GetModu

深之JohnChen的专栏 5453

介绍一种巧妙的删除程序自己的方法

近日看到网友询问如何实现程序运行之后把自己删除的方法,不知大家对木马甚么的兴趣实在太浓,还是想要这样的效果:用户只要一运行程序,可执行文件就没有了,可是程序还是在跑,胆小的只怕要喊"鬼呀!","老婆,快出来看上帝"甚么的。其实最典型的用法是写反安装程序. 闲来无事,Bear掰到一种还算巧妙的“删除自己”的方法。大家都知道,一般的程序运行的时候,可执行文件本身是被操作系统保护的,不能用改写的

Grrr的专栏 1115

精品软件分享 顽固文件删除工具

一款轻量级软件可解决文件因被占用而无法删除的问题。该软件通过将目标文件加入待处理列表,在系统重启时自动执行删除操作,有效避开文件锁定状态。使用前需谨慎确认文件,避免误删重要数据。软件体积小巧、操作简单,无需安装即可使用。提供百度网盘和夸克网盘两种下载方式。

QQQQQEA的博客 338

进程退出前删除自身EXE程序

      下面的代码由Gary Nebbett写就.Gary Nebbett乃是WINDOWS NT/2000 NATIVE API REFERENCE的作者.乃NT系统一等一的高手.下面就分析一些他的这段代码. 这段代码在PROCESS没有结束前就将启动PROCESS的EXE文件删除了. int main(int argc, char *argv[]) { HMODULE module = G

Shatty的专栏 1491
上一篇: T-SQL 2 Tips: 1.计算任意两日期之间的"周一"到"周日"分别各有几个! 2.根据出生日期计算精确年龄!
下一篇: C-编译器的设计
oxware
博客等级 码龄24年 3粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值