首页
社区
课程
招聘
[分享]汇编语言实现邮件发送
发表于: 2015-11-27 17:37 5835

[分享]汇编语言实现邮件发送

2015-11-27 17:37
5835
(土木狗所写,本文为第一篇,望各位大牛勿喷,刚入行不久,望各位同僚勿拍砖)
先上源码!本源码是在网上的一个程序改编而写的,我测试了些时间,没成功,即在该基础上进行进一步改写。如有部分代码侵权,本人会即刻删帖。还是首先向原作者致敬(不记得在哪儿下载的了,望谅解)。

补充注意点:因为本代码是在qq邮箱服务器上测试的,一下以qq邮箱为例说明

szUsername  为账号(qq号码)的base64编码

szPassword  为密码的base64编码

INCLUDELIB MSVCRTD.LIB  是为了使用printf函数

_TEXT SEGMENT和_TEXT END语法,是从vc2010编译出的asm文件学习的,初次编写完后,怎么运行都不能正常结束

代码最后为END,也是从vc2010编译出的asm文件学习的

本代码最终测试成功。希望能共勉

编写过程中有一个问题没解决,同僚们如有办法,求各位告知

问题描述如下:

我想在每次向qq服务器发送后,调用函数接收返回编码,于是用该函数如下:

        invoke  RtlZeroMemory,addr szRcvBuffer,sizeof szRcvBuffer
        invoke    recv,hSocket,addr szRcvBuffer,200,0
        push offset szRcvBuffer
        push offset sz100s
        call printf

因为调用次数比较多(如下代码可以看到,屡次调用该段),想单独写成一个函数。

我才入手汇编一两个礼拜,试了几遍,没试出来。

(土木狗向各位同僚致谢!)
                        .386
                        .model flat, stdcall
                        option casemap:none
include                        windows.inc
include                        kernel32.inc
includelib                kernel32.lib
include                        wsock32.inc
includelib                wsock32.lib

                        .data
hSocket                        dd        ?
wsadata                        WSADATA                <>
sin                                sockaddr_in                <>
szSend                        db        "smtp.qq.com",0
szRcvBuffer                db        100 dup(0)
szHelo                        db        "EHLO abcdefg-PC",13,10,0
szAuth                        db        "AUTH LOGIN",13,10,0

szUsername                db        "NjU0OTU2NTYx",13,10,0
szPassword                db        "************",13,10,0
szRCPT                        db        "RCPT TO:<wangdingqian@126.com>",13,10,0
szMailFrom                db        "MAIL FROM: <654956561@qq.com>",13,10,0

szData                        db        "DATA",13,10,0
szFrom                        db        "654956561@qq.com",13,10,0
szSubject                db        "SUBJECT:%s",13,10,0
szReplyTo                db        "Reply-TO:%s",13,10,0
szNull                        db        13,10,0
szHead                        db        "From:<654956561@qq.com>",13,10,"To:<wangdingqian@126.com>",13,10,"Subject:Hello",13,10,13,10,0
;szHead最后必须两次/r/n即,13,10,13,10,0
szContent                db        "just fuck it ,and no hesitate",13,10,".",13,10,0
szQuit                        db        "QUIT",13,10,0
szServer                db        "smtp.qq.com",0

.code

