6

Delphi プログラムを自動削除するにはどうすればよいですか? 私はこのコードを試しました:

procedure DeleteSelf;
var
  module : HMODULE;
  buf : array [ 0 .. MAX_PATH - 1 ] of char;
  p : ULONG;
  hKrnl32 : HMODULE;
  pExitProcess, pDeleteFile, pFreeLibrary : pointer;
begin
  module := GetModuleHandle ( nil );
  GetModuleFileName ( module, buf, sizeof ( buf ) );
  CloseHandle ( THandle ( 4 ) );
  p := ULONG ( module ) + 1;
  hKrnl32 := GetModuleHandle ( 'kernel32' );
  pExitProcess := GetProcAddress ( hKrnl32, 'ExitProcess' );
  pDeleteFile := GetProcAddress ( hKrnl32, 'DeleteFileA' );
  pFreeLibrary := GetProcAddress ( hKrnl32, 'FreeLibrary' );
  asm
    lea eax, buf
    push 0
    push 0
    push eax
    push pExitProcess
    push p
    push pDeleteFile
    push pFreeLibrary
    ret
  end;
end;

しかし、それは機能しません。ファイルを削除しないでください。私のプログラムはコンソールです。ありがとう!

4

1 に答える 1

13

コードは Windows NT および 2000 でのみ動作します。これらの OS では、システムはディスク上の実行可能イメージをバックアップするメモリ マップ ファイルへのユーザーモード ハンドル参照を保持するためです。これらの Windows バージョンでは、このハンドルの値は常に 0x4です。

独自のexeを削除する最も効果的な方法は、一時停止状態の子プロセスを作成し、親プロセス(削除するexe)を待機するコードを挿入し、親プロセスが終了したことを検出し、親プロセスを削除して最後に強制終了することです子プロセス。

このトピックの詳細については、これらの推奨リソースを参照してください。

于 2012-06-26T02:58:07.087 に答える