程序删除自杀

转载 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

C#程序自杀 程序删除自己

主要是使用bat批处理命令,话不多说,代码说事         private void DeleteUnInstallself()         {             string batD...
  • u010007460
  • u010007460
  • 2016-04-29 17:03:45
  • 380

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

近日看到网友询问如何实现程序运行之后把自己删除的方法,用户只要一运行程序,可执行文件就没有了,可是程序还是在跑,胆小的只怕要喊"鬼呀!","老婆,快出来看上帝"甚么的。其实最典型的用法是写反安装程序....
  • zhengkangchen
  • zhengkangchen
  • 2009-03-11 16:53:00
  • 1529

c++实现一个自杀程序

如何实现一个程序,让他运行后删除自己?这是个有趣的问题,在网上找到了一个work的方法: char szCommandLine[MAX_PATH + 10];    //设置本进程为实时执行,快速退出...
  • leonwei
  • leonwei
  • 2013-07-31 18:48:53
  • 2350

VC自杀程序代码 自杀程序

  • 2010年12月07日 10:20
  • 2KB
  • 下载

几种程序自杀的方法

procedure DeleteMe;var  BatchFile: TextFile;  BatchFileName: string;  ProcessInfo: TProcessInformati...
  • Tercel99
  • Tercel99
  • 2008-02-13 09:31:00
  • 1748

C中的自杀函数和C++中的自杀类

今天看glibc 2.7的内存分配代码,注意到一个诡异现象:某函数的指针自我清空。也就是说,此函数指针只能用一次。具体说来就是指向函数malloc_hook_ini的函数指针__malloc_hook...
  • SeedJYH
  • SeedJYH
  • 2008-05-29 18:48:00
  • 1147

自杀程序(VC)

转载一(测试过) exe自删除(VC版本) [转贴 2008-05-18 17:07:53]  
  • redchairman
  • redchairman
  • 2010-04-11 01:09:00
  • 1434

android应用关闭本身(自杀)

Intent startMain = new Intent(Intent.ACTION_MAIN);            startMain.addCategory(Intent.CATEGORY...
  • wuyaoyao19880120
  • wuyaoyao19880120
  • 2012-03-30 00:43:51
  • 1375

vba 实现宏自杀

sub kill() '宏的自杀 ' ActiveWorkbook.Activate For i = 1 ToActiveWorkbook.VBProject.VBComponents.Coun...
  • qinglinglaoren
  • qinglinglaoren
  • 2012-04-25 11:49:20
  • 1514

android 进程自杀再重启的方法

PendingIntent restartIntent = PendingIntent.getActivity(mContext, -1, intent, PendingIntent.FLAG_CAN...
  • shan987
  • shan987
  • 2015-12-09 16:04:59
  • 900
收藏助手
不良信息举报
您举报文章:程序删除自杀
举报原因:
原因补充:

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