科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件VC小技巧(10)-----运行后自删除程序

VC小技巧(10)-----运行后自删除程序

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

当一个可执行程序exe在执行过程中,程序文件无法删除,这是因为系统将每个正在运行的程序对应的硬盘文件映射到内存,即虚拟内存,要实现自删除,关键一点在程序退出前将程序从内存映射中解放出来,然后再调用文件操作函数删除程序文件!

作者:风雨人生 来源:CSDN 2008年3月23日

关键字: 程序 自删除 C++ C Linux

  • 评论
  • 分享微博
  • 分享邮件

当一个可执行程序exe在执行过程中,程序文件无法删除,这是因为系统将每个正在运行的程序对应的硬盘文件
映射到内存,即虚拟内存,要实现自删除,关键一点在程序退出前将程序从内存映射中解放出来,然后
再调用文件操作函数删除程序文件!

typedef int (WINAPI *PFClose)(LPVOID);
    OSVERSIONINFO os_info;
    os_info.dwOSVersionInfoSize=sizeof(os_info);
    LPVOID pBuffer=NULL;
    PFClose pClose,pDelete;
    char fn[4096];
    HINSTANCE hins=GetModuleHandle(NULL); // 得到本程序句柄
    GetModuleFileName(NULL,fn,4096);      // 得到本程序名称
    if(!GetVersionEx(&os_info))           // 得到当前Windows系统版本
       return FALSE;
   
    switch(os_info.dwPlatformId)
    {
           case VER_PLATFORM_WIN32_NT:    // 当前系统为WinNT平台系统
                __try
                {
                    while(CloseHandle((HANDLE)4));
                }
                __except(1)
                {    }
                CloseHandle((HANDLE)4);
                pClose=PFClose(UnmapViewOfFile);
                break;
           case VER_PLATFORM_WIN32_WINDOWS: // 当前系统为Win9X平台系统
                pClose=PFClose(FreeLibrary);
                break;
           default:
                return FALSE;
    }
    pDelete=PFClose(DeleteFile);
    pBuffer=VirtualAlloc(NULL,4096,MEM_COMMIT,PAGE_EXECUTE_READWRITE);   
    _asm
    {
         call _delete_end
    }
    _asm   // 尝试关闭并删除程序
    {
     _test_close:
         push hins
         call [pClose]   // 关闭程序
         or eax,eax
         jz _test_close
         lea eax,fn
         push eax
         call [pDelete]  // 删除程序
         or eax,eax
         jz _Exit_Process
         call eax
     _Exit_Process:  // 退出进程
         push 0
         push MEM_RELEASE
         push 0
         push pBuffer
         push ExitProcess  // 退出进程
         push VirtualFree
         ret
    }
    _delete_end:     // 删除准备工作
    _asm   
    {
         pop ebx
         push 128
         push ebx
         push [pBuffer]
         call memcpy
         jmp pBuffer
    }

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章