请问如何在运行时删除自己?

shyworm 2001-08-20 06:20:12
加精
例如发布一个demo.exe,只能演示一次,演示完毕即把自己删除。
请问如何才能做到呢?

如果除demo.exe还附带有demo.dll之类的文件,又该如何一并删除呢?
望各路高人不吝指点为谢!

再:在windows环境或者unix环境都可以实现吗?
...全文
532 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
colarcui 2002-01-29
  • 打赏
  • 举报
回复
me
rockhard 2002-01-19
  • 打赏
  • 举报
回复
作个记号先
Star_Desert 2002-01-06
  • 打赏
  • 举报
回复
study
caowk 2001-12-31
  • 打赏
  • 举报
回复
very good
dxhdxh2k 2001-12-26
  • 打赏
  • 举报
回复
2001年的电脑爱好者中有类似的题目,Very easy!仔细瞧瞧吧! 给分吧!
_xiaolifeidao 2001-12-19
  • 打赏
  • 举报
回复
ME TOO
sdice 2001-12-16
  • 打赏
  • 举报
回复
第一种方法WINME 下行不通的。
我用TR跟踪了CloseHandle函数,在遇到参数是某些特定数值时会强制返回,4就是其中之一!
seeking 2001-11-29
  • 打赏
  • 举报
回复
我把两个例程改成delphi,
复制品删除原文件:原文件是删除了,但复制品还在。
堆栈返回的方法可以运行,但没有删除。
TigerHu 2001-11-22
  • 打赏
  • 举报
回复
学习!
temporary 2001-10-10
  • 打赏
  • 举报
回复
用复制品删除原文件的我在98/vc6下通过
danfer 2001-09-10
  • 打赏
  • 举报
回复
gso shi zai shi gao!
ray2_ls 2001-09-10
  • 打赏
  • 举报
回复
好东西
fencer_2000 2001-08-28
  • 打赏
  • 举报
回复
一个都通不过!!!
MountLion 2001-08-21
  • 打赏
  • 举报
回复
我见过一个人写的程序,末尾生成一个批处理,然后运行批处理,退出。
:begin
delete demo.exe
if exist demo.exe goto begin

没有试过,感觉在Windows环境下应该可以。
shyworm 2001-08-21
  • 打赏
  • 举报
回复
太好了,谢谢各位大虾指点!
dcz 2001-08-20
  • 打赏
  • 举报
回复
高!
rjren 2001-08-20
  • 打赏
  • 举报
回复
unix下直接remove就可以了
example:

user@linux:/tmp> cat te.c
#include <stdio.h>

int main( int argc, char** argv )
{
printf( "%s is being deleted!\n", argv[0] );
remove( argv[0] );
return 0;
}
user@linux:/tmp> gcc -o te te.c
user@linux:/tmp> ls -al te*
-rwxr-xr-x 1 wqc sysgrp 11786 Aug 24 06:10 te*
-rw-r--r-- 1 wqc sysgrp 141 Aug 24 06:08 te.c
user@linux:/tmp> ./te
./te is being deleted!
user@linux:/tmp> ls -al te*
-rw-r--r-- 1 user sysgrp 141 Aug 24 06:08 te.c
乱七八糟 2001-08-20
  • 打赏
  • 举报
回复
---------------转--------------------------------

jeffrey richter给我们做了一个范例:

deleteme.cpp
module name: deleteme.cpp
written by: jeffrey richter

description: allows an executable file to delete itself

********************************************************************/


#include <windows.h>

#include <stdlib.h>

#include <tchar.h>


/////////////////////////////////////////////////////////////////////


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_existing, 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, szpathorig);

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_existing, 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的虫虫大多都会。今天又学一招,爽。

prog_st 2001-08-20
  • 打赏
  • 举报
回复
--------摘抄-------

俺也整理了一些东东,但是没有试过:
下面的代码由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系列平台的顶尖高手之一.能写出如此代码.独辟蹊径啊:)

/////////////////////////////////////////////////////////////////////////
//98,2000下通过
//nt/2000下面的删除代码方法来自陆麟(lu0)的文章,再此表示感谢

#pragma optimize( "", off )
/*NOTE fun_AfterDelSelf MUST BE memory allocate by HeapAlloc or VirtualAlloc,and you should free it your self.
,can't use normal callback function(which data on diskdrive,and can't access it after we delete ourself
*/