_TEXT        SEGMENT
start:
                invoke        WSAStartup, 101h, addr wsadata
                invoke        socket, AF_INET, SOCK_STREAM, 0
                mov        hSocket, eax

                invoke  RtlZeroMemory,addr sin,sizeof sin
                mov        sin.sin_family, AF_INET
                invoke        htons, 25;主机字节顺序转化为网络字节顺序
                mov        sin.sin_port, ax
                invoke        gethostbyname, addr szSend

                .if        eax
                        mov        eax, [eax + hostent.h_list]
                        mov        eax, [eax]
                        mov        eax, [eax]
                        mov        sin.sin_addr, eax
                .endif

                ;;        建立连接
                invoke        connect, hSocket, addr sin, sizeof sin
                ;;        发送“ehlo local”
                invoke        lstrlen,addr szHelo
                invoke        send, hSocket, addr szHelo, eax, 0
               
                invoke  RtlZeroMemory,addr szRcvBuffer,sizeof szRcvBuffer
                invoke        recv,hSocket,addr szRcvBuffer,100,0
                ;;        发送“auth login”
                invoke        lstrlen,addr szAuth
                invoke        send, hSocket, addr szAuth, eax, 0
                invoke  RtlZeroMemory,addr szRcvBuffer,sizeof szRcvBuffer
                invoke        recv,hSocket,addr szRcvBuffer,100,0
               
                ;发送用户名
                invoke        lstrlen,addr szUsername
                invoke        send, hSocket, addr szUsername, eax, 0
                invoke  RtlZeroMemory,addr szRcvBuffer,sizeof szRcvBuffer
                invoke        recv,hSocket,addr szRcvBuffer,100,0
                ;;        发送密码
                invoke        lstrlen,addr szPassword
                invoke        send, hSocket, addr szPassword, eax, 0
                ;;        发送“mail from”
                invoke        lstrlen,addr szMailFrom
                invoke        send, hSocket, addr szMailFrom,eax, 0
                invoke  RtlZeroMemory,addr szRcvBuffer,sizeof szRcvBuffer
                invoke        recv,hSocket,addr szRcvBuffer,100,0
                ;;        发送“rcpt”
                invoke        lstrlen,addr szRCPT
                invoke        send, hSocket, addr szRCPT,eax, 0
                invoke  RtlZeroMemory,addr szRcvBuffer,sizeof szRcvBuffer
                invoke        recv,hSocket,addr szRcvBuffer,100,0
                ;; DATA 准备开始发送邮件内容
                invoke        lstrlen,addr szData
                invoke        send, hSocket, addr szData, eax, 0
                invoke  RtlZeroMemory,addr szRcvBuffer,sizeof szRcvBuffer
                invoke        recv,hSocket,addr szRcvBuffer,100,0
                ; 邮件内容为szHead
                invoke        lstrlen,addr szHead
                invoke        send, hSocket, addr szHead,eax, 0
                invoke  RtlZeroMemory,addr szRcvBuffer,sizeof szRcvBuffer
                invoke        recv,hSocket,addr szRcvBuffer,100,0
                ;;        发送邮件正文
                invoke        lstrlen,addr szContent
                invoke        send, hSocket, addr szContent,eax, 0
                invoke  RtlZeroMemory,addr szRcvBuffer,sizeof szRcvBuffer
                invoke        recv,hSocket,addr szRcvBuffer,100,0
                ;;        发送“quit”
                invoke        lstrlen,addr szQuit
                invoke        send, hSocket, addr szQuit, eax, 0
                invoke  RtlZeroMemory,addr szRcvBuffer,sizeof szRcvBuffer
                invoke        recv,hSocket,addr szRcvBuffer,100,0
                ;;        断开连接
                invoke        closesocket, hSocket
                invoke        WSACleanup
                ret 0

