运行后自已删除程序

本文介绍了一种使可执行程序在退出前实现自我删除的技术。通过解除程序在内存中的映射并利用不同Windows平台下的特定函数(如UnmapViewOfFile或FreeLibrary),最终调用DeleteFile完成删除。该方法适用于WinNT及Win9X平台。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当一个可执行程序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     }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值