POP3协议与SMTP协议分析(winmail、Wireshark、ubuntu(QT)、foxmail)

目录

 

原理

 

内容 

器材(设备、元器件)

步骤

一、Winmail的安装

二、通过foxmail利用wireshark抓包

·抓SMTP包

·抓POP包

          三、QT程序实现POP3和SMTP协议抓包

·POP3

·SMTP

         (附录)QT中抓POP与SMTP的C语言代码

·POP

`SMTP


  • 原理

20181213155147239.png

 

  • 内容 

1.Window下Winmail邮件服务器安装过程。

2.应用场景分析:

从搭建的环境中利用wireshark捕获数据包,了解命令格式对应关系。

3.POP3与SMTP协议在QT中C语言的实现。

 

  • 器材(设备、元器件)

winmail、Wireshark、ubuntu(QT)、foxmail

 

  • 步骤

一、Winmail的安装

1.点开下载好的Winmail安装程序

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

输入密码:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

开始安装:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

安装完成:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

2.点击服务器程序,添加用户

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

3.打开管理端:

20181213155801189.png

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

成功连接。

在用户管理界面新添加一个用户zlz1:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

4.登陆刚刚添加用户产生的URL

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

得到web邮箱界面:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

二、通过foxmail利用wireshark抓包

·抓SMTP

1.安装好foxmail后配置foxmail:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

2.设置成功后,先写一封信,不要发送,打开wireshark:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

3.开始抓包,并且发送邮件,发送完成后,停止抓包。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

成功抓到SMTP协议的数据包。

 

4.分析电子邮件数据包:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

(1)第55帧Foxmail向服务器发送HELO指令,表明身份,可以看到Foxmail客户端的主机名:zlz.com。第57帧服务器回复250表示服务器可用。

(2)第58帧与第60帧,可以看到发送邮件的发送者和接收者。

(3)第63、65、66帧在传输数据内容,第65帧服务器回应354 End data with..表示同意接收。

在第66帧可以看到发送邮件的数据大小。(4)第68帧是邮件的账户和主题信息。

(5)第71帧看到域名解析失败。

(6)第72帧断开服务器连接。

5.为什么域名解析失败?百度了一下:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

然后听说163可以收到,又试着给自己的163邮箱发了一封邮件(过程抓包):

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

 6. 分析数据包,看到第33帧邮件成功的发送了。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

由此百度了一下,原因可能是域名被QQ加黑名单了。

 

7.查看数据包内容:随便选一个数据包,跟踪TCP流:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

可以看到邮件收发用户、邮件主题

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

base64加密过的邮件内容。

·抓POP

1.使用foxmail登录163账号发现不行,并在163邮箱里收到了一封邮件:

 watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

2.百度后尝试在163邮箱设置中设置授权码,以便第三方软件登陆:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

3.设置成功后再在Foxmail中添加163账号,使用授权码登陆,并设置为POP3协议:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

4.打开wireshark抓包并用自己搭的winmail服务器向163邮箱发一封邮件,发送成功后,在foxmail页面点收取邮件,然后停止抓包:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

 

分析数据包:

(1)第10、13帧可以看到账号和密码都被明文显示了。

服务器响应是由一个单独的命令行组成或多个命令行组成,响应第一行以ASCII文本+OK或-ERR指出相应状态是成功还是失败。

(2)认证成功后,进入处理阶段:

第16帧,主机向服务器发送命令码STAT,服务器向主机发回邮箱的统计资料(第18帧),包括邮件总数和总字节数(20封邮件、共165760个字节)

第19帧,向服务器发送命令码LIST,第20帧服务器返回邮件数量和每个邮件的大小,每个邮件的大小可双击数据包查看:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

第21帧,向服务器发送命令码UIDL,第23帧服务器返回邮件数量和每个邮件的唯一标识符:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

第24帧,向服务器发送命令码RETR,第25帧,服务器返回由参数标识的邮件的全部文本 ,此时是返回刚刚收到的第20封邮件的文本内容。

第26帧,返回邮件的大小,共1440字节。

第27帧,显示发件人的账号与邮件主题:

20181213160923476.png

第29帧,主机收到邮件确认。

第31帧,向服务器发送QUIT命令码,终止服务。

第32帧,服务器响应OK。会话终止。

 

依然可以在数据包追踪TCP流中查看到收发件人账号、IP地址、邮件主题以及base64加密后的邮件内容:watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

 

三、QT程序实现POP3和SMTP协议抓包

·POP3

1.在QT中写好代码后执行:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

2.重新打开一个终端,telnet连接163的POP3服务器:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

程序回显:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

3.用user和pass命令在终端上输入账号和密码:

20181213161542116.png

得到回显:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

4.

stat: 查看邮箱中的邮件数量以及所占用的字节大小

uidl:查看唯一标识符

20181213161627773.png

回显:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

retr:       获取编号为msg#的邮件的内容

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

回显:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

quit:断开连接

20181213161825285.png

回显:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

·SMTP

1.在QT中写好代码后运行:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

2.使用 telnet smtp.163.com 25 命令与请求smtp服务器连接:

20181213161927159.png

得到回显:

20181213161951166.png

3.向服务器发送 ehlo 命令建立连接:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

得到回显:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

4.发送auth login命令后输入base64加密后的邮箱账号和密码:

20181213162039351.png

得到认证成功的回显:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

5.验证成功后,使用 mail from:xxx@163.com命令输入邮件发送方;

使用rcpt to:xxx@xxx.com命令输入邮件收件方;

使用data命令,编写邮件内容;

使用subject:from:命令标注邮件头的主题和来源;

标注后输入邮件体的具体内容

输入具体内容后以“.”结束输入。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

回显:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

成功后可收到邮件:

20181213162231712.png

6.使用quit命令与smtp服务器断开连接:

20181213162239366.png

回显:

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1pob3VfWmlaaQ==,size_16,color_FFFFFF,t_70

 

QT中抓POP与SMTP的C语言代码

源自《网络数据与协议分析》

LIBS += -lpcap -lnids

·POP

#include "nids.h"
#include "pcap.h"
#include "libnet.h"
#include "stdio.h"

char ascii_string[10000];
char *char_to_ascii(char ch)
{
    char *string;
    ascii_string[0] = 0;
    string = ascii_string;
    if (isgraph(ch))
        *string++ = ch;
    else if (ch == ' ')
        *string++ = ch;
    else if (ch == '\n' || ch == '\r')
        *string++ = ch;
    else
        *string++ = '.';
    *string = 0;
    return ascii_string;
}
/*
=======================================================================================================================
下面是分析POP3协议的回调函数
=======================================================================================================================
 */
void pop3_protocol_callback(struct tcp_stream *pop3_connection, void **arg)
{
    int i;
    char address_string[1024];
    char content[65535];
    char content_urgent[65535];
    struct tuple4 ip_and_port = pop3_connection->addr;
    strcpy(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.saddr))));
    sprintf(address_string + strlen(address_string), " : %i", ip_and_port.source);
    strcat(address_string, " <---> ");
    strcat(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.daddr))));
    sprintf(address_string + strlen(address_string), " : %i", ip_and_port.dest);
    strcat(address_string, "\n");
    switch (pop3_connection->nids_state)
    {
        case NIDS_JUST_EST:
            if (pop3_connection->addr.dest == 110)
            {
                /*POP3客户端和POP3服务器端建立连接 */
                pop3_connection->client.collect++;
                /* POP3客户端接收数据 */
                pop3_connection->server.collect++;
                /* POP3服务器接收数据 */
                pop3_connection->server.collect_urg++;
                /* POP3服务器接收紧急数据 */
                pop3_connection->client.collect_urg++;
                /* POP3客户端接收紧急数据 */
                printf("%sPOP3客户端与POP3服务器建立连接\n", address_string);
            }
            return ;
        case NIDS_CLOSE:
            /* POP3客户端与POP3服务器端连接正常关闭 */
            printf("--------------------------------\n");
            printf("%sPOP3客户端与POP3服务器连接正常关闭\n", address_string);
            return ;
        case NIDS_RESET:
            /* POP3客户端与POP3服务器端连接被RST关闭 */
            printf("--------------------------------\n");
            printf("%sPOP3客户端与POP3服务器连接被REST关闭\n", address_string);
            return ;
        case NIDS_DATA:
            {
                /* POP3协议接收到新的数据 */
                char status_code[5];
                struct half_stream *hlf;
                if (pop3_connection->server.count_new_urg)
                {
                    /* POP3服务器接收到新的紧急数据 */
                    printf("--------------------------------\n");
                    strcpy(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.saddr))));
                    sprintf(address_string + strlen(address_string), " : %i", ip_and_port.source);
                    strcat(address_string, " urgent---> ");
                    strcat(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.daddr))));
                    sprintf(address_string + strlen(address_string), " : %i", ip_and_port.dest);
                    strcat(address_string, "\n");
                    address_string[strlen(address_string) + 1] = 0;
                    address_string[strlen(address_string)] = pop3_connection->server.urgdata;
                    printf("%s", address_string);
                    return ;
                }
                if (pop3_connection->client.count_new_urg)
                {
                    /* POP3服务器接收到新的紧急数据 */
                    printf("--------------------------------\n");
                    strcpy(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.saddr))));
                    sprintf(address_string + strlen(address_string), " : %i", ip_and_port.source);
                    strcat(address_string, " <--- urgent ");
                    strcat(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.daddr))));
                    sprintf(address_string + strlen(address_string), " : %i", ip_and_port.dest);
                    strcat(address_string, "\n");
                    address_string[strlen(address_string) + 1] = 0;
                    address_string[strlen(address_string)] = pop3_connection->client.urgdata;
                    printf("%s", address_string);
                    return ;
                }
                if (pop3_connection->client.count_new)
                {
                    /* POP3客户端接收到新的数据 */
                    hlf = &pop3_connection->client;
                    strcpy(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.saddr))));
                    sprintf(address_string + strlen(address_string), ":%i", ip_and_port.source);
                    strcat(address_string, " <--- ");
                    strcat(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.daddr))));
                    sprintf(address_string + strlen(address_string), ":%i", ip_and_port.dest);
                    strcat(address_string, "\n");
                    printf("--------------------------------\n");
                    printf("%s", address_string);
                    memcpy(content, hlf->data, hlf->count_new);
                    content[hlf->count_new] = '\0';
                    if (strstr(strncpy(status_code, content, 4), "+OK"))
                        printf("操作成功\n");
                    if (strstr(strncpy(status_code, content, 4), "-ERR"))
                        printf("操作失败\n");
                    for (i = 0; i < hlf->count_new; i++)
                    {
                        printf("%s", char_to_ascii(content[i]));
                    }
                    printf("\n");
                    if (strstr(content, "\n\r.\n\r"))
                        printf("数据传输结束\n");
                }
                else
                {
                    /* POP3服务器接收到新的数据 */
                    hlf = &pop3_connection->server;
                    strcpy(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.saddr))));
                    sprintf(address_string + strlen(address_string), ":%i", ip_and_port.source);
                    strcat(address_string, " ---> ");
                    strcat(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.daddr))));
                    sprintf(address_string + strlen(address_string), ":%i", ip_and_port.dest);
                    strcat(address_string, "\n");
                    printf("--------------------------------\n");
                    printf("%s", address_string);
                    memcpy(content, hlf->data, hlf->count_new);
                    content[hlf->count_new] = '\0';
                    if (strstr(content, "USER"))
                        printf("邮件用户名为\n");
                    if (strstr(content, "PASS"))
                        printf("用户密码为\n");
                    if (strstr(content, "STAT"))
                        printf("返回统计资料\n");
                    if (strstr(content, "LIST"))
                        printf("返回邮件数量和大小\n");
                    if (strstr(content, "RETR"))
                        printf("获取邮件\n");
                    if (strstr(content, "DELE"))
                        printf("删除邮件\n");
                    if (strstr(content, "QUIT"))
                        printf("退出连接\n");
                    for (i = 0; i < hlf->count_new; i++)
                    {
                        printf("%s", char_to_ascii(content[i]));
                    }
                    printf("\n");
                }
            }
        default:
            break;
    }
    return ;
}
/*
=======================================================================================================================
主函数
=======================================================================================================================
 */
void main()
{
    nids_params.device="eth0";
    struct nids_chksum_ctl temp;
    temp.netaddr = 0;
    temp.mask = 0;
    temp.action = 1;
    nids_register_chksum_ctl(&temp,1);
    if (!nids_init())
     /* Libnids初始化 */
    {
        printf("出现错误:%s\n", nids_errbuf);
        exit(1);
    }
    nids_register_tcp(pop3_protocol_callback);
    /* 注册分析POP3协议的回调函数 */
    nids_run();
    /* 进入循环捕获数据包的状态 */
}

`SMTP