int DeleteSelf(void * fun_AfterDelSelf)//
{
typedef int (WINAPI *PFClose)(LPVOID);
OSVERSIONINFO os_info;
os_info.dwOSVersionInfoSize=sizeof(os_info);
LPVOID pBuffer=NULL;
PFClose pClose;
PFClose pDelete;
char fn[4096];
HINSTANCE hins=GetModuleHandle(NULL);
GetModuleFileName(NULL,fn,4096);
if(!GetVersionEx(&os_info))
 return false;

switch(os_info.dwPlatformId)
{
case VER_PLATFORM_WIN32_NT:
 __try{
  while(CloseHandle((HANDLE)4));
 }__except(1){
 }
 CloseHandle((HANDLE)4);
 pClose=PFClose(UnmapViewOfFile);
 break;
case VER_PLATFORM_WIN32_WINDOWS:
 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]
 mov eax,fun_AfterDelSelf
 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
}
return 0;
}
#pragma optimize( "", on )
/////////////////////////////////////////////////////////////////////////
saturday 2001-08-20
  • 打赏
  • 举报
回复
:)
加载更多回复(2)
XP系统下Internet信息服务IIS的安装方法 1、控制面板里没有“->添加/删除Windows组件->Internet信息服务(IIS)”组件的添加方法。 (某些GHOST系统精简后没有此项******不是所有的GHOST系统都需要进行这一步) 把IIS列进系统组件并安装。先到网上下载iis5.安装包,解压到D盘的根目录下(最好是根目录,便于后面打命令)把目录名该为iis51 首先在“开始”菜单的“运行”中输入“c:\Windows\inf\sysoc.inf”,在sysoc.inf中找到“[Components]”这一段,在里面加上这段:“iis=iis2.dll,OcEntry,iis2.inf,,7”,之后保存并关闭。 接下来,在运行中输入“CMD”然后回车,打开命令行模式,在命令行下输入下列的两条命令,在每一行命令结束后回车: expand d:\iis51\iis.dl_ c:\Windows\system32\setup\iis2.dll expand d:\iis51\iis.in_ c:\Windows\inf\iis2.inf 添加.删除windows组件时出现无法打开信息文件iis.inf 添加.删除windows组件时出现无法打开安装文件iis.dll (下载相关的文件,这里的压缩包是我安装时搜集的!到上面提到的相应目录中,即可) 注意如果你解压到了F盘就把上面的D改为F就可以了,其他同理。这时候,你打开控制面板->添加/删除Windows组件,就会发现,Internet信息服务(IIS)的安装选项已经出现在安装列表里了。 之后就和平常安装IIS一样了,只不过,在安装的过程中会出现找不到文件的情况(这是正常的,因为你的IIS安装目录没在XP默认的目录下)。这时,你点吉浏览,选择你刚刚解压的目录就可以了,这种让你选择安装文件的现象共会出现几次。过一会,IIS就安装完成了,点击“完成”。但做到这一步还不算完,因为是安装包安装的,需要对IIS进行一些设置(不然会出现内部服务器500错误)。 2、解决数据库链接错误的方法 打开开始--所有程序--管理工具--组件服务,在左边选择“控制台根目录”->"组件服务"->"计算机"->"我的电脑"->"COM+应用程序", 然后在右边框里点右键"IIS Out-Of-Process Pooled Applications ",选择属性,点“标识”选项卡,选择“系统帐户”,然后确定,重启IIS即可。 3、无法进入“控制台根目录”->"组件服务"->"计算机"->"我的电脑"->"COM+应用程序"的解决方法 进入“控制台根目录”->"组件服务"->"计算机"->"我的电脑"->"COM+应用程序", 出错后,错误代码8004E00F-COM+无法与Microsoft分布式事务协调程序 在开始程序运行:msdtc -resetlog 就行了。 4、->"COM+应用程序"里正常要有的应用程序一般为8个对象,如果没有IIS****项目则在控制面板/组件里重新安装 IIS就会解决。 COM+ Explorer COM+ QC Dead Letter Queue Listener COM+ Utilities IIS In-Process Applications IIS Out-Of-Process Pooled Applications IIS Utilities MS Software Shadow Copy Provider System Application需注意以下几点. 在Internet信息服务下有本地计算机(计算机机名),单击名键,选择断开,提示确实要断开本地计算机(计算机机名)吗?选择确定。 右键单击Internet,选择连接,计算机名填本机名称,用户名填本机管理员帐号(Administrator),确定。 1:在“服务(本地)”里有一项Eventlog和HTTP SSL都和IIS的或World Wide Web Publishing Services所以来的服务项 打开它们 2:在“服务(本地)”里中的World Wide Web Publishing Services所需要依赖的服务(Dependencies),看到是IIS Admin Service。进而发现IIS Admin Service也无法启动,再查IIS Admin Service的Dependencies,查的结果是Protected Storage和RPC(Remote Procedure Call),于是启动RPC,接着顺利启动IIS Admin Service,接着启动World Wide Web Publishing Services,于是IIS恢复正常。 3:当启动World Wide Web Publishing Services时提示 错误:127:找不到指定的程序。时:可以在添加删除程序(控制面板-添加删除程序)中的最上边点"显示更新"到系统更新软件里的更新的补丁KB939373 删掉它! 然后再启动IIS 一切OK 4:重装一下IIS 5.若出现默认网站(停止)可以在添加删除里把系统更新的939373删除即可用了! 将IIS安装到Ghost系统中,本教程适合Ghost XP SP2、SP3,提供安装过程需要Windows XP安装光盘,非Ghost系统光盘,另外如果安装成功还有什么错误,请参与本栏目相关教程。 Ghost系统安装IIS 有一些版本的Ghost系统中,并不是不能安装IIS,而是“MSDTC服务被关闭所造成的。 1、 MSDTC服务被停用 解决这个问题前,先在“开始-设置-控制面板-管理工具”中打开组件服务,在“组件服务”中依次单击“控制台根目录-组件服务-计算机-我的电脑-COM+应用程序”,如果滑有启动“MSDTC服务,此时会弹出一个“COM+”无法与Microsoft分布式事务协调程序交谈的错误提示。 此时需要在系统中加载MSDTC服务,在“开始-运行”中输入“net srart msdtc”命令,会弹出一个提示窗口,系统会对MSDTC服务进行启动。如果以后想停止该服务,只需“运行”中输入“net stop msdtc ”命令即可。 启动MDSTC服务后,在组件服务中“COM+应用程序”项就可以进入了,在“COM+应用程序”中找到“IIS Out-Of-Process Pooled”,鼠标右键“属性”,进入到“标识”界面,在此点选“系统账户”并选择“交互式用户”,随后“确定”即可。 2、 IIS的安装 IIS安装方法非常简单,在“控制面板”的“添加/删除程序”中选择“添加Window组件”,打开“Windows组件”列表,在此勾选“Internet信息服务(IIS)组件”,随后单击下面的“详细信息”,打开“Internet信息服务”列表,勾选一些相关的组件即可。 IIS无法运行怎么办? IIS安装后无法正常运行,需要对“IWAM帐号密码”进行重新设置。首先在“控制面板”的“管理工具”中启动计算机管理,在“计算机管理”窗口左侧的列表中依次点选“计算机管理-系统工具-本地用户和组-用户”在打开的用户列表中,可以看到一个为“IWAM_8F381469CFAA4F9”用户名(注8F381469CFAA4F9为计算机名,不同电脑不一样),IWAM账号是安装IIS时系统自动建立的内置账号,主要用于启动进程之外的应用程序的Internet信息服务。 更改该用户密码时,需要使用adsutil.vbs脚本来实现,该文件位于C:\windows\adminscripts文件夹中,修改密码时,在CMD窗口中运行下面的命令: C:\inetput\adminscripts>adsutil set w3svc/wamuserpass "Password"。参数中“Password”就是要设置IWAM帐号的新密码,这样一般情况下就可以正常运行了IIS了。
本IIS安装程序适用于Windows 2003系统,IIS版本为6.0版。该自动安装程序最大程度简化了安装IIS的繁琐步骤,且无须操作系统光盘,直接双击即可自动完成安装,并自动注册asp.net运行环境(如果安装了.net),为基于IIS的软件开发和部署带来了极大的便利。 与IIS相关的常见问题: ●有没有用于其它操作系统的IIS全自动安装程序?   我们现已制作并提供了包括Windows 2000/XP/2003在内的多种操作系统所适用的IIS自动安装程序。 ●安装IIS时总是提示无法复制staxmem.dll、iisapp.vbs、convlog.exe等文件?   如果确定安装盘或安装文件没问题,在“运行”中执行:esentutl /p %windir%/security/database/secedit.sdb。然后再重新开始安装IIS。 ●安装IIS后访问网站下的页面时出现HTTP 500内部服务器错误?   请运行此文件夹中的IIS500.bat,之后再重新测试。 ●IIS(或IIS下的网站)无法启动?   目前已知的导致IIS不能启动的原因有:   1、安装了WEB迅雷。解决方法:卸载WEB迅雷,或先退出WEB迅雷再启动IIS,然后再启动WEB迅雷(如果需要);   2、其它软件占用了80端口。解决方法:修改其它网站的端口或IIS下的网站的端口,避免使用相同的端口。可以使用诸如TCPView或FPort等第三方工具来查找正在使用80端口的其它应用程序;   3、操作系统补丁所导致的。打开“添加删除程序”,勾选“显示更新”,在列表中找KB939373、 kB942830、KB942831这三个补丁,如果有,将其卸载,之后再启动IIS。 感谢"蓝点"

16,550

社区成员

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

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

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