热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于程序的自我删除

最近我在程序中添加一个卸载功能。要求在把所有的文件删除后程序能自我删除。。。在网上查到了一些资料,比如把自我删除代码写入DLL,然后作为程序的资源。。。但由于我不懂汇编,只能照搬,结果死得很惨
最近我在程序中添加一个卸载功能。要求在把所有的文件删除后程序能自我删除。。。
在网上查到了一些资料,比如把自我删除代码写入DLL,然后作为程序的资源。。。
但由于我不懂汇编,只能照搬,结果死得很惨。。。
各位肯定有做过这方面经验的吧?能不能提示一下
要能给个可以在98以上系统都能使用的的源码(我猜源码应该不长),兄弟愿意再加100分
谢谢啦

25 个解决方案

#1


建议去技术区!!

#2


我也没把握到底到哪好
那麻烦斑竹移到基础类去,谢谢

还有我的这个程序只能运行一个实例

#3


程序自己删除自己?
这不可能吧

#4


up

#5


一般使用到汇编!需要重新启动

还有我的这个程序只能运行一个实例

使用临界区互斥变量

#6


还有我的这个程序只能运行一个实例
-----------------------------------
我的意思是说,由于我的程序只能运行一次
所以把这个程序拷到临时文件夹,再启动一个实例是行不通的
但如果实在没招,只能先这样

汇编,不会啊。重不重启倒不重要

#7


程序自己删除自己?
这不可能吧
--------------------------------
确实,如果程序还在运行是绝对不可能删除的
除非修改系统底层

但能让程序结速后变着法删除。。。

#8


__asm
{
lea   eax, buf
push   0
push   0
push   eax
push   ExitProcess
push   module
push   DeleteFile
push   UnmapViewOfFile
ret
}

#9


漏了点

char   buf[MAX_PATH];
HMODULE module;
module = GetModuleHandle(0);
GetModuleFileName(module, buf, MAX_PATH);
CloseHandle((HANDLE)4);
__asm
{
lea   eax, buf
push   0
push   0
push   eax
push   ExitProcess
push   module
push   0//DeleteFile
push   UnmapViewOfFile
ret
}

#10


晕,push   0//DeleteFile应该是push DeleteFile

个破csdn不允许编辑帖子,强烈抗议!

#11


我可以很负责任的告诉你,必选借助MOVEFILEEX()将文件登记,并且重启,才能删除,否则执行过程中自身直接删除自身是不可实现的。

#12


BOOL SelfDelete() 

SHELLEXECUTEINFO sei; 
TCHAR szModule [MAX_PATH], 
szComspec[MAX_PATH], 
szParams [MAX_PATH]; // get file path names: 
if((GetModuleFileName(0,szModule,MAX_PATH)!=0) && 
(GetShortPathName(szModule,szModule,MAX_PATH)!=0) && 
(GetEnvironmentVariable(_T("COMSPEC"),szComspec,MAX_PATH)!=0)) 

// set command shell parameters 
lstrcpy(szParams,_T("/c del ")); 
lstrcat(szParams, szModule); 
lstrcat(szParams, _T(" > nul")); // set struct members 
sei.cbSize = sizeof(sei); 
sei.hwnd = 0; 
sei.lpVerb = _T("Open"); 
sei.lpFile = szComspec; 
sei.lpParameters = szParams; 
sei.lpDirectory = 0; 
sei.nShow = SW_HIDE; 
sei.fMask = SEE_MASK_NOCLOSEPROCESS; // increase resource allocation to program 
SetPriorityClass(GetCurrentProcess(), 
REALTIME_PRIORITY_CLASS); 
SetThreadPriority(GetCurrentThread(), 
THREAD_PRIORITY_TIME_CRITICAL); 
// invoke command shell 
if(ShellExecuteEx(&sei)) 

// suppress command shell process until program exits 
SetPriorityClass(sei.hProcess,IDLE_PRIORITY_CLASS); 
SetProcessPriorityBoost(sei.hProcess,TRUE); 
// notify explorer shell of deletion 
SHChangeNotify(SHCNE_DELETE,SHCNF_PATH,szModule,0); 
return TRUE; 

else // if error, normalize allocation 