#include "nids.h"
#include "pcap.h"
#include "libnet.h"
#include "stdio.h"

char ascii_string[10000];
char *char_to_ascii(char ch)
{
    char *string;
    ascii_string[0] = 0;
    string = ascii_string;
    if (isgraph(ch))
        *string++ = ch;
    else if (ch == ' ')
        *string++ = ch;
    else if (ch == '\n' || ch == '\r')
        *string++ = ch;
    else
        *string++ = '.';
    *string = 0;
    return ascii_string;
}
/*
=======================================================================================================================
下面是分析SMTP协议的回调函数
=======================================================================================================================
 */
void smtp_protocol_callback(struct tcp_stream *smtp_connection, void **arg)
{
    int i;
    char address_string[1024];
    char content[65535];
    char content_urgent[65535];
    struct tuple4 ip_and_port = smtp_connection->addr;
    strcpy(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.saddr))));
    sprintf(address_string + strlen(address_string), " : %i", ip_and_port.source);
    strcat(address_string, " <---> ");
    strcat(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.daddr))));
    sprintf(address_string + strlen(address_string), " : %i", ip_and_port.dest);
    strcat(address_string, "\n");
    switch (smtp_connection->nids_state)
    {
        case NIDS_JUST_EST:
            if (smtp_connection->addr.dest == 25)
            {
                /*SMTP客户端和SMTP服务器端建立连接 */
                smtp_connection->client.collect++;
                /* SMTP客户端接收数据 */
                smtp_connection->server.collect++;
                /* SMTP服务器接收数据 */
                smtp_connection->server.collect_urg++;
                /* SMTP服务器接收紧急数据 */
                smtp_connection->client.collect_urg++;
                /* SMTP客户端接收紧急数据 */
                printf("%sSMTP发送方与SMTP接收方建立连接\n", address_string);
            }
            return ;
        case NIDS_CLOSE:
            /* SMTP客户端与SMTP服务器端连接正常关闭 */
            printf("--------------------------------\n");
            printf("%sSMTP发送方与SMTP接收方连接正常关闭\n", address_string);
            return ;
        case NIDS_RESET:
            /* SMTP客户端与SMTP服务器端连接被RST关闭 */
            printf("--------------------------------\n");
            printf("%sSMTP发送方与SMTP接收方连接被REST关闭\n", address_string);
            return ;
        case NIDS_DATA:
            {
                /* SMTP协议接收到新的数据 */
                char status_code[4];
                struct half_stream *hlf;
                if (smtp_connection->server.count_new_urg)
                {
                    /* SMTP服务器接收到新的紧急数据 */
                    printf("--------------------------------\n");
                    strcpy(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.saddr))));
                    sprintf(address_string + strlen(address_string), " : %i", ip_and_port.source);
                    strcat(address_string, " urgent---> ");
                    strcat(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.daddr))));
                    sprintf(address_string + strlen(address_string), " : %i", ip_and_port.dest);
                    strcat(address_string, "\n");
                    address_string[strlen(address_string) + 1] = 0;
                    address_string[strlen(address_string)] = smtp_connection->server.urgdata;
                    printf("%s", address_string);
                    return ;
                }
                if (smtp_connection->client.count_new_urg)
                {
                    /* SMTP服务器接收到新的紧急数据 */
                    printf("--------------------------------\n");
                    strcpy(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.saddr))));
                    sprintf(address_string + strlen(address_string), " : %i", ip_and_port.source);
                    strcat(address_string, " <--- urgent ");
                    strcat(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.daddr))));
                    sprintf(address_string + strlen(address_string), " : %i", ip_and_port.dest);
                    strcat(address_string, "\n");
                    address_string[strlen(address_string) + 1] = 0;
                    address_string[strlen(address_string)] = smtp_connection->client.urgdata;
                    printf("%s", address_string);
                    return ;
                }
                if (smtp_connection->client.count_new)
                {
                    /* SMTP客户端接收到新的数据 */
                    hlf = &smtp_connection->client;
                    strcpy(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.saddr))));
                    sprintf(address_string + strlen(address_string), ":%i", ip_and_port.source);
                    strcat(address_string, " <--- ");
                    strcat(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.daddr))));
                    sprintf(address_string + strlen(address_string), ":%i", ip_and_port.dest);
                    strcat(address_string, "\n");
                    printf("--------------------------------\n");
                    printf("%s", address_string);
                    memcpy(content, hlf->data, hlf->count_new);
                    content[hlf->count_new] = '\0';
                    if (strstr(strncpy(status_code, content, 3), "221"))
                        printf("连接中止\n");
                    if (strstr(strncpy(status_code, content, 3), "250"))
                        printf("操作成功\n");
                    if (strstr(strncpy(status_code, content, 3), "220"))
                        printf("表示服务就绪\n");
                    if (strstr(strncpy(status_code, content, 3), "354"))
                        printf("开始邮件输入,以\".\"结束\n");
                    if (strstr(strncpy(status_code, content, 3), "334"))
                        printf("服务器响应验证\n");
                    if (strstr(strncpy(status_code, content, 3), "235"))
                        printf("认证成功可以发送邮件了\n");
                    for (i = 0; i < hlf->count_new; i++)
                    {
                        printf("%s", char_to_ascii(content[i]));
                    }
                    printf("\n");
                }
                else
                {
                    /* SMTP服务器接收到新的数据 */
                    hlf = &smtp_connection->server;
                    strcpy(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.saddr))));
                    sprintf(address_string + strlen(address_string), ":%i", ip_and_port.source);
                    strcat(address_string, " ---> ");
                    strcat(address_string, inet_ntoa(*((struct in_addr*) &(ip_and_port.daddr))));
                    sprintf(address_string + strlen(address_string), ":%i", ip_and_port.dest);
                    strcat(address_string, "\n");
                    printf("--------------------------------\n");
                    printf("%s", address_string);
                    memcpy(content, hlf->data, hlf->count_new);
                    content[hlf->count_new] = '\0';
                    if (strstr(content, "EHLO"))
                        printf("HELLO命令\n");
                    if (strstr(content, "QIUT"))
                        printf("退出连接\n");
                    if (strstr(content, "DATA"))
                        printf("开始传输数据\n");
                    if (strstr(content, "MAIL FROM"))
                        printf("发送方邮件地址为\n");
                    if (strstr(content, "RCPT TO"))
                        printf("接收方邮件地址为\n");
                    if (strstr(content, "AUTH"))
                        printf("请求认证\n");
                    if (strstr(content, "LOGIN"))
                        printf("认证机制为LOGIN\n");
                    for (i = 0; i < hlf->count_new; i++)
                    {
                        printf("%s", char_to_ascii(content[i]));
                    }
                    printf("\n");
                    if (strstr(content,"\n."))
                        printf("数据传输结束\n");
                }
            }
        default:
            break;
    }
    return ;
}
/*
=======================================================================================================================
主函数
=======================================================================================================================
 */
