程序删除自杀

转载 2004年08月22日 20:12:00
CSDN_Logo.gif
ddd.GIF
01_bg_02.gif
  首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才 menu_1.gif 01_bg_03.gif
移 动专 题SUNIBM微 软微 创精 华Donews人 邮
我的技术中心 
我的分类 我的文档
全部文章 发表文章
专栏管理 使用说明

RSSIcon.gif RSS 订阅 
最新文档列表
Windows/.NET
.NET  (rss)    
Visual C++  (rss)    
Delphi  (rss)    
Visual Basic  (rss)    
ASP  (rss)    
JavaScript  (rss)    
Java/Linux
Java  (rss)    
Perl  (rss)    
综合
其他开发语言  (rss)    
文件格式  (rss)    
企业开发
游戏开发  (rss)    
网站制作技术  (rss)    
数据库
数据库开发  (rss)    
软件工程
其他  (rss)    

积极原创作者 
A8P8D3JK (1)
adamsun (3)
ahxu (2)
maoerzuozuo (6)
playyuer (30)
lgchao (2)
devercn (8)
foxmail (3)
netcasper (2)
cker (12)
CSDN - 文档中心 - Visual C++ 阅读:3727   评论: 2    参与评论
标题   一种巧妙的删除程序自己的方法     laiyiling [收藏]
关键字   一种巧妙的删除程序自己的方法
出处  
大家都知道,一般的程序运行的时候,可执行文件本身是被操作系统保护的,不能用改写的方式访问,更别提在本身还在运行的时侯删除自己了。在Lu0的主页上看到一种UNDOCUMENT的方法,通过改变系统底层的文件访问模式实现删除自己,那是实在功夫。我看 了很是佩服。但是有没有一种用在MSDN上就能查到的函数实现呢?有!Jeffrey Richter给我们做了一个范例:
 
DeleteMe.CPP
 
Module name: DeleteMe.cpp
Written by: Jeffrey Richter
Description: Allows an EXEcutable file to delete itself
**************************************************/
 
#include
#include
#include
 
/////////////////////////////////////////////////
 
int WINAPI WinMain(HINSTANCE h, HINSTANCE b, 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_EXISTI
NG, 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, szPat
hOrig);
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);
}
 
看懂了吗?
 
这一段程序思路很简单:不是不能在运行时直接删除本身吗?好,那么程序先复制(CLONE)一个自己,用复制品起动另一个进程,然后自己结束运行,则原来的EXE文件不被系统保护.这时由新进程作为杀手删除原来的EXE文件,并且继续完成程序其他的功能。

 
新进程在运行结束后,复制品被自动删除。这又是值得介绍的一个把戏了,注意:
// Open the clone EXE using FILE_FLAG_DELETE_ON_CLOSE
HANDLE hfile = CreateFile(szPathClone, 0, FILE_SHARE_READ, NULL,OPEN_EXISTIN
G, FILE_FLAG_DELETE_ON_CLOSE, NULL);
这里面的FILE_FLAG_DELETE_ON_CLOSE标志,这个标志是告诉操作系统,当和这个文件相关的所有句柄都被关闭之后(包括上面这个CREATEFILE创建的句炳),就把这个文件删除。几乎所有的临时文件在创建时,都指明了这个标志。另外要注意的是:在复制品进程对原始程序操刀之前,应该等待原进程退出.在这里用的是进程同步技术.用HANDLE hProcessOrig = OpenProcess(SYNCHRONIZE, TRUE,GetCurrentProcessId());得到原进程句柄.SYNCHRONICE标志在NT下有效,作用是使OpenProcess得到的句柄可以做为同步对象.复制品进程用WaitForSingleObject函数进行同步,然后一个DeleteFile,以及进行其它销毁证据(Jeffrey说:比如删目录)的工作,打完收工!
 
程序是基于CONSOLE的,通过传入的参数确定是原始的进程还是复制品新进程,并且得到需要操作的目标文件的信息(主要是路径),复制品放在系统的TEMP目录(GetTempPath得到),你也可以随便找个你认为安全的地方(比如:WINDOWS/SYSTEM32等等)。这里面没有甚么深的技术.再看其他的一些实现删除自己的例子,比如说在进程退出前,用fwrite等方法输出一个.BAT文件,在里面写几句DEL,然后WINEXEC一下这个BAT文件即可.玩儿过DOS的虫虫大多都会。今天又学一招,爽。

