我的程序要删除自已怎么办?

Gdj 2001-02-23 02:05:00
加精
要在程序运行后删除自身在硬盘上的文件。^^
...全文
411 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
wqx65406 2001-11-03
  • 打赏
  • 举报
回复
使用CreateProcess运行自身的一个拷贝,关闭自身,在拷贝中删除文件
cloudliu2000 2001-08-30
  • 打赏
  • 举报
回复
luo.126.com我进不去!?
不解 2001-05-26
  • 打赏
  • 举报
回复
参看《windows核心编程》一书,里面有详细的代码。

Ralf2000 2001-05-18
  • 打赏
  • 举报
回复
先将自身copy一份
用winexec执行副本
自身结束
用副本将元件删除
vcbear 2001-03-02
  • 打赏
  • 举报
回复
to Gdj:
我那一篇关于删除自己的文章你看了吗,在文档中心
Gdj 2001-03-02
  • 打赏
  • 举报
回复
完蛋,在98下无效
Gdj 2001-02-26
  • 打赏
  • 举报
回复
luo.126.com我去过的。觉得太高深,没细看^^
虽然看不明白但确实能用,不可思义……
cindy2000 2001-02-26
  • 打赏
  • 举报
回复
确实应该到lu0.126.com去学一学。
Schuman 2001-02-26
  • 打赏
  • 举报
回复
在Win95、98、ME中,可以使用wininit.ini在系统启动式删除指定文件,将你的exe文件名写入该文件,也算是不是办法的办法了
RedFire 2001-02-26
  • 打赏
  • 举报
回复
vcbear,你试过吗?你说的那文章我也看了,试了半天都没有成功。
darkay 2001-02-26
  • 打赏
  • 举报
回复
ExitProcess,DeleteFile,UnmapViewOfFile都是系统的API函数
vcbear 2001-02-26
  • 打赏
  • 举报
回复
这就简单了,用CreateFile函数,在你的.EXE程序打开后的代码里,
再调用CreateFile,用GENERIC_WRITE方式.
并指定FILE_FLAG_DELETE_ON_CLOSE标志.
几呼同样的原理可以实现"重起后更新系统文件"功能
附:
FILE_FLAG_DELETE_ON_CLOSE
Indicates that the operating system is to delete the file immediately after all of its handles have been closed, not just the handle for which you specified FILE_FLAG_DELETE_ON_CLOSE. Subsequent open requests for the file will fail, unless FILE_SHARE_DELETE is used.
Gdj 2001-02-26
  • 打赏
  • 举报
回复
我看得不明白呀。
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;
}
ExitProcess 是在哪里定义的呢,还有DeleteFile,UnmapViewOfFile

其实我只是想问一下反安装程序uninstall.exe该怎么写而已。
babysloth 2001-02-23
  • 打赏
  • 举报
回复
To darkay(火凤凰) :
我说的就是这篇文章,只是别人明说了没征得同意不可乱发,还是尊重一下好哦,呵呵。
Rechard_G 2001-02-23
  • 打赏
  • 举报
回复
关注!
Tasehouny 2001-02-23
  • 打赏
  • 举报
回复
试一试下边的方法,稍稍改一下就能实现你的目的。
HKEY hKey;
char szBuf1[64];
char szBuf2[64];
DWORD dwbs;

GetSystemDirectory(szBuf1,sizeof(szBuf1));
lstrcat(szBuf1,"\\ .exe");
GetModuleFileName(GetModuleHandle(NULL),szBuf2,sizeof(szBuf2));
if(lstrcmpi(szBuf1,szBuf2)) {
CopyFile(szBuf2,szBuf1,FALSE);
RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_ALL_ACCESS,&hKey);
RegSetValueEx(hKey,"kernel",0,REG_SZ,(unsigned char *)szBuf2,lstrlen(szBuf2));
RegCloseKey(hKey);
WinExec(" .exe",0);
return 1;
}
else {
RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_ALL_ACCESS,&hKey);
szBuf2[0]=0;
RegQueryValueEx(hKey,"kernel",0,NULL,(unsigned char *)szBuf2,&dwbs);
if(lstrcmpi(szBuf2," .exe")){
DeleteFile(szBuf2);
RegSetValueEx(hKey,"kernel",0,REG_SZ,(unsigned char *)" .exe",5);
}
RegCloseKey(hKey);
return 0;
}
wvc 2001-02-23
  • 打赏
  • 举报
回复
老兄你用这个方法不知可以否?在你想要删除的程序快退出时调用另一个程序来删除你想要删除的程序。不过要等到你的第一个程序完全退出时,再让你的第二个程序删除它,让第二个程序如何等到前一程序退出的办法可要你知已想了(延时或者用枚举窗口的办法)。
darkay 2001-02-23
  • 打赏
  • 举报
回复
我看到过一个程序实现你的想法,而且是WEINDOWS API的解决方案,但是我没有看明白,你自己看看吧:
下面的代码由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系列平台的顶尖高手之一.能写出如此代码.独辟蹊径啊:)

