Self-Delete程序之Delphi版本,终于搞定了。 (转载)

原创 2002年01月05日 18:21:00

//转贴者:以前看过陆麟先生翻译过一篇这样的文章,是c版本的,我用delphi改写了没成功,今天去清华bbs转悠看见了这篇delphi版本的,特贴出来

发信人: Litoad (Rick), 信区: Delphi

标  题: Self-Delete程序之Delphi版本,终于搞定了。 (转载)

发信站: BBS 水木清华站 (Mon Jun  4 20:51:55 2001)

 

【 以下文字转载自 Programming 讨论区 】

发信人: Litoad (Rick), 信区: Programming

标  题: Self-Delete程序之Delphi版本,终于搞定了。

发信站: BBS 水木清华站 (Mon Jun  4 20:50:42 2001)

 

到Borland的论坛去问了问,确实跟laoduan说得一样,要

自己GetProcAddress。代码如下:

program Project1;

uses

  Windows;

procedure DeleteSelf;

var

  hModule: THandle;

  buff:    array[0..255] of Char;

  hKernel32: THandle;

  pExitProcess, pDeleteFileA, pUnmapViewOfFile: Pointer;

begin

  hModule := GetModuleHandle(nil);

  GetModuleFileName(hModule, buff, sizeof(buff));

  CloseHandle(THandle(4));

  hKernel32        := GetModuleHandle('KERNEL32');

  pExitProcess     := GetProcAddress(hKernel32, 'ExitProcess');

  pDeleteFileA     := GetProcAddress(hKernel32, 'DeleteFileA');

  pUnmapViewOfFile := GetProcAddress(hKernel32, 'UnmapViewOfFile');

  asm

    LEA         EAX, buff

    PUSH        0

    PUSH        0

    PUSH        EAX

    PUSH        pExitProcess

    PUSH        hModule

    PUSH        pDeleteFileA

    PUSH        pUnmapViewOfFile

    RET

  end;

end;

begin

  DeleteSelf;

end.

现在有一点比较古怪,那就是必须把代码放在一个Procedure里,

直接放在begin ... end.中间是不行的。也许是全局变量不能使用

的缘故,但为什么不能使用,还是不是很清楚。

还有,不GetProcAddress,直接如下写:

    PUSH  OFFSET  UnmapViewOfFile

trace的结果是执行进入了KERNEL32.UnmapViewOfFile的,只是在

函数内RET $4出就出错了,跳到了一个莫名其妙的地方。为什么会

这样?难道是Delphi的编译器的问题吗?

另外,Borland论坛上RE的代码不是上面的,不过效果跟我写的一样

。但是FreeLibrary(p)跟UnmapViewOfFile(hModule)效果一样吗?

代码如下:

program Project1;

uses

  windows;

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;

 

 

--

 

※ 修改:·Litoad 於 Jun  4 21:18:43 修改本文·[FROM:  166.111.171.40]

 

laravel+vue2.0终于搞定了!

开文废话: laravel是一个php框架,vue是一个前端MVVM轻量级开源框架. 为啥要组合它俩一起开发呢,除了好玩就是有挑战了?并不是的: 1:起手在慕课网看了laravel基础入门的就会发现,...
  • wmwmdtt
  • wmwmdtt
  • 2016年12月29日 10:39
  • 19607

【stm32库应用】SD驱动移植(基于SDIO外设)

基于stm32的SD卡驱动移植
  • ieczw
  • ieczw
  • 2013年12月17日 16:32
  • 3841

终于搞定android驱动USB摄像头了!

多亏了stackoverflow看到的一篇帖子,其中有几句关键的话,然后顺藤摸瓜解决了问题。 帖子大意: 讨论的前提是你的USB摄像头是UVC兼容的(如今大部分摄像头兼容) 默认Android不...
  • b5w2p0
  • b5w2p0
  • 2014年09月10日 10:21
  • 1456

终于搞定隐藏文件、目录了,好高兴啊!!!!!哈哈 驱动程序开发网技术社区 - powered by phpwind_net.mht

  • 2007年11月02日 20:53
  • 396KB
  • 下载

Self-Delete-Cmd

  • 2015年09月30日 11:25
  • 211B
  • 下载

用 DELPHI 搞定 VisualSVN 用户密码远程修改的问题

这个是 2011 年的旧贴了。 VisualSVN 的用户名、密码,必须在服务器上用它提供的管理器界面设置。客户端小乌龟里面,没有让用户可以修改自己的密码的功能。 网上查资料,首先...
  • pcplayer
  • pcplayer
  • 2017年04月06日 10:01
  • 110

Delphi 不使用皮肤 搞定 漂亮单据界面

====================================================== 注:本文源代码点此下载 =============================...
  • javazhuanzai
  • javazhuanzai
  • 2012年01月29日 23:11
  • 317

Delphi XE8 下载+破解+汉化全搞定

  • 2016年04月13日 19:44
  • 19.3MB
  • 下载

给Delphi程序添加版本信息

我们在用Delphi编译完程序,准备发布产品时,总希望随产品发布个性信息以标示产品的来源以及开发者等信息,就像windows的程序一样,使我们一看属性就知道他是微软的产品,这些在Delphi中是如何实...
  • zisongjia
  • zisongjia
  • 2017年03月31日 18:01
  • 492

给Delphi程序(exe,dll)添加版本信息

====================================================== 注:本文源代码点此下载 =============================...
  • javazhuanzai
  • javazhuanzai
  • 2012年01月15日 03:38
  • 307
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Self-Delete程序之Delphi版本,终于搞定了。 (转载)
举报原因:
原因补充:

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