网站首页 | 网页制作 | 网络编程 | 图形图象 | 冲浪宝典 | 操作系统 | 软件教学 | 网络安全 | 认证考试 | 下载中心 | 游戏下载
| 网络编程首页 | ASP | ASP.NET | PHP | JSP | C# | Delphi | Java | C/C++ | XML | SMS | VC | VB | 数据库 |
您现在的位置: 超人气学院 >> 网络编程 >> Delphi >> 文章正文 用户登录 新用户注册
程序删除自身           
程序删除自身
作者:未知 文章来源:网络收集 点击数: 更新时间:2006-3-10 13:15:00

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;

[ 收藏此页到: 天天|和讯|博采|ViVi|狐摘|我摘|天极 ] 文章录入:kinda    责任编辑:kinda 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    专 题 栏 目
    最 新 热 门
     Delphi开发NTServic[1455]
     delphi中的XML解析控[1346]
     delphi读取ini文件[1244]
     ASC II 完整码表及简[874]
     浅谈控件(组件)制作[651]
     在Delphi中动态生成[643]
     显示密码编辑框中的[643]
     用Delphi编写系统进[638]
     将image的图片保存为[634]
     Delphi自定义消息应[574]
    相 关 文 章
    利用AxisTcpMonitor(tcpmo
    使用JavaWebStart部署SWT应
    简单小程序求一元2次方程的
    《实用J2EE应用程序体系结
    SUN认证Java2程序员考试(S
    如何实现Struts数据库应用
    如何实现Struts数据库应用
    如何实现Struts数据库应用
    如何在Struts数据库应用程
    如何在Struts数据库应用程
    一步一步学JAVA(第二章面向
    毫无废话:从0开始一点一滴
    叫你做第一个JDBC程序
    J2EE的另一张面孔:基于SW
    用JAVASOCKET制作一个广播
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)