程序自杀方式

原创 2007年09月17日 10:51:00

     有点电脑常识的人都知道,在Windows下如果程序正在运行,那么是无法将其删除的,当然,也不是绝对不可以。CIH大家应该知道吧,它的核心有两个,一个就是取得Ring0级权限,然后就可以随便干想干的事(比如说修改正在运行的文件),而我们一般的程序是运行在Ring3级上的。顺便提一句---NT下没有Ring的概念,所以CIH对其无效。用Delphi内镶汇编也可以取得Ring0级权限,但如果我们的程序运行在NT或者Win2000下就没有效果了。在说句题外话,现在的编译器都很不错了,大多数程序员都编不出比编译器编译出的更理想的代码,象Delphi,如果将它的某些单元代码改用内镶汇编,在某些方面如字符串处理方面会提高5倍左右的效率,但NT不支持某些汇编代码,如果程序在NT下工作就会出错,怎么办?稳定第一!所以我们不用这个方法,而且,用这个方法有点杀鸡用牛刀的味道。
   用过DOS的朋友应该还记得批处理文件吧,新建一个批处理文件a.bat,编辑其内容为:del %0,然后运行它,怎么样?a.bat把自己删除掉了!!!好,我们就用它来进行程序的“自杀”!
找一个EXE可执行文件,比如说abc.exe,新建一个批处理文件a.bat,编辑其内容为:
:pp
del abc.exe
if exist abc.exe goto pp
del %0
先运行abc.exe,再运行a.bat,然后将abc.exe退出,你会发现a.exe和a.bat都没有了!!!按照这个思路,我们可以在程序中根据文件名称写一个批处理,将上面的abc.exe换成自己的EXE文件名就可以了。运行Delphi,新建一个工程,添加一个Button到窗体上,点击Button,写下如下代码:

procedure TForm1.Button1Click(Sender: TObject);
var Selfname,BatFilename,s1,s2:string;
BatchFile: TextFile;
begin
Selfname:=Extractfilename(application.exename);//取EXE文件自己的名称
BatFilename:=ExtractFilePath(Application.ExeName)+ 'a.bat';//批处理文件名称
S1:='@del '+Selfname;
S2:='if exist '+Selfname+' goto pp';
assignfile(BatchFile,BatFilename);
rewrite(BatchFile);
writeln(BatchFile,':pp');
writeln(BatchFile,S1);
writeln(BatchFile,S2);
writeln(BatchFile,'@del %0');
closefile(BatchFile);
winexec(pchar(BatFilename),sw_hide);//隐藏窗口运行a.bat
application.Terminate;//退出程序
end;
那我们的事情是不是就完了?NO!上面的程序原理是对的,但如果你的程序是运行在系统目录下如Windows目录下或者Windows/System等目录下,除非你打开那个目录看着它删除,否则根本没法卸掉的。那怎么办?别急,我们请出一个函数CreateProcess,它的原型为:
BOOL CreateProcess(
LPCTSTR lpApplicationName, // pointer to name of executable module 
LPTSTR lpCommandLine, // pointer to command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // pointer to process security attributes 
LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes 
BOOL bInheritHandles, // handle inheritance flag 
DWORD dwCreationFlags, // creation flags 
LPVOID lpEnvironment, // pointer to new environment block 
LPCTSTR lpCurrentDirectory, // pointer to current directory name 
LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO 
LPPROCESS_INFORMATION lpProcessInformation // pointer to PROCESS_INFORMATION 
);
这个函数和OpenProcess、ReadProcessMemory、WriteProcessMemory使用可以用来读取和修改内存数据,常用的游戏修改器就是用它。由于这些不是本文的重点所以这里不作详细介绍,感兴趣的读者可自行翻阅Delphi自带的帮助文件。用CreateProcess函数创建一个进程就可以完美的完成我们的“程序自杀”了。
运行Delphi,新建一个工程,添加一个Button到窗体上,全部代码如下:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure My_DeleteMe; //自定义程序自杀过程
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
My_DeleteMe;
end;
procedure TForm1.My_DeleteMe; //程序自杀
//-----------------------------------------------------------
function GetShortName(sLongName: string): string; //转换长文件名
var
sShortName: string;
nShortNameLen: integer;
begin
SetLength(sShortName, max_PATH);
nShortNameLen := GetShortPathName(PChar(sLongName),
PChar(sShortName), MAX_PATH - 1);
if (0 = nShortNameLen) then
begin
// handle errors...
end;
SetLength(sShortName, nShortNameLen);
Result := sShortName;
end;
//-------------------------------------------------
var
BatchFile: TextFile;
BatchFileName: string;
ProcessInfo: TProcessInformation;
StartUpInfo: TStartupInfo;
begin
BatchFileName := ExtractFilePath(ParamStr(0)) + '$$a$$.bat';
AssignFile(BatchFile, BatchFileName);
Rewrite(BatchFile);
Writeln(BatchFile, ':try');
Writeln(BatchFile, 'del "' + GetShortName(
该文章转载自1024k:http://www.1024k.cn/faq/2007/200706/39794.html 

几种程序自杀的方法

procedure DeleteMe;var  BatchFile: TextFile;  BatchFileName: string;  ProcessInfo: TProcessInformati...
  • Tercel99
  • Tercel99
  • 2008年02月13日 09:31
  • 1617

自杀程序(VC)

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

c++实现一个自杀程序

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

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

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

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

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

万无一失的自杀方法

他站在悬崖顶上,脖子上系了条绳子,绳子的另一端系在一块大岩石上;他服了毒药,点燃了自己的衣服,甚至还试图在最后那刻给自己一枪;他从悬崖上跳了下来,扣响了板机,但子弹没有射中自己,反倒射断了吊在他脖子上...
  • woolenhy
  • woolenhy
  • 2004年12月19日 10:50
  • 838

VC下MFC程序自删除(自杀)几种方法的实践与探讨

在VC下做了个MFC的程序,想让他运行后,自动删除自己。在网上看了些资料,方法也有一些,都实践了一下,感觉对MFC的程序,使用cmd.exe可能更合适一些。其他的方法也蛮好,蛮经典的,不过我感觉用在M...
  • a316586261
  • a316586261
  • 2010年02月04日 10:46
  • 803

[改造] 自杀的程序

一个让程序运行后将自己删除的函数,在程序开头或结尾处调用。从别人的代码改造而来的,原出处不记得了。以下内容为程序代码: BOOL KillSelf() {   if (__argc == 1) //如...
  • codemon
  • codemon
  • 2005年09月17日 13:41
  • 839

Delphi实现程序自销毁(自杀)

unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialo...
  • sibang
  • sibang
  • 2014年08月21日 16:37
  • 646

程序自杀

android.os.Process.killProcess(android.os.Process.myPid());
  • iblade
  • iblade
  • 2016年07月14日 09:12
  • 287
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:程序自杀方式
举报原因:
原因补充:

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