关于10期《在win32下自删除可执行文件》

韩磊 2003-11-16 03:20:22
在Delphi中是可以完成这个“不可能的任务”的——

这样取得的地址实际上是这个封装代码的,而这段代码又处于 UnmapViewOfMap 解除映像范围类,因此,到调用 DeleteFile 函数的时候就无法反问到这段代码了。

解决的办法是,用GetProcAddress动态取得这几个API的地址。

Delphi&CB代码如下:

//////////////////////////////////////////////
procedure DeleteSelf;
var
pExitProcess: Pointer;
pDeleteFile: Pointer;
pUnmapViewOfFile: Pointer;
hModule: THANDLE;
cBuf:array[0..MAX_PATH]of Char;
begin
hModule := GetModuleHandle('kernel32');
if hModule <> 0 then
begin
pExitProcess := GetProcAddress(hModule, 'ExitProcess');
pDeleteFile := GetProcAddress(hModule, 'DeleteFileA');
pUnmapViewOfFile := GetProcAddress(hModule, 'UnmapViewOfFile');
end else
begin
pExitProcess := nil;
pDeleteFile := nil;
pUnmapViewOfFile := nil;
end;
hModule := GetModuleHandle(nil);
GetModuleFileName(hModule, cBuf, Sizeof(cBuf));
CloseHandle(THANDLE(4));
asm
XOR EAX, EAX;
PUSH EAX;
PUSH EAX;
LEA EAX, cBuf;
PUSH EAX;
MOV EAX, pExitProcess; PUSH EAX; MOV EAX, hModule; PUSH EAX; MOV EAX, pDeleteFile;
PUSH EAX;
MOV EAX, pUnmapViewOfFile;
PUSH EAX;
RET;
end;
end;
...全文
79 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
doer_ljy 2004-01-23
  • 打赏
  • 举报
回复
好!
52juanjuan 2004-01-07
  • 打赏
  • 举报
回复
thank you !
AbnerChai 2004-01-04
  • 打赏
  • 举报
回复
VC win32SDK也可以做到.
齐北 2003-12-28
  • 打赏
  • 举报
回复
我也不会Delphi的。但是这段代码大体分两部分,第一部分:取得三个API函数的地址。
第二部分是把这三个地址及基需要的参数入栈。但是什么时候执行栈中的操作呢?我对Delphi不是太懂,请楼主指点?
meitounao 2003-11-28
  • 打赏
  • 举报
回复
不会delphi,看不懂,搂主强!!!!!!!!!

6,905

社区成员

发帖
与我相关
我的任务
社区描述
《新程序员》读者俱乐部
其他 其他
社区管理员
  • 《程序员》杂志社区
  • SoftwareTeacher
  • 《新程序员》编辑部
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