admin管理员组

文章数量:1531661

2024年7月14日发(作者:)

delphi制作EXE文件加密器、捆绑、自解压文件及安装程序

delphi制作EXE 文件加密器、捆绑、自解压文件及安装程序

2007-01-09 13:39:22| 分类: Delphi |字号 订阅

我们先来说一下如何制作一个EXE 文件加密器吧。

EXE 文件加密器的原理:建立两个文件,一个用来添加资源到另

外一个EXE 文件里面,称

为添加程序。另外一个被添加的EXE 文件称为头文件。该程序的

功能是把添加到自己里面的

文件读出来。Windows 下的EXE 文件结构比较复杂,有的程序

还有校验和,当发现自己被改变

后会认为自己被病毒感染而拒绝执行。所以我们把文件添加到自

己的程序里面,这样就不会改

变原来的文件结构了。我们先写一个添加函数,该函数的功能是

把一个文件当作一个流添加到

另外一个文件的尾部。函数如下:

Function Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean?

var

Target,Source:TFileStream?

MyFileSize:integer?

begin

try

Source:=(SourceFile,fmOpenRead or fmS

hareExclusive)?

Target:=(TargetFile,fmOpenWrite or fmSh

areExclusive)?

try

(0,soFromEnd)?//往尾部添加资源

om(Source,0)?

MyFileSize:=+Sizeof(MyFileSize)?//计算资源大小,

并写入辅程尾部

uffer(MyFileSize,sizeof(MyFileSize))?

finally

?

?

end?

except

Result:=False?

Exit?

end?

Result:=True?

end?

有了上面的基础,我们应该很容易看得懂这个函数。其中参数

SourceFile 是要添加的文件,参数

TargetFile 是被添加到的目标文件。比如说把 添加到

里面可以:

Cjt_AddtoFile('',')?如果添加成功就返回True 否则返

回假。

根据上面的函数我们可以写出相反的读出函数:

Function Cjt_LoadFromFile(SourceFile,TargetFile :string):Bool

ean?

var

Source:TFileStream?

Target:TMemoryStream?

MyFileSize:integer?

begin

try

Target:=?

Source:=(SourceFile,fmOpenRead or fmS

hareDenyNone)?

try

(sizeof(

MyFileSize),soFromEnd)?

ffer(MyFileSize,sizeof(MyFileSize))?//读出资源

大小

(MyFileSize,

soFromEnd)?//定位到资源位置

om(Source,MyFileSizesizeof(

MyFileSize))?//取出资源

File(TargetFile)?//存放到文件

finally

?

?

end?

except

Result:=false?

Exit?

end?

Result:=true?

end?

其中参数SourceFile是已经添加了文件的文件名称,参数

TargetFile是取出文件后保存的目标文

件名。比如说Cjt_LoadFromFile('','')?在 中取出

文件保存为。如果取出成功就

返回True 否则返回假。

打开Delphi,新建一个工程,在窗口上放上一个Edit 控件

Edit1 和两个Button:Button1 和

Button2。Button 的Caption 属性分别设置为“确定”和“取

消”。在Button1 的Click 事件中写代码:

var S:string?

begin

S:=ChangeFileExt(e,'.Cjt')?

if ='790617' then

begin

Cjt_LoadFromFile(e,S)?

{取出文件保存在当前路径下并命名"原文件.Cjt"}

Winexec(pchar(S),SW_Show)?{运行"原文件.Cjt"}

ate?{退出程序}

end

else

eBox('密码不对,请重新输入!','密码错误

',MB_ICONERROR+MB_OK)?

编译这个程序,并把EXE 文件改名为。新建一个文本文

件,内容为: head

exefile ,然后把它们拷贝到Delphi 的BIN 目录下,执行

Dos 命令 ,将产

生一个 的文件,这个文件就是我们要的资源文件,先留

着。

我们的头文件已经建立了,下面我们来建立添加程序。

新建一个工程,放上以下控件:一个Edit,一个Opendialog,两个

Button1 的Caption 属性分别

设置为"选择文件"和"加密"。在源程序中添加一句:{$R }

并把 文件拷贝到程序

当前目录下。这样一来就把刚才的 跟程序一起编译了。

在Button1 的Cilck 事件里面写下代码:

if e then :=

ame?

在Button2 的Cilck 事件里面写下代码:

var S:String?

begin

S:=ExtractFilePath()?

if ExtractRes('exefile','head',S+'') then

if Cjt_AddtoFile(,S+'') then

if DeleteFile() then

if RenameFile(S+'',) then

eBox('文件加密成功!','信息

',MB_ICONINFORMATION+MB_OK)

else

begin

if FileExists(S+'') then DeleteFile(S+'')?

eBox('文件加密失败!','信息

',MB_ICONINFORMATION+MB_OK)

end?

end?

其中ExtractRes 为自定义函数,它的作用是把 从资源

文件中取出来。

Function ExtractRes(ResType, ResName, ResNewName : Stri

ng):boolean?

var

Res : TResourceStream?

begin

try

Res := (Hinstance, Resname, Pchar(

ResType))?

try

File(ResNewName)?

Result:=true?

finally

?

end?

except

Result:=false?

end?

end?

注意:我们上面的函数只不过是简单的把一个文件添加到另一个

文件的尾部。实际应用中

可以改成可以添加多个文件,只要根据实际大小和个数定义好偏

移地址就可以了。比如说文件

捆绑机就是把两个或者多个程序添加到一个头文件里面。那些自

解压程序和安装程序的原理也

是一样的,不过多了压缩而已。比如说我们可以引用一个LAH 单

元,把流压缩后再添加,这

样文件就会变的很小。读出来时先解压就可以了。另外,文中

EXE 加密器的例子还有很多不

完善的地方,比如说密码固定为"790617",取出EXE 运行后应该

等它运行完毕后删除等等,读

者可以自行修改。

本文标签: 文件添加函数程序尾部