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

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
...全文
82 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了。
Google Android SDK开发范例大全(完整版)共4个分卷 目录 第1章 了解.深入.动手做. 1.1 红透半边天的Android 1.2 本书目的及涵盖范例范围 1.3 如何阅读本书 1.4 使用本书范例 1.5 参考网站 第2章 Android初体验 2.1 安装AndroidSDK与ADTplug-in 2.2 建立第一个Android项目(HelloAndroid!) 2.3 Android应用程序架构——从此开始 2.4 可视化的界面开发工具 2.5 部署应用程序到Android手机 第3章 用户人机界面 3.1 更改与显示文字标签——TextView标签的使用 3.2 更改手机窗口画面底色——drawable定义颜色常数的方法 3.3 更改TextView文字颜色——引用Drawable颜色常数及背景色 3.4 置换TextView文字——CharSequence数据类型与ResourceID应用 3.5 取得手机屏幕大小——DisplayMetrics取得画面宽高的方法 3.6 样式化的定型对象——Style样式的定义 3.7 简易的按钮事件——Button事件处理 3.8 手机页面的转换——setContentView的应用 3.9 调用另一个Activity——Intent对象的使用 3.10 不同Activity之间的数据传递——Bundle对象的实现 3.11 返回数据到前一个Activity——startActivityForResult方法 3.12 具有交互功能的对话框——AlertDialog窗口 3.13 置换文字颜色的机关——Button与TextView的交互 3.14 控制不同的文字字体——Typeface对象使用 3.15 如iPhone拖动相片特效——Gallery画廊 3.16 自制计算器——多按钮的整合应用 3.17 关于(About)程序信息——Menu功能菜单程序设计 3.18 程序加载中,请稍后——ProgressDialog与线程整合应用 3.19 全屏幕以按钮覆盖——动态产生按钮并最大化 3.20 今晚到哪儿打牙祭?——具选择功能的对话框 3.21 Android变脸——主题(Theme)实现 第4章 史上超豪华的手机控件 4.1 EditText与TextView共舞——setOnKeyListener事件 4.2 设计具有背景图的按钮——ImageButton的焦点及事件处理 4.3 给耶诞老人的信息——Toast对象的使用 4.4 我同意条款——CheckBox的isChecked属性 4.5 消费券采购列表——多选项CheckBox的应用 4.6 向左或向右——RadioGroup组与onCheckedChanged事件 4.7 专业相框设计——ImageView的堆栈应用 4.8 自定义下拉菜单模式——Spinner与setDropDownViewResource 4.9 动态添加/删除的Spinner菜单——ArrayList与Widget的依赖性 4.10 心爱小宝贝相片集——Gallery与衍生BaseAdapter容器 4.11 快速的搜索手机文件引擎——JavaI/O的应用 4.12 按钮也能随点击变换——ImageButton选择特效 4.13 具自动提示功能的菜单——AutoCompleteTextView与数组 4.14 数字及模拟小时钟设计——AnalogClock与DigitalClock的原理 4.15 动态输入日期与时间——DatePicker与TimePicker应用 4.16 猜猜红心A在那儿——ImageView点击事件与透明度处理 4.17 后台程序运行进度提示——ProgressBar与Handler的整合应用 4.18 动态文字排版——GridView与ArrayAdapter设计 4.19 在Activity里显示列表列表——ListView的布局 4.20 以动态列表配置选项——ListActivity与Menu整合技巧 4.21 查找程序根目录下所有文件——JavaI/O与ListActivity的结合.. 4.22 加载手机磁盘里的图文件——使用decodeFile方法 4.23 动态放大缩小ImageView里的图片——运用Matrix对象来缩放图文件 4.24 动态旋转图片——Bitmap与Matrix旋转ImageView 4.25 猜猜我在想什么——RadioButtonID 4.26 离开与关闭程序的弹出窗口——对话窗口上的ICON图标 第5章 交互式通信服务与手机控制 5.1 具有正则表达式的TextView——Linkify规则 5.2 ACTION!CALL!拨打电话——Intent

1,222

社区成员

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

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