5-8万年薪顶级嵌入式,京沪深就业地 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

在EXE文件运行时如何修改这个EXE文件本身,或者如何在该EXE文件运行时如何删除它自身这个文件?

楼主zcy_beijing(行云流水)2002-05-20 17:37:39 在 VC/MFC / 基础类 提问

谢谢! 问题点数:20、回复次数:11Top

1 楼opentuxedo(借哥哥的号来试试)回复于 2002-05-20 17:43:34 得分 0

可以在exe中生成一个bat文件  
  exe退出时调用bat,在bat文件中先sleep一会儿等exe文件澈底退出,del   your.exe  
  del   your.batTop

2 楼Bind(宁静雪:找到你,绑定你!)(再战江湖)回复于 2002-05-20 17:44:44 得分 0

好像不可以哟。我曾经试过。这时EXE是只读的,即不能改写更不能删除。WINDOWS在打开一个文件后是不允许别的线程删除它的。你可以做个小试验:打开一个文本文件,在关闭前把这个文件删除掉,结果一定是失败。Top

3 楼llm308(*软件民工*)回复于 2002-05-20 17:45:17 得分 0

楼上的主意很好呀!Top

4 楼zhi_liu6(野战炮)回复于 2002-05-20 17:57:00 得分 15

下面这段程序可以实现自删除  
  非常精妙  
   
  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;  
  }Top

5 楼zcy_beijing(行云流水)回复于 2002-05-20 18:00:31 得分 0

我记得原来看过一篇文章讲过,可是我不记得在哪儿看过,如果谁看过请给给发一份,或给个链接。他好像用的什么“金禅脱壳”之类的方法。谢谢了!Top

6 楼Bind(宁静雪:找到你,绑定你!)(再战江湖)回复于 2002-05-20 18:03:11 得分 0

呵呵,楼上果然是高手。妙不可言!不知有没有改写EXE的代码?请教请教!Top

7 楼zcy_beijing(行云流水)回复于 2002-05-20 18:06:40 得分 0

可是如果在MFC程序中呢?是不是就没法用?要用的话放在哪儿?在CAPP的ExitInstance()?还是InitInstance()中?Top

8 楼zhi_liu6(野战炮)回复于 2002-05-20 18:14:48 得分 0

这个东西可是外国的大牛牛写的,不是一般的经典  
  跟同学研究好久才搞懂得  
  要用的话随便方在什么地方都可以吧?Top

9 楼dyw(旺仔)回复于 2002-05-20 18:16:18 得分 5

也许有用!  
   
  /*********************************************************  
    Module   name:   DeleteMe.cpp  
    Written   by:   Jeffrey   Richter  
    Description:   Allows   an   EXEcutable   file   to   delete   itself  
    **********************************************************/  
     
    #include   <Windows.h>  
    #include   <stdlib.h>  
    #include   <tchar.h>  
     
    /////////////////////////////////////////////////////////////////////  
     
    int   WINAPI   WinMain(HINSTANCE   h,   HINSTANCE   h2,   LPSTR   psz,   int   n)   {  
     
          //   Is   this   the   Original   EXE   or   the   clone   EXE?  
          //   If   the   command-line   1     argument,   this   is   the   Original   EXE  
          //   If   the   command-line   >1   argument,   this   is   the   clone   EXE  
          if   (__argc   ==   1)   {  
     
                //   Original   EXE:   Spawn   clone   EXE   to   delete   this   EXE  
     
                //   Copy   this   EXEcutable   image   into   the   user's   temp   directory  
                TCHAR   szPathOrig[_MAX_PATH],   szPathClone[_MAX_PATH];  
                GetModuleFileName(NULL,   szPathOrig,   _MAX_PATH);  
                GetTempPath(_MAX_PATH,   szPathClone);  
                GetTempFileName(szPathClone,   __TEXT("Del"),   0,   szPathClone);    
                CopyFile(szPathOrig,   szPathClone,   FALSE);  
     
                //   Open   the   clone   EXE   using   FILE_FLAG_DELETE_ON_CLOSE  
                HANDLE   hfile   =   CreateFile(szPathClone,   0,   FILE_SHARE_READ,   NULL,                                                      
  OPEN_EXISTING,   FILE_FLAG_DELETE_ON_CLOSE,   NULL);  
     
                //   Spawn   the   clone   EXE   passing   it   our   EXE's   process   handle  
                //   and   the   full   path   name   to   the   Original   EXE   file.  
                TCHAR   szCmdLine[512];  
                HANDLE   hProcessOrig   =   OpenProcess(SYNCHRONIZE,   TRUE,                                                                                    
  GetCurrentProcessId());  
                wsprintf(szCmdLine,   __TEXT("%s   %d   \"%s\""),   szPathClone,   hProcessOrig,                                  
  szPathOrig);  
                STARTUPINFO   si;  
                ZeroMemory(&si,   sizeof(si));  
                si.cb   =   sizeof(si);  
                PROCESS_INFORMATION   pi;  
                CreateProcess(NULL,   szCmdLine,   NULL,   NULL,   TRUE,   0,   NULL,   NULL,   &si,   &pi);  
                CloseHandle(hProcessOrig);  
                CloseHandle(hfile);  
     
                //   This   original   process   can   now   terminate.  
                }   else   {  
     
                //   Clone   EXE:   When   original   EXE   terminates,   delete   it  
                HANDLE   hProcessOrig   =   (HANDLE)   _ttoi(__targv[1]);  
                WaitForSingleObject(hProcessOrig,   INFINITE);  
                CloseHandle(hProcessOrig);  
                DeleteFile(__targv[2]);  
                //   Insert   code   here   to   remove   the   subdirectory   too   (if   desired).  
     
                //   The   system   will   delete   the   clone   EXE   automatically    
                //   because   it   was   opened   with   FILE_FLAG_DELETE_ON_CLOSE  
          }  
          return(0);  
    }  
  Top

10 楼zcy_beijing(行云流水)回复于 2002-05-20 18:19:36 得分 0

上面的那段代码可以用,如何在EXE运行时修改本身呢?Top

11 楼Bind(宁静雪:找到你,绑定你!)(再战江湖)回复于 2002-05-20 18:19:36 得分 0

哦?遮莫Jeffrey   Richter的《核心编程》上有?在哪一章?Top

12 楼scmb(coolcainiao)回复于 2002-09-10 15:13:44 得分 0

你们都试过这些代码吗?精妙个屁!Top

相关问题

  • 已经运行的程序如何修改或删除本身的.exe文件
  • 运行起一个EXE,然后把该EXE文件删除,这个运行的EXE还能继续运行么?
  • 怎样运行一个.exe文件中删除自己
  • 一个.exe的文件如何在运行时删除它自己?
  • 关于 XML 的查询,修改,删除!
  • 修改和删除记录问题
  • 有什么简单办法可以修改EXE文件大小但又能让程序正常运行?
  • 如何修改表里面的字段~(增加、修改、删除)
  • vc修改exe
  • 运行期修改菜单的问题

关键词

  • 文件
  • null
  • szpathclone
  • hprocessorig
  • szpathorig
  • 删除
  • clone
  • szcmdline
  • exe
  • si

得分解答快速导航

  • 帖主:zcy_beijing
  • zhi_liu6
  • dyw

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
x 提问