删除一个正在运行的程序?

game_sage 2002-11-23 04:30:03
#include "windows.h"
int main(int argc, char* argv[])
{
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 UnmapViewOfFile
push DeleteFile
ret
}

return 0;
}
//我试了一下,不行,是什么原因?????
//WIN98+BCB6
...全文
80 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Taiji02 2002-11-25
  • 打赏
  • 举报
回复
先转载一篇文章,来自lu0。


下面的代码由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系列平台的顶尖高手之一.能写出如此代码.独辟蹊径啊:)

但是这段代码在C++Builder里不能通过编译,要做一下修改,如下。

#include <windows.h>

int main()
{
char buf[MAX_PATH];
HMODULE Hm1,Hm2;
HANDLE Ex,De,Un;
Hm2=GetModuleHandle(0);
GetModuleFileName(Hm2,buf,255);
Hm1=GetModuleHandle("Kernel32");
Ex=GetProcAddress(Hm1,"ExitProcess");
De=GetProcAddress(Hm1,"DeleteFileA");
Un=GetProcAddress(Hm1,"UnmapViewOfFile");
CloseHandle(HANDLE(4));
__asm {
LEA EAX,buf
PUSH 0
PUSH 0
PUSH EAX
PUSH Ex
PUSH Hm2
PUSH De
PUSH Un
RET
}
return 0;
}

以上是抄来的,后一种方法我没试,哪位仁兄有结果了请通知一声。
pzoon 2002-11-24
  • 打赏
  • 举报
回复
sjd163(sjd163)
你的东西怎么样了
game_sage 2002-11-24
  • 打赏
  • 举报
回复
程序是在别的的地方找来的,效果是运行之后,把自己删除,就是不知道原理!
IT-司马青衫 2002-11-23
  • 打赏
  • 举报
回复
unit Unit1;//关于隐藏桌面

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Registry,Dialogs, StdCtrls,tlhelp32 ;

type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
AppPath:String;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
ShellPath,ShellPathBack:String;
SysDire :array[1..255] of char;
WinDire :array[1..255] of char;

rValue:boolean;
pID:DWORD;
lppe:ProcessEntry32;
hSnapshot,pHandle:Thandle;
RegF:TRegistry;
delresult:longint;
begin
RegF:=TRegistry.Create;
RegF.RootKey := HKEY_LOCAL_MACHINE;
RegF.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run', true);
RegF.WriteString('多媒体智能终端', Application.ExeName);
RegF.CloseKey;

RegF.Free;

GetWindowsDirectory(WinDire,255);
ShellPath:=WinDire;
ShellPath:=ShellPath+'\explorer.exe';

GetSystemDirectory(SysDire,255);
ShellPathBack:=SysDire;
ShellPathBack:=ShellPathBack+'\dllcache'+'\explorer.exe';
AppPath:=ExtractFilePath(Application.ExeName)+'explorer.exe';

if (FileExists(ShellPath)) then
begin
hSnapshot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //因为桌面程序先运行其他程序之前
lppe.dwSize:= sizeof(lppe); //必须看看它是否在运行中
rValue:=Process32First(hSnapshot,@lppe);
while rValue=true do
begin
if(ExtractFilePath(lppe.szExeFile)='explorer.exe') then
begin
pID:=lppe.th32ProcessID; //如果在运行中就杀了它
pHandle:=OpenProcess(PROCESS_TERMINATE,false,pID);
delresult:=TerminateProcess(pHandle,9);

CopyFile(ShellPath.c_str(),AppPath.c_str(),1); //保存在ICT程序身边并灭了它
DeleteFile(ShellPath);
rValue:=false;
end
rValue:=Process32Next(hSnapshot,@lppe);
end
CloseHandle(hSnapshot);
end;

if (FileExists(ShellPathBack)) then
DeleteFile(ShellPathBack);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShellExecute(Handle,'Open',pchar(AppPath) ,0,0,SW_SHOW);
Application.Terminate;
end;

end.
sjd163 2002-11-23
  • 打赏
  • 举报
回复
例如你坐车正在跑,把车去掉。你怎么办。控制交给谁?
myy 2002-11-23
  • 打赏
  • 举报
回复
98不清楚,2k中运行中的程序可以改名,但不能直接删除。
for free~~~ 内附srvany.exe,instsrv.exe,让程序作为服务运行.txt 介绍如下: 让程序作为服务运行 想让一个程序在启动系统的时候自动运行,你有什么好办法?添加到启动组?那如果别人删除掉就不管用了。如果你使用了Windows NT/2000/XP,就可以试试把这个程序添加为一个服务,这样只有拥有权限的人才可以更改服务,只要你设置好权限,就不用担心会被别人删除了。 要把应用程序添加为服务,你需要两个小软件:Instsrv.exe和Srvany.exe。Instsrv.exe可以给系统安装和删除服务,Srvany.exe可以让程序以服务的方式运行。这两个软件都包含在Windows NT Resource Kit里,如果你没有,也可以点击这里下载。 把这两个程序保存在一个方便的位置,例如C盘根目录下。我们举例来说明,把OE作为一个服务添加进Windows XP Professional操作系统中,并把这个服务命名为“Mail”。在运行中输入“CMD”,回车,打开命令行窗口,在提示符后面直接输入:“c:\instsrv.exe Mail c:\srvany.exe”然后回车,其中的“c:\instsrv.exe”和“c:\srvany.exe”表示这两个程序保存的位置,而Mail则是你想添加的服务名称。 运行Regedit打开注册表编辑器,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services下,找到刚才添加的Mail,点击右键,新建一个键,命名为“Parameters”,点击新建的Parameters,并再次新建一个名称为“Application”的子键,数据类型为“REG_SZ”,数值为希望作为服务运行程序的所在位置,如果你的Windows系统安装在C盘下,那么OE的程序位置就是C:\Program Files\Outlook Express\msimn.exe ,把这个路径添入数值中。到现在,这个服务已经成功的添加并且设置好了。如果你希望做的更加专业,可以在Mail服务下建立一个名为Description的子键,数据类型同样为REG_SZ,数值可以写一些你对这个服务的描述,这个我们在后面可以看到。 接下来需要对服务做一些额外的设置,在运行中输入“Services.msc”并回车,在列表中找到我们刚添加的Mail服务,双击打开,来做详细的设置。在“General”选项卡上,我们需要设置这个服务的运行方式,在图二中可以看见,作为一个服务,有“自动(Automatic)”,“手动(Manual)”和“禁止(Disabled)”三种启动类型,按照需要,我们一般设置成自动就可以了。而在“Logon”选项卡下可以设置以什么身份运行这个服务,一般可以不用理会,按照默认的设置。“Recovery”选项卡下则是进行恢复设置的,你可以指定,在服务第一次,第二次和第三次出错之后分别采取什么措施。“Dependencies”则显示了服务之间的依存关系,可以让你察看这个服务的运行依赖哪些其它服务,以及还有什么服务依赖于这个服务。这后面几个对我们一般用户没有什么意义。经过这些设置,你的服务已经完全可以正常工作了。
本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。 感谢"蓝点"
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了。

1,222

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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