之前一直在找关于木马生成服务端原理的文章。我在以前的日记里面也提到过的,网上相关的文章也找了不少,但是都没有把问题好好说清楚。虽然也给出了代码,但是废话还是不少,让我走了不少弯路。我一直提倡的:程序就想姑娘的裙子,越短越好。对于我们这样的菜鸟,简单的就是最好的。同一件事可以用十几个字表达清楚,为什么用上千字呢,说不定还说的让人不懂了。。。
原理是把目标程序作为资源文件包括到主程序中,运行时从资源中读取此文件,并复制给一内存流。用指针定位到要修改的位置,写入修改内容,生成文件。释放空间。
废话说了不少。下面开始正题:是怎么编写一个程序,它可以根据用户的需要生成另外一个程序(文件)涉及内容有:文件流,资源文件。不懂的可以到网上找相关代码,我把原程序给出,并给出解释。为了说明问题,就用简单的对话框程序(A程序)说明。
实验的结果就是由B程序生成A程序。A:一个button控件,点击后出现一对话框。B:设置A程序中对话框的内容(标题和信息)并生成A程序。其中A的编写我就不废话了。我们还要找到消息和标题在文件中的位置,用ue,winhex等编辑工具就可以了,这个过程我也不多说了,我的位置是addr1:=315328;
addr2:=315336;将来要用的,B的具体步骤如下:
一,先将A(ade.exe)做成资源文件:
1,把“fuwuduan RCDATA ade.exe”这句话写入一记事本,保存为fuwu.rc 2,写批处理
path=d:\Program Files\Borland\Delphi6\Bin;
Brcc32 fuwu.rc
pause
3,运行批处理,生成fuwu.res//做了这么多要的就是这个文件了,将它复制到B工程所在路径
二,在主程序中调用资源文件:
1,{$R fuwu.res} 2 ,下面给出所有代码:
unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button2: TButton;
SaveDialog1: TSaveDialog;
Edit1: TEdit;//标题
Edit2: TEdit;//信息
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Res: TResourceStream;//资源流
Source:TMemoryStream;//内存流
implementation
{$R *.dfm}
{$R fuwu.res}
procedure TForm1.Button2Click(Sender: TObject);
var
p1,p2:pchar;//字符指针
size1,size2:integer;//文本长度
addr1,addr2:longint;//定位到的地址(这个不懂的话,问问玩黑客的免杀大师们)
begin
if savedialog1.Execute then//应该用两个button的,我就简化了
begin
size1:=length(edit1.Text);//获取长度
size2:=length(edit2.Text);
addr1:=315328;//应该用const的,哎,编程风格没有养成啊
addr2:=315336;
p1:=pchar(edit1.Text);//p1指向edit1.text
p2:=pchar(edit2.Text);
Res := TResourceStream.Create(Hinstance, 'fuwuduan', RT_RCDATA);// 创建资源流,并提取fuwuduan(我们生成的资源文件)复制给res
source:= TMemoryStream.Create;//创建内存流
source.LoadFromStream(res);//将资源流复制给内存流
source.Seek(addr1,sofrombeginning);//定位到addr1
source.WriteBuffer(p1^,size1);//写入edit1.text里面的内容
source.Seek(addr2,sofrombeginning);//同上
source.WriteBuffer(p2^,size2);
source.SaveToFile(savedialog1.FileName);//保存,这个不要解释了吧
source.Free;//别忘了释放
Res.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
close;
end;
end.
关键字词: