Self-Delete程式之Delphi版本,終於搞定了。 (轉載) (轉)

gugu99發表於2008-07-23
Self-Delete程式之Delphi版本,終於搞定了。 (轉載) (轉)[@more@]

//轉貼者:以前看過陸麟先生翻譯過一篇這樣的文章,是c版本的,我用改寫了沒成功,今天去清華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

  ;

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]

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1007725/,如需轉載,請註明出處,否則將追究法律責任。

相關文章