相关文章
对该文的评论
ico_pencil.gifCSDN 网友 ( 2004-07-27)
最简单的办法就是生成一个临时的BAT文件,BAT文件在执行过程中可以删掉自己。
ico_pencil.gifCSDN 网友 ( 2004-07-15)
如果是COM组件呢?
COM组件如何删除自身呢?


网站简介 - 广告服务 - 网站地图 - 帮助信息 - 联系方式 - English biaoshi.gif
北京百联美达美数码科技有限公司 版权所有 京ICP证020026号
Copyright © CSDN.NET, Inc. All Rights Reserved
pageview1.asp?columnid=4&itemid=11

Android 杀死process进程(自杀和他杀)

finish();//关闭当前的activity。 //把自己的进程杀死。 //自杀的方法。 android.os.Process.killProcess(android.os...
  • confusing_awakening
  • confusing_awakening
  • 2017年05月03日 21:10
  • 525

MFC软件卸载代码

// m_Software.cpp : 实现文件 // #include "stdafx.h" #include "MFCApplication1.h" #include "m_Software.h...
  • u011672712
  • u011672712
  • 2016年06月24日 13:18
  • 388

从王庆根自杀到欧建新自杀之我见

王庆根,男,神童级别人物,曾在美国斯坦福大学攻读化学专业。学霸经历可谓星星闪耀,能够亮瞎每个人的24k氪金狗眼。40岁自杀。 欧建新,男,中兴某公司的老员工。42岁自杀。 王庆根详情:王庆根 ...
  • bbgwlove
  • bbgwlove
  • 2018年01月12日 18:27
  • 32

用C++ 实现(程序自杀)

转载自:http://blog.csdn.net/zhengkangchen/article/details/3980905 近日看到网友询问如何实现程序运行之后把自己删除的方法,用户只要一运行...
  • u012377333
  • u012377333
  • 2015年03月07日 16:58
  • 529

『other』恶搞自杀小程序

去年写过一个关于键盘钩子控制视频播放的程序,今年偶然想起来都不知道怎么弄的了。 于是,今天又研究了一下。 之前有想过利用它可以写点恶搞的小程序。今天想了想,于是就有了这篇恶搞自杀小程序。 原理比较...
  • ppandaren
  • ppandaren
  • 2013年11月24日 01:03
  • 1399

那个丧心病狂的红蓝眼睛逻辑问题推理:第N天有N个红眼睛自杀,还是什么都不会发生?

题目设定是这样的,一个岛上有100个人,其中有5个红眼睛,95个蓝眼睛。这个岛有三个奇怪的宗教规则。 1. 他们不能照镜子,不能看自己眼睛的颜色。  2. 他们不能告诉别人对方的眼睛是什么颜色...
  • u013770886
  • u013770886
  • 2014年06月07日 22:26
  • 2438

企业自杀行为:重写程序

http://www.vaikan.com/startup-suicide-rewriting-the-code/ 敏捷开发和最小化功能组合的好处是能持续得到客户反馈,快速迭代,防止无用...
  • romandion
  • romandion
  • 2015年02月03日 17:32
  • 595

Service简介与生命周期讲解(一)

一、Service的介绍Service 是一个可以在后台执行长时间运行操作而不使用用户界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。 此外,组件可以绑定...
  • hello_1s
  • hello_1s
  • 2016年08月03日 16:19
  • 1502

Windows 下 Delphi 程序杀死其它进程和自杀

Delphi 程序如果能杀死其它进程,就能杀死自己 --- 自杀。 自杀的理由是什么呢?程序大了,代码太多,很多地方资源释放关系里不清楚(本质原因还是架构不好,再加上接口的相互引用 -- 接口相互引...
  • pcplayer
  • pcplayer
  • 2017年04月08日 17:31
  • 111

一名程序员十年技术之路的思考与感悟

文:赵建春 回顾在腾讯的十年,作为一个本科毕业生,在管理上六年升任副总监,技术上七年半晋升 T4 专家。虽不是发展最好的,但相对平均速度来说都是比较快的。我总结主要的几点是学习成长、合作共赢、总...
  • u014344668
  • u014344668
  • 2016年09月08日 17:47
  • 551
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:程序删除自杀
举报原因:
原因补充:

(最多只允许输入30个字)