主页 > 编程资料 > Delphi >
发布时间:2015-09-22 作者:网络 阅读:130次

之前一直在找关于木马生成服务端原理的文章。我在以前的日记里面也提到过的,网上相关的文章也找了不少,但是都没有把问题好好说清楚。虽然也给出了代码,但是废话还是不少,让我走了不少弯路。我一直提倡的:程序就想姑娘的裙子,越短越好。对于我们这样的菜鸟,简单的就是最好的。同一件事可以用十几个字表达清楚,为什么用上千字呢,说不定还说的让人不懂了。。。

    原理是把目标程序作为资源文件包括到主程序中,运行时从资源中读取此文件,并复制给一内存流。用指针定位到要修改的位置,写入修改内容,生成文件。释放空间。  

废话说了不少。下面开始正题:是怎么编写一个程序,它可以根据用户的需要生成另外一个程序(文件)涉及内容有:文件流,资源文件。不懂的可以到网上找相关代码,我把原程序给出,并给出解释。为了说明问题,就用简单的对话框程序(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.

关键字词: