国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Delphi > 正文

Self-Delete程序之Delphi版本,終于搞定了。

2019-11-18 18:43:37
字體:
來源:轉載
供稿:網友
  //轉貼者:以前看過陸麟先生翻譯過一篇這樣的文章,是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;


上一篇:於Delphi的Case述句中使用字串當作判別變數

下一篇:詳細教你如何使用delphi中thread的線程編程

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 阿尔山市| 昭觉县| 江津市| 宝丰县| 手机| 新昌县| 收藏| 肃南| 平凉市| 封开县| 黑水县| 南通市| 肇东市| 凭祥市| 剑川县| 喜德县| 南涧| 河北区| 桓仁| 沙河市| 南郑县| 郯城县| 石家庄市| 濮阳市| 湘阴县| 浏阳市| 崇明县| 汝州市| 郧西县| 惠水县| 怀柔区| 温泉县| 克拉玛依市| 唐山市| 许昌市| 太白县| 墨玉县| 蕉岭县| 富宁县| 玉溪市| 乌审旗|