【问题标题】:Delphi self-deleting programDelphi自删除程序
【发布时间】:2012-06-25 21:21:37
【问题描述】:

如何自动删除我的 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;

但它不起作用,不要删除文件。我的程序是控制台。 谢谢!

【问题讨论】:

  • 你到底想做什么?只是退出有什么问题?这看起来像是一次回到 Win16 的旅程。
  • 我认为这可能的唯一方法是调用另一个程序(或批处理文件),该程序在应用程序退出时执行此操作。如果不依赖另一个外部帮助者,应用程序实际上是不可能删除自己的。
  • 所以唯一的解决办法就是创建一个文件。蝙蝠?
  • 不一定,唯一的解决方案是依靠可执行文件之外的东西为您完成这项工作。
  • OP 代码有问题。在我修复代码时,问题已关闭。显然这个问题不是重复的,问题是为什么发布的代码不起作用。

标签: windows delphi assembly


【解决方案1】:

您的代码可以在 Windows NT 和 2000 下运行。因为在这些操作系统中,系统会保留一个用户模式句柄对内存映射文件的引用,该文件支持磁盘上的可执行映像。 在这些 Windows 版本中,此句柄的值始终为 0x4

删除自己的exe最有效的方法,就是创建一个处于挂起状态的子进程,注入代码等待父进程(要删除的exe),然后检测父进程何时退出,删除父进程最后杀死子进程。

您可以在这些推荐资源中找到有关此主题的更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多