几种程序自杀的实现

转载 2007年09月17日 10:50:00

procedure DeleteMe;
var
  BatchFile: TextFile;
  BatchFileName: string;
  ProcessInfo: TProcessInformation;
  StartUpInfo: TStartupInfo;
begin
  BatchFileName := ExtractFilePath(ParamStr(0)) + '_deleteme.bat';
  AssignFile(BatchFile, BatchFileName);
  Rewrite(BatchFile);

  Writeln(BatchFile, ':try');
  Writeln(BatchFile, 'del "' + ParamStr(0) + '"');
  Writeln(BatchFile,
    'if exist "' + ParamStr(0) + '"' + ' goto try');
  Writeln(BatchFile, 'del %0');
  CloseFile(BatchFile);

  FillChar(StartUpInfo, SizeOf(StartUpInfo), $00);
  StartUpInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartUpInfo.wShowWindow := SW_HIDE;
  if CreateProcess(nil, PChar(BatchFileName), nil, nil,
    False, IDLE_PRIORITY_CLASS, nil, nil, StartUpInfo,
    ProcessInfo) then
  begin
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ProcessInfo.hProcess);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  DeleteMe;
  close;
end;

end.

第二种:

类 别:系统控制
  我们经常遇到这样的软件,运行之后就消失的无影无踪,特别是一些黑客的木马工具。
  如果我们能掌握这个技术,即使不做黑客工具,也可以在程序加密、软件卸载等方面发挥作用。
  那么他们是怎样实现的呢?
---- 以delphi为例,在form关闭的时候执行以下函数closeme即可:
procedure TForm1.closeme;
var f:textfile;
begin
assignfile(f,'./delme.bat');
rewrite(f);
writeln(f,'@echo off');
writeln(f,':loop');
writeln(f,'del "'+application.ExeName+'"');
writeln(f,'if exist ./file.exe goto loop');
writeln(f,'del ./delme.bat');
closefile(f);
winexec('./delme.bat', SW_HIDE);
close;
end;

winexec(pchar('command.com /c del '+ParamStr(0)),SW_MINIMIZE);//最小化执行删除操作,否则将看到DOS窗口的瞬间闪烁

第三种:

Delphi 版
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShellAPI, ShlObj;

type
  TForm1 = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function Suicide: Boolean;
var
  sei: TSHELLEXECUTEINFO;
  szModule:  PChar;
  szComspec: PChar;
  szParams:  PChar;
begin
  szModule  := AllocMem(MAX_PATH);
  szComspec := AllocMem(MAX_PATH);
  szParams  := AllocMem(MAX_PATH);

  // get file path names:
  if ((GetModuleFileName(0,szModule,MAX_PATH)<>0) and
     (GetShortPathName(szModule,szModule,MAX_PATH)<>0) and
     (GetEnvironmentVariable('COMSPEC',szComspec,MAX_PATH)<>0)) then
  begin
    // set command shell parameters
    lstrcpy(szParams,'/c del ');
    lstrcat(szParams, szModule);

    // set struct members
    sei.cbSize       := sizeof(sei);
    sei.Wnd          := 0;
    sei.lpVerb       := 'Open';
    sei.lpFile       := szComspec;
    sei.lpParameters := szParams;
    sei.lpDirectory  := 0;
    sei.nShow        := SW_HIDE;
    sei.fMask        := SEE_MASK_NOCLOSEPROCESS;

    // invoke command shell
    if (ShellExecuteEx(@sei)) then
    begin
      // suppress command shell process until program exits
      SetPriorityClass(sei.hProcess,HIGH_PRIORITY_CLASS);//IDLE_PRIORITY_CLASS);

      SetPriorityClass( GetCurrentProcess(),
                        REALTIME_PRIORITY_CLASS);

      SetThreadPriority( GetCurrentThread(),
                         THREAD_PRIORITY_TIME_CRITICAL);

      // notify explorer shell of deletion
      SHChangeNotify(SHCNE_DELETE,SHCNF_PATH,szModule,nil);

      Result := True;
    end
    else
      Result := False;
  end
  else
    Result := False;
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Suicide;
end;

第四种:

procedure deleteSelf;
var hModule: THandle;
szModuleName: array[0..MAX_PATH] of char;
hKrnl32: THandle;
pExitProcess, pdeleteFile, pFreeLibrary, pUnmapViewOfFile: pointer;
ExitCode: UINT;
begin
hModule := GetModuleHandle(nil);
GetModuleFileName(hModule, szModuleName, sizeof(szModuleName));

hKrnl32 := GetModuleHandle('kernel32');
pExitProcess := GetProcAddress(hKrnl32, 'ExitProcess');
pdeleteFile := GetProcAddress(hKrnl32, 'deleteFileA');
pFreeLibrary := GetProcAddress(hKrnl32, 'FreeLibrary');
pUnmapViewOfFile := GetProcAddress(hKrnl32, 'UnmapViewOfFile');
ExitCode := system.ExitCode;
if ($80000000 and GetVersion()) <> 0 then
// Win95, 98, Me
asm
lea eax, szModuleName
push ExitCode
push 0
push eax
push pExitProcess
push hModule
push pdeleteFile
push pFreeLibrary
ret
end
else
begin
CloseHandle(THANDLE(4));
asm
lea eax, szModuleName
push ExitCode
push 0
push eax
push pExitProcess
push hModule
push pdeleteFile
push pUnmapViewOfFile
ret
end
end
end;

 

几种程序自杀的方法

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

自杀程序(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
  • 2265

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

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

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

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

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

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

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

Android应用自杀和干掉其它进程

// 自杀(这种方式只能杀掉自己的进程,其它进程无法杀死) int pid = Process.myPid(); android.os.Process.killProcess(pid); // 或者...
  • xyang81
  • xyang81
  • 2013年10月24日 20:08
  • 4542

程序自杀

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

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