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

转载 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不被删除.)

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

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

android 如何监听自身应用被卸载

前段时间有个同事问我android应用在卸载以后,如何能够通知一下服务器,让用户填写一下卸载的原因,以求为将来的应用修改积累数据。当时他是有段源代码的,但是有点小问题,我只是帮他定位一下了代码的问题,...
  • u011277123
  • u011277123
  • 2016年08月05日 09:22
  • 3035

程序实现自我删除的七种方法

程序实现自我删除的七种方法
  • bjtbjt
  • bjtbjt
  • 2014年08月14日 12:04
  • 4278

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

下面的代码由Gary Nebbett写就.Gary Nebbett乃是WINDOWS NT/2000 NATIVE API REFERENCE的作者.乃NT系统一等一的高手.下面就分析一些他的这段代码...
  • eldn__
  • eldn__
  • 2012年08月29日 09:18
  • 426

在Windows平台用visual studio编译的可执行文件部署时报:应用程序无法正常启动0xc000007b(跟DirectX9无关的原因)

最近在做EasyDarwin开源流媒体服务器Windows版本编译与部署时发现一个问题,在开发机本机运行都很正常,但是部署到目标机器(未安装vs等开发环境)时,莫名其妙报出了“应用程序无法正常启动0x...
  • xiejiashu
  • xiejiashu
  • 2017年03月10日 22:04
  • 1399

C#应用程序的打包 生成安装文件 可执行文件

  • 2009年12月15日 13:07
  • 486KB
  • 下载

linux运行应用程序not found问题(交叉编译生成的可执行文件)

linux运行应用程序not found问题(交叉编译生成的可执行文件)         所谓linux中的Share Libraries和Dynamic linking扮演的角色类似Windows...
  • RAUANING
  • RAUANING
  • 2015年01月06日 19:19
  • 2550

mfc之使两次点开可执行文件为同一个应用程序

1.准备工作添加一个CFAWinAppEx.h和CFAWinAppEx.cpp文件 CFAWinAppEx.h文件 继承CWinAppEX #ifndef __WINAPP_H__ #define...
  • qq_31479277
  • qq_31479277
  • 2016年12月19日 09:57
  • 172

Java桌面应用安装部署、安装程序制作(exe4j + Inno Setup)——之三:使用exe4j生成EXE可执行文件

第二步:使用exe4j生成EXE可执行文件         注:我使用的exe4j版本是4.4.1,不同版本可能稍有差异。         因为希望软件在运行的时候是使用我们提供的JRE,而不是操...
  • sxinfosoft
  • sxinfosoft
  • 2011年12月21日 17:28
  • 1019

从可执行文件中获取图标ExtractIcon 函数的应用(2KB)...

  • 2009年10月07日 00:12
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:删除应用程序自身的可执行文件
举报原因:
原因补充:

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