SetPriorityClass(GetCurrentProcess(), 
NORMAL_PRIORITY_CLASS); 
SetThreadPriority(GetCurrentThread(), 
THREAD_PRIORITY_NORMAL); 


return FALSE; 
}

#13


加上上面的代码后,重载DestroyWindow()函数,在里面添加一行:
SelfDelete();
再看看你的.exe文件还在不在^_^

#14


过强,恐怖分子

#15


LookSail给出的代码,我试过,确实可以删除,但好像只能在9X,NT,2000下有效
 Snow_Ice11111(雪上加冰) 的代码我试试,看能不能在9X下运行(我的感觉好像不妙,呵呵)
 bjskyhorse:我只是想在退出的时候删除,但那时还是在运行。。。你的方法,我没接触过啊:(~~~

#16


LookSail:有没有可以通过判断平台(9X,NT,2000,XP)来进行相应操作的代码,我现在差XP下的。谢谢啦。。。。

#17


DWORD dwVersion; 
dwVersion=::GetVersion(); 
if (dwVersion >= 0x80000000) //Win9x 
{
AfxMessageBox(_T("9X"));
return;

else
{
AfxMessageBox(_T("2K or NT")); //Win2K/WinXP
}

#18


谢谢rageliu!
是这样判断平台。
可能我的意思没说清楚
我的意思是说,我如何根据不同的平台(9X,NT,2000,XP)来执行LookSail给出的代码?
比如,我已判断出是9X,那我得用FreeLibrary(),如果是NT,2000我用UnmapViewOfFile来取消映射等,那在XP下呢?
LookSail给出的代码,只能在98下吧?
^_^

#19


Snow_Ice11111的方法不错。只是不能有100%的把握。谢谢
我在其他平台测试一下

#20


mark

#21


强人啊,学习一下

#22


先做个记号.

#23


Mark!

#24


Ar

#25


look this...

the function is the delect owner function in my code.you can call it to delete you execute file.

void CUNINSTALLDlg::DeleteOwner()
{
STARTUPINFO si;
    PROCESS_INFORMATION pi;

    char  szSourcePathName[MAX_PATH] = "";
    char  szBatFile[MAX_PATH];
    DWORD dwNumByte;                    //number of byte

    // get module file name
    GetModuleFileName(NULL, szSourcePathName, _MAX_PATH);
    *(strrchr(szSourcePathName, '\\')) = '\0';
    //得到exe文件所在的目录

    HANDLE hFile = CreateFile(DELUNSETUPBAT,
        GENERIC_READ|GENERIC_WRITE,
                          FILE_SHARE_READ,
NULL,
        CREATE_NEW,
                          FILE_ATTRIBUTE_NORMAL,
        NULL);
       // 往BAT文件写的内容
       wsprintf(szBatFile,
__TEXT(":Repeat\r\n")
     __TEXT("rmdir /Q /S \"%s\"\r\n")
__TEXT("if exist \"%s\" goto Repeat\r\n")
         __TEXT("del \"%s\"\r\n"), 
     szSourcePathName,
szSourcePathName,
DELUNSETUPBAT);
    
   // 写文件然后关闭.
    WriteFile(hFile, szBatFile, lstrlen(szBatFile) * sizeof(char),
        &dwNumByte, NULL);
    CloseHandle(hFile);

    // Get ready to spawn the batch file we just created.
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);

    // We want its console window to be invisible to the user.
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_HIDE;

    // Spawn the batch file with low-priority and suspended.
    if (CreateProcess(NULL, DELUNSETUPBAT, NULL, NULL, FALSE,
        CREATE_SUSPENDED | IDLE_PRIORITY_CLASS, NULL, __TEXT("\\"), &si, &pi)) {

         // Lower the batch file's priority even more.
         SetThreadPriority(pi.hThread, THREAD_PRIORITY_IDLE);

         // Raise our priority so that we terminate as quickly as possible.
         SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
         SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);

         // Allow the batch file to run and clean-up our handles.
         CloseHandle(pi.hProcess);
         ResumeThread(pi.hThread);
         // We want to terminate right away now so that we can be deleted
         CloseHandle(pi.hThread);
    }
}

推荐阅读
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
author-avatar
phpxiaofei
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有