进程退出前删除自身EXE

下面的代码由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系列平台的顶尖高手之一.能写出如此代码.独辟蹊径啊:)

http://blog.csdn.net/jiangxinyu/article/details/5270232

时间: 2024-10-17 15:44:45

进程退出前删除自身EXE的相关文章

转载:进程退出状态--waitpid status意义

最近遇到一个进程突然退出的问题,由于没有注册signalhandler所以没有捕捉到任何信号. 但是从log中看到init waitpid返回的status为0x008b,以前对status不是很了解,下面的文章对status有比较全面的介绍. 转至http://tsecer.blog.163.com/blog/static/15018172012323975152/ 一.和子进程同步在linux系统中,父进程通常需要通过waitpid来等待/获取子进程状态变化情况,而这个主要就是通过waitX

【转】iis解决应用程序池**提供服务的进程意外终止进程ID是**。进程退出代码是'0x80'

转自:http://blog.sina.com.cn/s/blog_56a68d5501013xdd.html 我们公司旗下的红黑互联会遇到这种问题 事件类型: 警告事件来源: W3SVC事件种类: 无事件 ID: 1009日期: 事件: XX:XX:XX用户: XX计算机: XXXX描述:为应用程序池 XXXXX 提供服务的进程意外终止.进程 ID 是 XXXX.进程退出代码是 0x80.有关更多信息,请参阅在 asp">http://go.microsoft.com/fwlink/ev

线程退出前操作

#include <unistd.h> #include <pthread.h> #include <stdio.h> #include <stdlib.h> void cleanup() { printf("cleanup\n"); } void *test_cancel(void) { pthread_cleanup_push(cleanup,NULL); printf("test_cancel\n"); whil

erlang监控进程在启动进程退出后异常退出原因分析

一.问题引出 erlang监控进程在启动时设置了trap_exit为true,即会捕获到退出信号,会将退出信号转换为{'EXIT',Pid,Reason}存入自己的邮箱中,因此与监控进程link关系的进程退出后,监控进程能够很坦然的截获退出信号,自身不退出.启动erlang监控进程的进程,会和监控进程建立link关系,然而当启动进程退出时,监控进程没有象正常的情况,发生了异常退出,为什么设置了trap_exit为true,还会退出呢? 二.原因分析 查看supervisor的源码,supervi

TODO:Golang Linux进程退出说明

Golang使用os.Exit(code)进程退出导致当前程序退出并返回给定的状态代码.传统上,code代码为零表示成功退出,非零错误退出. syscall.Exit可以调用不同平台的操作系统的退出. code值为0-255,当code为非0时,os.Exit(code)会返回,对应值当状态码 exit status 128 当code为0,则正常退出.code值可自定义对应当意义进行相应业务场景使用.code的值在自然数是按从0至255的倍数进行循环,例如自然数为256,在进程退出的时候返回的

孤儿进程退出分析

如果父进程在子进程之前退出,必须有机制来保证子进程能找到一个新的父亲,否则这些成为孤儿的进程就会在退出时永远处于僵死状态,,白白地耗费内存.僵尸状态是在调用do_exit()函数时,最后会调用exit_notify()函数向父进程发送信号,给子进程重新找养父,养父为线程组中的其他线程或者为init进程,并把进程(存放在task_struct结构的exit_state中)设成EXIT_ZOMBIE.对于这个问题,解决方法是给子进程在当前线程组内找一个线程作为父亲,如果不行,就让init做它们的父进

Linux 进程退出后自动启动

/********************************************************************** * Linux 进程退出后自动启动 * 说明: * 在系统中,我们有时候会希望后台程序能够一直运行,即使程序出错了, * 也是希望程序能够自动启动,并继续运行. * * 2016-12-10 深圳 南山平山村 曾剑锋 *********************************************************************

Linux进程退出详解(do_exit)--Linux进程的管理与调度(十四))

日期 内核版本 架构 作者 GitHub CSDN 2016-05-12 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 Linux进程的退出 linux下进程退出的方式 正常退出 从main函数返回return 调用exit 调用_exit 异常退出 调用abort 由信号终止 _exit, exit和_Exit的区别和联系 _exit是linux系统调用,关闭所有文件描述符,然后退出进程. exit是c语言的库函数,他最

记一次&quot;诡异&quot;的mongodb进程退出事件

shell中通过mongo args &的方式启动mongo进程,退出shell重新登进之后发现mongo进程没了,查看日志发现有如下输出: 2015-06-18T18:39:58.593+0800 [signalProcessingThread] got signal 1 (Hangup), will terminate after current cmd ends 2015-06-18T18:39:58.593+0800 [signalProcessingThread] now exitin