CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  网络通信/分布式开发

有那位知道怎么用流改变已生成exe的内容呢。有高分送.全部家档都给你呀。

楼主54993699(老虎)2003-11-01 20:59:49 在 Delphi / 网络通信/分布式开发 提问

我写了一个邮件发送的程序,已生成exe了。用的是lndy里的IdSMTP控件,  
  现在遇到的问题是我想改idsmtp控件的port属性,原来是的端口是25想把他改成30。  
  而我做的exe没有改端口那一项,就想在生成的exe里改变端口。  
  别说我无聊,我就是想知道怎么样做成。找了很多文章都说用流可以修改exe。但是没有用流改生成exe中控件属性的文章。我就是不想用dssmtp1.port:=edit1.text这样的方法。  
  问题点数:100、回复次数:17Top

1 楼54993699(老虎)回复于 2003-11-01 21:00:18 得分 0

有线等,请做过的做答呀,Top

2 楼RockEx(石头)回复于 2003-11-01 21:17:56 得分 20

给你一个例子  
  利用流制作EXE文件加密器、捆绑、自解压文件及安装程序  
   
      我们先来说一下如何制作一个EXE文件加密器吧。    
      EXE文件加密器的原理:建立两个文件,一个用来添加资源到另外一个EXE文件里面,称为添加程序。另外一个被添加的EXE文件称为头文件。该程序的功能是把添加到自己里面的文件读出来。Windows下的EXE文件结构比较复杂,有的程序还有校验和,当发现自己被改变后会认为自己被病毒感染而拒绝执行。所以我们把文件添加到自己的程序里面,这样就不会改变原来的文件结构了。我们先写一个添加函数,该函数的功能是把一个文件当作一个流添加到另外一个文件的尾部。函数如下:  
   
  Function   Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean;  
  var  
  Target,Source:TFileStream;  
  MyFileSize:integer;  
  begin  
  try  
  Source:=TFileStream.Create(SourceFile,fmOpenRead   or   fmShareExclusive);  
  Target:=TFileStream.Create(TargetFile,fmOpenWrite   or   fmShareExclusive);  
  try  
  Target.Seek(0,soFromEnd);//往尾部添加资源  
  Target.CopyFrom(Source,0);  
  MyFileSize:=Source.Size+Sizeof(MyFileSize);//计算资源大小,并写入辅程尾部  
  Target.WriteBuffer(MyFileSize,sizeof(MyFileSize));  
  finally  
  Target.Free;  
  Source.Free;  
  end;  
  except  
  Result:=False;  
  Exit;  
  end;  
  Result:=True;  
  end;  
  有了上面的基础,我们应该很容易看得懂这个函数。其中参数SourceFile是要添加的文件,参数TargetFile是被添加到的目标文件。比如说把a.exe添加到b.exe里面可以:Cjt_AddtoFile('a.exe',b.exe');如果添加成功就返回True否则返回假。  
  根据上面的函数我们可以写出相反的读出函数:  
  Function   Cjt_LoadFromFile(SourceFile,TargetFile   :string):Boolean;  
  var  
  Source:TFileStream;  
  Target:TMemoryStream;  
  MyFileSize:integer;  
  begin  
  try  
  Target:=TMemoryStream.Create;  
  Source:=TFileStream.Create(SourceFile,fmOpenRead   or   fmShareDenyNone);  
  try  
  Source.Seek(-sizeof(MyFileSize),soFromEnd);  
  Source.ReadBuffer(MyFileSize,sizeof(MyFileSize));//读出资源大小  
  Source.Seek(-MyFileSize,soFromEnd);//定位到资源位置  
  Target.CopyFrom(Source,MyFileSize-sizeof(MyFileSize));//取出资源  
  Target.SaveToFile(TargetFile);//存放到文件  
  finally  
  Target.Free;  
  Source.Free;  
  end;  
  except  
  Result:=false;  
  Exit;  
  end;  
  Result:=true;  
  end;  
      其中参数SourceFile是已经添加了文件的文件名称,参数TargetFile是取出文件后保存的目标文件名。比如说Cjt_LoadFromFile('b.exe','a.txt');在b.exe中取出文件保存为a.txt。如果取出成功就返回True否则返回假。  
  打开Delphi,新建一个工程,在窗口上放上一个Edit控件Edit1和两个Button:Button1和Button2。Button的Caption属性分别设置为“确定”和“取消”。在Button1的Click事件中写代码:  
  var   S:string;  
  begin  
  S:=ChangeFileExt(Application.ExeName,'.Cjt');  
  if   Edit1.Text='790617'   then    
  begin  
  Cjt_LoadFromFile(Application.ExeName,S);  
  {取出文件保存在当前路径下并命名"原文件.Cjt"}  
  Winexec(pchar(S),SW_Show);{运行"原文件.Cjt"}  
  Application.Terminate;{退出程序}  
  end  
  else    
  Application.MessageBox('密码不对,请重新输入!','密码错误',MB_ICONERROR+MB_OK);  
      编译这个程序,并把EXE文件改名为head.exe。新建一个文本文件head.rc,内容为:   head   exefile   head.exe,然后把它们拷贝到Delphi的BIN目录下,执行Dos命令Brcc32.exe   head.rc,将产生一个head.res的文件,这个文件就是我们要的资源文件,先留着。  
      我们的头文件已经建立了,下面我们来建立添加程序。  
      新建一个工程,放上以下控件:一个Edit,一个Opendialog,两个Button1的Caption属性分别设置为"选择文件"和"加密"。在源程序中添加一句:{$R   head.res}并把head.res文件拷贝到程序当前目录下。这样一来就把刚才的head.exe跟程序一起编译了。  
      在Button1的Cilck事件里面写下代码:  
  if   OpenDialog1.Execute   then   Edit1.Text:=OpenDialog1.FileName;  
      在Button2的Cilck事件里面写下代码:  
  var   S:String;  
  begin  
  S:=ExtractFilePath(Edit1.Text);  
  if   ExtractRes('exefile','head',S+'head.exe')   then  
  if   Cjt_AddtoFile(Edit1.Text,S+'head.exe')   then  
  if   DeleteFile(Edit1.Text)   then  
  if   RenameFile(S+'head.exe',Edit1.Text)   then  
  Application.MessageBox('文件加密成功!','信息',MB_ICONINFORMATION+MB_OK)  
  else  
  begin  
  if   FileExists(S+'head.exe')   then   DeleteFile(S+'head.exe');  
  Application.MessageBox('文件加密失败!','信息',MB_ICONINFORMATION+MB_OK)  
  end;  
  end;  
  其中ExtractRes为自定义函数,它的作用是把head.exe从资源文件中取出来。  
  Function   ExtractRes(ResType,   ResName,   ResNewName   :   String):boolean;  
  var  
  Res   :   TResourceStream;  
  begin  
  try  
  Res   :=   TResourceStream.Create(Hinstance,   Resname,   Pchar(ResType));  
  try  
  Res.SavetoFile(ResNewName);  
  Result:=true;  
  finally  
  Res.Free;  
  end;  
  except  
  Result:=false;  
  end;  
  end;  
        注意:我们上面的函数只不过是简单的把一个文件添加到另一个文件的尾部。实际应用中可以改成可以添加多个文件,只要根据实际大小和个数定义好偏移地址就可以了。比如说文件捆绑机就是把两个或者多个程序添加到一个头文件里面。那些自解压程序和安装程序的原理也是一样的,不过多了压缩而已。比如说我们可以引用一个LAH单元,把流压缩后再添加,这样文件就会变的很小。读出来时先解压就可以了。另外,文中EXE加密器的例子还有很多不完善的地方,比如说密码固定为"790617",取出EXE运行后应该等它运行完毕后删除等等,读者可以自行修改。Top

3 楼54993699(老虎)回复于 2003-11-01 21:25:43 得分 0

先谢过。这个文章我有了。  
  这只是用流来在文件尾里加入另一个文件而已,也不是改变文件,给点有关联或真正的实力行不Top

4 楼aiirii(ari-http://spaces.msn.com/members/aiirii/)回复于 2003-11-01 21:36:24 得分 0

to   54993699(54993699)   :   你的要求難度很大,   估計很難找到你滿意的答案,!!!Top

5 楼54993699(老虎)回复于 2003-11-01 21:43:46 得分 0

哦,那我在等等好了。Top

6 楼xiehu1978()回复于 2003-11-01 22:01:36 得分 0

把你的exe發過來,我幫你改,改完再傳回給你Top

7 楼54993699(老虎)回复于 2003-11-02 10:26:14 得分 0

呵呵,要用二进制软件我自己就改了。  
  想要的是实现的方法,代码,Top

8 楼liyangyao970(纳兰容若)回复于 2003-11-02 10:38:52 得分 0

up,learningTop

9 楼54993699(老虎)回复于 2003-11-03 11:32:52 得分 0

tttTop

10 楼XXSingle(心无了然)回复于 2003-11-03 13:23:35 得分 0

upTop

11 楼54993699(老虎)回复于 2003-11-07 11:12:32 得分 0

tTop

12 楼aiirii(ari-http://spaces.msn.com/members/aiirii/)回复于 2003-11-07 11:31:24 得分 20

>>呵呵,要用二进制软件我自己就改了。  
  如果你能用   二进制软件   自己修改,   那理論上用流也就很簡單了,   主要是定位要修改的位置!!如果你能清楚要修改的位置,   那就太簡單就了!!Top

13 楼summerlover(summerlover)回复于 2003-11-07 18:49:59 得分 0

upTop

14 楼54993699(老虎)回复于 2003-11-11 19:39:43 得分 0

我对于生成exe后软件的位置一点也不懂,请问一下如何定位?,给个例子看下可以么?  
  谢谢Top

15 楼zhxfzhxf1(zhxfzhxf1)回复于 2003-11-11 21:10:40 得分 0

upTop

16 楼D_Q(Didi)(A.Dai)(菜鸟也想飞)回复于 2003-11-11 21:44:22 得分 60

把设置文件   +   在二进制EXE   的尾部   既可实现你的要求,程序   create   读尾部   再创建socket   连接...  
   
  Seek   BlockRead  
   
  实现...Top

17 楼zygtp()回复于 2003-11-17 12:03:29 得分 0

如果你的端口是在设计窗体时指定的,那么很简单,用户资源文件编辑器2分钟就可以搞定。Top

相关问题

  • 报表生成问题?100分送上
  • 报表生成问题?100分送上
  • 报表生成问题?100分送上,不够.net版还有
  • *** pb8生成可执行文件问题,高分在线等,100分送给你!!!!***
  • 送分送分送分送分送分
  • 送分!送分!送分!送分!送分!送分!送分!送分!送分!送分!送分!
  • 如何使生成的EXCEL表格打印的时候有表格线?100分送上!!!
  • 送分,送分送分
  • 送分 送分 送分
  • 送分!送分!送分!

关键词

  • 文件
  • 函数
  • 加密
  • 尾部
  • 二进制
  • 控件
  • 端口
  • 属性
  • 修改
  • myfilesize

得分解答快速导航

  • 帖主:54993699
  • RockEx
  • aiirii
  • D_Q

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo