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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 從Delphi到Lazarus——Delphi轉換器
- 弗老大終於再次回到休斯敦了!!!(轉)
- delphi:string,PChar,Array of Char 之間的轉換
- VSCode配置 Debugger for Chrome外掛(終於搞定了..)VSCodeChrome
- nginx 版本升級 轉載Nginx
- [轉載]SVN系列之—-SVN版本回滾的辦法
- [轉載]Linux/Mac go版本升級LinuxMacGo
- 終於搞定了vertical-align:baseline對齊的問題
- ios一句程式碼搞定螢幕旋轉iOS
- 這段程式碼到底怎麼走?終於搞定Event loopOOP
- heic格式轉換jpg怎麼轉?兩步搞定
- 轉轉:微信小程式分包載入實戰微信小程式
- 轉載:Ubuntu 升級 golang 版本完美步驟UbuntuGolang
- 太難了,我終於把JDBC的程式碼終於優化了!JDBC優化
- clang 轉換版本
- matlab版本轉換Matlab
- [轉載]SQLServer之檢視簡介SQLServer
- 跨域之OPTION請求【轉載】跨域
- 轉載-Java設計模式之DecoratorJava設計模式
- StreamPark 2.0.0 重磅釋出,首個 Apache 版本終於來了!Apache
- [轉載] Python程式——multiprocessing.Event()|Barrier()Python
- cad版本轉換器如何操作低轉高?
- 終於有了讓程式設計師脫離程式碼的工具了程式設計師
- 【轉載】ElasticsearchElasticsearch
- 轉載AOP
- [轉載] ebxmlXML
- FPGA【轉載】FPGA
- 轉載方法
- (轉)Git常用終端命令Git
- [轉帖]Oracle 敗了、谷歌贏了:Java API 版權案最終裁決Oracle谷歌JavaAPI
- 學了十幾種程式語言後,我終於悟了!
- 【轉載】TortoiseSVN怎麼恢復到以前版本-恢復到以前版本的方法
- 終於實現了一門屬於自己的程式語言
- 學了風變程式設計Python後我終於不用加班了!程式設計Python
- Flutter Web Beta版本終於釋出了FlutterWeb
- 京東小程式開放平臺終於來了~
- 終於可以愉快的擼Java非同步程式碼了!Java非同步
- 告別偏科,能玩轉多模態、多工、多領域的強化智慧體終於來了智慧體
- XLSX轉換為DOCX,Aspose.Cells快速搞定