用汇编语言写ESMTP邮件发送程序
下载本节例子程序和源代码 (9.67 KB) |
最近在CSDN论坛上看到许多人问着同一个问题——如何编写带服务器验证的 ESMTP 邮件发送程序,回答的人还真不少:有建议用 MAPI 的、有建议使用别人的类库的……其实我对此是颇不以为然的。ESMTP 的编写并不困难,关键是弄清楚了协议——只要严格按照协议来进行,就一定能OK,反而编程的技巧在此倒是无足轻重的。换句话说,写这个程序是Easy job,没有必要用到 MAPI 等“庞然大物”啊。
既然如此,让我们来使用 Win32ASM 编写一个自己的 ESMTP “引擎”,可以用在你的病毒或者木马上哦! :)
我们先来看看 SMTP 的发送协议,在 rfc821(smtp) 和 rfc1521(mime) 里面写得非常清楚,读者请自行参考这两个文档。什么?看不懂英文?……没关系,我给大家整理一下。ESMTP 的整个发送过程如下:
Socket连接后,按 ESMTP 协议通讯(注意每条命令结尾符“回车/换行/./回车/换行”结束): 1、EHLO <Domain>/r/n 这条命令可以不要,但是按照标准的写法,还是加上好。 Example: EHLO smtp.163.net/r/n 2、AUTH LOGIN/r/n 告诉服务器,要进行验证了。 3、Base64_Username/r/n 发送经过 Base64 编码的用户名给服务器。 4、Base64_Password/r/n 发送经过 Base64 编码的密码给服务器。 5、MAIL FROM: /r/n 发送者的Email地址。 Example: MAIL FROM: lcother@163.net/r/n 6、RCPT TO: /r/n 目标Email地址。 Example: RCPT TO: target@163.net/r/n 7、DATA/r/n 开始传送数据。 8、发送数据/r/n./r/n 注意:SMTP协议只发送信息,至于如何区分CC、BCC、Subject、Body等不属于SMTP的范围,详情请查看RFC文档MAIL格式部分 简单说一下MAIL格式:Sunject:<主题>/r/n/r/n<内容>,还有好多…… 返回值为“250 ***”表示正常,同时***里含有MessageID等信息(前面的命令都有相应的返回信息) 9、QUIT/r/n Over,走人…… |
上面的是 ESMTP 的协议,如果我们严格按照上面的协议,就可以写出 ESMTP 的发送程序了。大家看出来了吗?其实 ESMTP 与 SMTP 唯一不同的地方,就是在于第三步和第四步——缺少了这两个步骤, ESMTP 就等于 SMTP 了。
至于如何区分正文和附件,其实是在 DATA/r/n 后,通过一个叫做“Boundary”的分隔字符串来分隔开来的,这个“Boundary”可以是任意的字符串,随你喜欢怎么取都行,但是必须注意的是,分隔的时候要按照“--Boundary”的格式,结束的时候要用“--Boundary--”。而附件的内容,是通过 Base64 编码,包含在 DATA 里面进行发送;如果有多个附件,就要进行循环,把每个附件的内容包含进去,直至结束。
这样说会不会太抽象了?好吧,我举个例子:
"EHLO smtp.163.net", 13, 10 "AUTH LOGIN", 13, 10 "lcother", 13, 10 "lcother_password", 13, 10 "MAIL FROM:lcother@163.net", 13, 10 "RCPT TO:target@163.net", 13, 10 "DATA", 13, 10 "From: 老罗", 13, 10,/ "To: Somebody", 13, 10, / "Subject: 你好吗?", 13, 10, 0 "MIME-Version: 1.0", 13, 10, / "X-Mailer: LCMailer by LC", 13, 10, / "Content-type:multipart/mixed;Boundary=www.LuoCong.com", 13, 10, 13, 10, / "--www.LuoCong.com", 13, 10, / "Content-type:text/plain;Charset=GB2312", 13, 10, / "Content-Transfer-Encoding:8bit", 13, 10, 13, 10, / "好久不见,最近过得好吗?(正文内容)", 13, 10, 13, 10, 0, / .if (有附件) "--www.luocong.com", 13, 10, / .while (files to be sent) 13, 10, / 13, 10, / "--", 13, 10, / "Content-Type:application/octet-stream;Name=文件名", 0, / "Content-Disposition:attachment;FileName=文件名", 0, / 13, 10, / "Content-Transfer-Encoding:Base64", 13, 10, 13, 10, 0, / 经过 Base64 编码的文件内容, 13, 10, 0/ .endw .endif 13, 10, / "--www.luocong.com--", / 13, 10, ".", 13, 10 "QUIT", 13, 10 |