void main()
{
    nids_params.device="eth0";
    struct nids_chksum_ctl temp;
    temp.netaddr = 0;
    temp.mask = 0;
    temp.action = 1;
    nids_register_chksum_ctl(&temp,1);
    if (!nids_init())
     /* Libnids初始化 */
    {
        printf("出现错误:%s\n", nids_errbuf);
        exit(1);
    }
    nids_register_tcp(smtp_protocol_callback);
    /* 注册分析SMTP协议的回调函数 */
    nids_run();
    /* 进入循环捕获数据包的状态 */
}

 

 

  • 10
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: Winmail 4.7是一款非常受欢迎的电子邮件客户端软件,主要用于收发电子邮件和管理邮件。它是为Windows操作系统开发的,并且具有许多强大的功能。 首先,Winmail 4.7具有直观的用户界面,使用户能够轻松地浏览和查看邮件。它支持各种邮件格式,如纯文本、HTML和富文本格式,使用户能够以最适合他们的方式阅读邮件。 其次,Winmail 4.7提供了强大的搜索功能,使用户能够快速找到特定的邮件。用户可以按照发件人、主题、日期等多个条件进行搜索,并且可以保存和管理搜索结果。 另外,Winmail 4.7还支持多账户管理,用户可以同时管理多个电子邮件账户。这让用户能够通过一个应用程序来管理不同的邮件账户,大大提高了工作效率。 除此之外,Winmail 4.7还提供了安全和隐私保护的功能。它支持SSL和TLS加密协议,确保电子邮件的安全传输和保护用户的隐私信息。 总之,Winmail 4.7是一款功能强大、易于使用和安全可靠的电子邮件客户端软件,为用户提供了快速和方便的电子邮件管理体验。无论是在个人使用还是在商业环境中,用户都可以依靠它来处理和管理邮件。 ### 回答2: Winmail 4.7是一款邮件客户端软件,适用于Windows操作系统。它具有一系列功能,可以用于发送、接收和管理电子邮件。Winmail 4.7界面简洁易用,提供了多种邮件管理工具和选项,方便用户进行邮件的组织和筛选。 Winmail 4.7支持多种邮件协议,包括POP3、IMAP和SMTP,可以与各种邮件服务器进行通信,实现邮件的收发功能。用户可以设置多个邮件账户和邮件别名,方便管理个人和工作邮件。 除了基本的邮件收发功能,Winmail 4.7还提供了一些特色功能。其中包括邮件过滤器,可以根据设定的规则自动将邮件分类和处理;自动回复功能,可以自动回复预设的邮件内容,减轻用户的工作负担;邮件搜索功能,可以快速找到需要的邮件;以及邮件加密和数字签名功能,保护邮件的安全性和私密性。 Winmail 4.7还支持附件的发送和接收,用户可以轻松地发送和保存各种文件类型,如文档、图片、音频和视频文件。同时,Winmail 4.7还能够预览常见的附件格式,如文本文件和图像文件,方便用户查看内容。 总之,Winmail 4.7是一款多功能的邮件客户端软件,提供了丰富的邮件管理工具和选项,方便用户进行邮件的收发、组织和筛选。它的简洁易用的界面和特色功能使得用户能够高效地处理和管理电子邮件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PP_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值