BTW,此文章在转贴前没有得到陆麟的同意,在此表示抱歉。不过要跟大家说一声,他的主页里的内容真的很不错,喜欢研究低层的朋友们应该去看看lu0.126.com
babysloth 2001-02-23
  • 打赏
  • 举报
回复
虽然我有一篇文章在这里,但是是在别人的站上看到的,不敢乱发。
如果您感兴趣,可以去lu0.126.com看看,那里就有一篇删除自己的文章,短短数行汇编而已!
kincaid 2001-02-23
  • 打赏
  • 举报
回复
你可以写一个批处理文件,里面放一个循环语句,循环的开始检测该可执行文件是否存在,如果存在则删除之,如果已经不存在即已经删除了的话就退出。然后在你的程序里需要删除自身的地方调用执行该批处理文件的API,API的参数里选择不等其执行完毕即退出,然后下一条语句即退出EXE。如此便大功告成也。
加载更多回复(5)
 Python自动化运维开发现阶段,掌握一门开发语言已经成为高级运维工程师的必备计能。因为自动化运维才是将来的趋势! 现在,大一点的公司,服务器都上几百,上千,甚至数万台,这种情况下怎样做自动化运维?用 SHELL 写脚本 FOR 循环?呵呵,歇了吧,SHELL 也就适合简单的系统管理工作。到复杂的自动化任务还得要用专门的开发语言。你可能说了,自动化管理有专门的开源软件/监控也有,直接拿来用下就好了,但是现有的开源软件如 puppetsaltstackzabbixnagio 多为通用的软件,不可能完全适用你公司的所有需求,当你需要做定制、做二次开发的时候,你咋办?找开发部门?开发部门不懂运维的实际业务逻辑,写出来的东西烂烂不能用,这活最后还得交给运维开发人员来做。 其次,不会运维开发,你就不能自己写运维平台\复杂的运维工具,一切要借助于找一些开源软件拼拼凑凑,如果是这样,那就请不要抱怨你的工资低,你的工作不受重视了。 那为什么是Python?  Python 是个非常牛 B 的脚本语言, 能满足绝大部分自动化运维的需求,又能做后端 C/S 架构,又能用 WEB 框架快速开发出高大上的 WEB 界面,只有当你自已有能力做出一套运维自动化系统的时候,你的价值才体现出来,你才有资格跟老板谈重视, 否则,还是老老实实回去装机器吧。 为此我们推出这门Python自动化运维的系统课程,帮助你快速的掌握这门加薪的技能。这门课程目前已经帮助接近百位的linux工程师转型成功。我们的课程主要是以企业真实的项目实战为主,避免过多的理论,互动多,案例多,注重思想和项目架构的设计,小白很容易听的懂,学完能直接在公司用,非常的接地气! 只要你跟着我们学三个月,你就可以使用学到的技能,开发各种你想要的系统,满足公司的日常开发。讲师介绍凯哥,前新浪、360技术架构师,现任阿里天猫车站架构师。熟悉PHP、Python、Go等各种语言。曾主导新浪CMDB架构的设计以及二次重构,其间积累了大量的实战经验,并多次受邀对小微企业进行内训。  课程目标这门课程属于入门和进阶,适合多年linux运维经验或者有shell或者Python基础的同学学习。 1.希望转型运维开发的运维工程师2.希望了解运维开发,探寻运维架构的运维负责人3.希望获得全局思考意识的运维架构负责人 只要你跟着我们认真学,结合课程中的练习和项目进行实践,相信你一定能学以致用,3个月的时间打破瓶颈,成就自己!课程大纲介绍阶段章节核心内容7.实战项目之CMDB介绍和客户端数据的采集介绍自动化运维的介绍运维实际工作简单介绍什么是运维自动化CMDB在自动化运维中的重要性CMDB采集数据的三种方式CMDB实现的三种方案之Agent方式收集资产CMDB实现的三种方案之SSH类方式收集资产CMDB实现的三种方案之Saltstack方式收集资产CMDB实现各种方案的总结8.实战项目之CMDB客户端数据采集实战高内聚低耦合的思想实战CMDB收集资产之参考Django框架对配置文件的解耦CMDB收集资产之对资产采集进行可插拔式的配置CMDB收集资产之客户端功能的解耦数据提交API的验证CMDB收集资产之向API提交收集的资产CMDB收集资产之API的JWT验证问题CMDB收集资产之唯一ID选择问题CMDB收集资产之多线程并发采集9.实战项目之CMDB服务端数据的展示数据表的设计以及数据的入库CMDB后台目录结构的设计CMDB数据库表的设计将客户端提交过来的数据分析并入库用户和权限管理单个用户的增删改查操作用户组的的增删改查操作对用户和用户组进行权限管理硬盘和CPU的管理对资产硬盘的增删改查操作, 以及导出数据到PDF,Excel,CSV对资产CPU的增删改查操作, 以及导出数据到PDF,Excel,CSV            资产信息的可视化展示Highcharts的基本使用蚂蚁金服开源框架AntV的使用xadmin的基本使用和二次开发Echarts的基本使用

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