_TEXT        ENDS
end start

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 1234
活跃值: (302)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
前排搬板凳坐着慢慢看
2015-11-27 17:39
0
雪    币: 209
活跃值: (813)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
看见Win32汇编写的代码就蛋疼!
16位汇编只要了解其原理就行了,32位汇编只要能写个ShellCode Hook之类的内联汇编就行了,放着C/C++这么简洁明了的语法调用不去写,非要用什么MASM、RadASM之类的去写,真是闲的蛋疼!
脱裤子放屁,多此一举...
2015-11-27 18:15
0
雪    币: 147
活跃值: (510)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
谢谢指正。
2015-11-27 18:59
0
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
要么就用纯ASM,要么就用c c++混合内嵌ASM,你这种MASM所谓的宏汇编语法,看起来蛋疼,既没有ASM的优点,也没有C的优点。
2015-11-27 20:04
0
雪    币: 6575
活跃值: (4531)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
6
收藏了,感谢分享
2015-11-27 20:17
0
雪    币: 147
活跃值: (510)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
谢谢指正~向您学习~共勉~~
2015-11-28 08:31
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
为什么我运行结果总是535 error,authentication failed,system busy
?请帮忙
2015-11-30 15:31
0
雪    币: 147
活跃值: (510)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
不要把其中的recevie代码删掉,发送代码给服务器以后,要等待服务器回复。代服务器反应过来以后,也就是它给您正确回复代码了以后,再发送下一条指令。
总之,不要连续给服务器发送指令,要等待它 反应过来。
不知道是否解决了您的疑问。
如再有问题,回复即可。
2015-12-4 18:20
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我真晕了,这次又提示 530 error, a secure connection is required,提交密码后提示的
我回头改成465,结果recv失败
改成587,结果显示要先 starttls command
ssl就算了,我搞不了
2015-12-8 19:23
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
是不是对用户名和密码有要求的,不是普通qq能用的?或者对EHLO 后面的hostname 有要求?
2015-12-8 19:26
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
.386
.model flat, stdcall  ;32 bit memory model
option casemap :none  ;case sensitive
;__RELEASE__        equ        <>
include MailSend.Inc
.code
start:
        invoke  WSAStartup, 101h, offset wsadata
        invoke  socket, AF_INET, SOCK_STREAM, 0
        mov  hSocket, eax
       
        invoke  RtlZeroMemory,offset sin,sizeof sin
        mov  sin.sin_family, AF_INET
        invoke  htons, 25;主机字节顺序转化为网络字节顺序
        mov  sin.sin_port, ax
        invoke  gethostbyname, offset szSend
       
        .if  eax
                mov  eax, [eax + hostent.h_list];
                mov  eax, [eax];
                mov  eax, [eax];
                mov  sin.sin_addr, eax
        .endif
       
        ;;  建立连接
        invoke  connect, hSocket, offset sin, sizeof sin
        invoke  recv,hSocket,offset szRcvBuffer,sizeof szRcvBuffer,0
        ;EHLO
        invoke  lstrlen,offset szHelo        ;not include null terminated,sizeof include null terminated
        invoke  send, hSocket, offset szHelo,eax, 0       
        invoke  RtlZeroMemory,offset szRcvBuffer,sizeof szRcvBuffer
        invoke  recv,hSocket,offset szRcvBuffer,sizeof szRcvBuffer,0
        ;AUTH LOGIN
        invoke  lstrlen,offset szAuth
        invoke  send, hSocket, offset szAuth, eax, 0
        invoke  RtlZeroMemory,offset szRcvBuffer,sizeof szRcvBuffer
        invoke  recv,hSocket,offset szRcvBuffer,sizeof szRcvBuffer,0
       
        ;发送用户名
        invoke  lstrlen,offset szUsername
        invoke         Base64Encode,offset szUsername,eax,offset buffer
        mov        dword ptr buffer[eax],0a0dh
        add        eax,2
        invoke  send, hSocket, offset buffer, eax, 0
        invoke  RtlZeroMemory,offset szRcvBuffer,sizeof szRcvBuffer
        invoke  recv,hSocket,offset szRcvBuffer,sizeof szRcvBuffer,0
        ;;  发送密码
       
        invoke  RtlZeroMemory,offset buffer,sizeof buffer
        invoke  lstrlen,offset szPassword
        invoke         Base64Encode,offset szPassword,eax,offset buffer
        mov        dword ptr buffer[eax],0a0dh
        add        eax,2
        invoke  send, hSocket, offset buffer, eax, 0
        invoke  RtlZeroMemory,offset szRcvBuffer,sizeof szRcvBuffer
        invoke  recv,hSocket,offset szRcvBuffer,sizeof szRcvBuffer,0;这里接收到错误信息
        ;;  发送“mail from”
        invoke  lstrlen,offset szMailFrom
        invoke  send, hSocket, offset szMailFrom,eax, 0
        invoke  RtlZeroMemory,offset szRcvBuffer,sizeof szRcvBuffer
        invoke  recv,hSocket,offset szRcvBuffer,sizeof szRcvBuffer,0
        ;;  发送“rcpt”
        invoke  lstrlen,offset szRCPT
        invoke  send, hSocket, offset szRCPT,eax, 0
        invoke  RtlZeroMemory,offset szRcvBuffer,sizeof szRcvBuffer
        invoke  recv,hSocket,offset szRcvBuffer,sizeof szRcvBuffer,0
        ;; DATA 准备开始发送邮件内容
        invoke  lstrlen,offset szData
        invoke  send, hSocket, offset szData, eax, 0
        invoke  RtlZeroMemory,offset szRcvBuffer,sizeof szRcvBuffer
        invoke  recv,hSocket,offset szRcvBuffer,sizeof szRcvBuffer,0
        ; 邮件内容为szHead
        invoke  lstrlen,offset szHead
        invoke  send, hSocket, offset szHead,eax, 0
        invoke  RtlZeroMemory,offset szRcvBuffer,sizeof szRcvBuffer
        invoke  recv,hSocket,offset szRcvBuffer,sizeof szRcvBuffer,0
        ;;  发送邮件正文
        invoke  lstrlen,offset szContent
        invoke  send, hSocket, offset szContent,eax, 0
        invoke  RtlZeroMemory,offset szRcvBuffer,sizeof szRcvBuffer
        invoke  recv,hSocket,offset szRcvBuffer,sizeof szRcvBuffer,0
        ;;  发送“quit”
        invoke  lstrlen,offset szQuit
        invoke  send, hSocket, offset szQuit, eax, 0
        invoke  RtlZeroMemory,offset szRcvBuffer,sizeof szRcvBuffer
        invoke  recv,hSocket,offset szRcvBuffer,sizeof szRcvBuffer,0
        ;;  断开连接
        invoke  closesocket, hSocket
        invoke  WSACleanup       
        invoke ExitProcess,NULL

end start
2015-12-8 19:32
0
雪    币: 147
活跃值: (510)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
不好意思,回老家了这些天
这个问题我回去了仔细回答您
我回头注册个扣扣,里面填上完整账号密码给您把成品代码发过去
2015-12-13 16:03
0
雪    币: 42
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
谢谢!!!!
2015-12-13 19:56
0
游客
登录 | 注册 方可回帖
返回
//