删除应用程序自身的可执行文件

转载 2004年07月16日 19:11:00

下面的代码由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不被删除.)

程序快速删除自己

讨论了程序执行完成后删除自己的几种方法,重点讲解了在网上比较少见的一种新的删除自身的思路。值得一看哟。原文见:http://www.iwebtrados.com.cn/post/65.html1、介绍...
  • ljc_zy
  • ljc_zy
  • 2009年08月08日 22:52
  • 1670

删除进程自身可执行文件的另一种方法

此文章系收藏之作,并非本人所写 大家都知道,一般的程序运行的时候,可执行文件本身是被操作系统保护的,不能用改写的方式访问,更别提在本身还在运行的时侯删除自己了。在lu0的主页上看到一种undocume...
  • vcforever
  • vcforever
  • 2004年07月16日 19:49
  • 2387

IOS可执行文件学习总结

了解iOS上的可执行文件和Mach-O格式 http://www.cocoachina.com/mac/20150122/10988.html   很多朋友都知道,在Windows上exe是可直...
  • bcbobo21cn
  • bcbobo21cn
  • 2016年07月14日 18:21
  • 1380

用eclipse生成java可执行程序步骤

1. java程序编写的应用程序是.jar文件包。运行.jar文件需要安装Java虚拟机。 如果你的机子上安装了jre(JAVA运行虚拟机),那就直接用用编程工具,比如netbeans,eclips等...
  • phenixyf
  • phenixyf
  • 2016年11月17日 10:38
  • 3491

C++基础-----程序自我复制

C++基础-----程序自我复制
  • u012526003
  • u012526003
  • 2016年04月15日 09:52
  • 568

Win7 EXE应用程序图标丢失的解决办法

昨天遇到一个奇怪的问题 DW 5.5 安装后发现图标不见了,快捷方式成了一个没有图标的东西。很不舒服。在网上找了找真是强人真多,把解决方法分享给大家。 在命令提示符下输入下列命令即可恢复。 ...
  • hotlinhao
  • hotlinhao
  • 2013年07月16日 09:49
  • 1343

获取控制台应用程序自己的文件名

获取当前程序文件的路径也算是一个比较常见的需求,比如我有一个文件conn.xml位于.exe的同一目录,在运行时需要从中读取一些设置信息。    进程对象在.NET中表现为System.Diagnos...
  • junjieking
  • junjieking
  • 2011年05月25日 14:54
  • 3224

android下可执行文件的真面目

大家都知道Window下的可执行文件是.exe或者是.dll,而如今android系统的发展也正如火如荼,平时你在只顾下载玩android游戏的时候有没有注意一下android平台下的可执行文件是什么...
  • gotosola
  • gotosola
  • 2012年03月08日 18:47
  • 10844

如何简单实现可执行文件的自我删除

可执行文件即 EXE 文件在运行过程中,由系统管理其打开的句柄。此时对该文件的一些操作是被系统禁止的,比如删除操作。然而在某些场合,可能须要程序有自我删除的功能,也就是程序运行结束后删除自身。基于这个...
  • feidegengao
  • feidegengao
  • 2013年11月26日 15:41
  • 1600

C#程序删除自身

最近自己写了个卸载程序,将程序本身放到安装目录,执行卸载程序的时候将安装目录删除。卸载程序本身无法删除自身。遂尝试通过批处理删除 string fileName = Path.Combine(App...
  • Getlong
  • Getlong
  • 2014年01月22日 14:31
  • 1695
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:删除应用程序自身的可执行文件
举报原因:
原因补充:

(最多只允许输入30个字)