Self-Delete程式之Delphi版本,終於搞定了。 (轉載) (轉)
//轉貼者:以前看過陸麟先生翻譯過一篇這樣的文章,是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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 終於搞定終於搞定linux下閱讀pdg(轉)Linux
- Delphi程式設計之--慣用法 (轉)程式設計
- Delphi之快速設計(程式設計篇) (轉)程式設計
- 終於搞定了 iOS 8.1.3 之後的企業版安裝問題。iOS
- [轉]基於Quercus的手遊專案終於上線了
- 終於轉了,寫寫人生學習規劃
- Delphi 中物件導向程式設計之我見 (轉)物件程式設計
- 用Delphi編寫DelTree程式 (轉)
- Singleton模式之Delphi實現 (轉)模式
- delphi常用文件資料之四 (轉)
- Delphi(BCB)中編譯器版本宏定義 (轉)編譯
- VSCode配置 Debugger for Chrome外掛(終於搞定了..)VSCodeChrome
- 用 Delphi 編寫 VxD 裝置驅動程式(轉) (轉)
- Delphi與Excel (轉)Excel
- Borland與Microsoft關於Delphi的對話 (轉)ROS
- 用Delphi編寫安裝程式(1) (轉)
- Delphi源程式格式書寫規範 (轉)
- Delphi 程式碼最佳化——字串篇 (轉)字串
- 在DELPHI程式中撥號上網 (轉)
- 這段程式碼到底怎麼走?終於搞定Event loopOOP
- Oracle各版本區別(轉載)Oracle
- 相當於delphi的日曆控制元件 (轉)控制元件
- Delphi中關於TApplication類的詳解 (轉)APP
- 太難了,我終於把JDBC的程式碼終於優化了!JDBC優化
- 終於搞定了vertical-align:baseline對齊的問題
- Delphi實用程式設計經驗二 (轉)程式設計
- DELPHI開發Web程式常見問題 (轉)Web
- 使用Delphi,SDK編寫Windows簡單程式 (轉)Windows
- Delphi程式碼最佳化 完結篇 (轉)
- Delphi資料庫程式設計教程(九) (轉)資料庫程式設計
- 用DELPHI為ASP開發檔案上載元件 (轉)元件
- 《Mastering Delphi 6》學習筆記之十 (轉)AST筆記
- 《Mastering Delphi 6》學習筆記之九 (轉)AST筆記
- 《Mastering Delphi 6》學習筆記之八 (轉)AST筆記
- 《Mastering Delphi 6》學習筆記之五 (轉)AST筆記
- 《Mastering Delphi 6》學習筆記之六 (轉)AST筆記
- 《Mastering Delphi 6》學習筆記之七 (轉)AST筆記
- 《Mastering Delphi 6》學習筆記之四 (轉)AST筆記