jeromewen

努力中
随笔 - 9, 文章 - 0, 评论 - 22, 引用 - 0
数据加载中……

POP(110)监控

#include "nids.h"
#include <cstdio>
#pragma comment(lib,"ws2_32")
#pragma comment(lib,"wpcap")
#pragma comment(lib,"libnids")
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 == '\n' || ch == '\r')
 {
  *string++ =ch;
 }
 else
 {
  *string++ = '.';
 }
 *string  = 0;
 return ascii_string;
}

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_connection->client.collect++;
  pop3_connection->client.collect_urg++;
  pop3_connection->server.collect++;
  pop3_connection->server.collect_urg++;
  printf("%sPOP3客户端和服务端建立连接\n", address_string);
  }
  return;
 case NIDS_CLOSE:
  printf("---------------------------------------\n");
  printf("%sPOP3客户端和服务端正常关闭\n", address_string);
  return;
 case NIDS_RESET:
  printf("---------------------------------------\n");
  printf("%sPOP3客户端和服务端被RST关闭\n", address_string);
  return;
 case NIDS_DATA:
  {
   char status_code[5];
   struct half_stream* hlf;
   if(pop3_connection->server.count_new_urg)
   {
    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)
   {
    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)
   {
    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
   {
    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 ;
}
int main(int argc, char **argv)
{
 if(!nids_init())
 {
  printf("出现错误: %s\n", nids_errbuf);
  exit(1);
 }

 nids_register_tcp(pop3_protocol_callback);
 nids_run();
 return 0;
}

posted on 2006-09-29 13:07 JeromeWen 阅读(721) 评论(9)  编辑 收藏 引用 所属分类: C++

评论

# re: POP(110)监控  回复  更多评论   

ka看不懂
2006-09-29 17:11 | 搞活

# re: POP(110)监控  回复  更多评论   

请问JeromeWen,我也在windows平台下(我的是windows xp sp2 winpcap 3.1)做过用nids监视tcp连接的东西,编译没有任何问题,但是就是没有输出,得不到任何结果,明明有网络连接却监视不到,不知道怎么回事,您的例子也在我的机器上也是这样,望指点.
2006-10-14 15:10 | aganno2

# re: POP(110)监控  回复  更多评论   

我这里很正常
2006-11-18 00:59 | j

# re: POP(110)监控  回复  更多评论   

在XP下,本地机器上可以抓取110端口的POP包,
查看POP包的内容,
内容符合个人设置策略限制,如:不让来信人用户名以H开头的邮件通过

未曾限制的邮件可以通过,从而进入Foxmail的收件箱

劳驾回复,我的信箱,不胜感激~~!!
hanxuexiang2006@yahoo.com.cn
2007-03-06 22:16 | 韩学祥

# re: POP(110)监控[未登录]  回复  更多评论   

邮件内容是根据base64加密的.你可以解密后,限定内容等.邮件头中是有发现人信息的,你解析后过滤就行了.我没有做过这个测试.
2007-03-07 02:29 | jeromewen

# re: POP(110)监控  回复  更多评论   

劳驾你:可以对POP(110)监控多加一些注解吗?我是初学者
2007-03-07 10:42 | 韩言

# re: POP(110)监控  回复  更多评论   

请看nids注释,或者下载libnids的例子看看.
2007-03-08 09:22 | JeromeWen

# re: POP(110)监控  回复  更多评论   

请问:POP(110)监控----是在收信方收到邮件之前:先截获此邮件的pop3数据包,获取pop3包中的用户名和密码,直接删除我想删除的某一个用户名的邮件 ,只有我没有删除的邮件,才能被收信方收到;
我想pop(110)监控:在WINDOWS下能做到我认为的上述功能,你可以帮忙代码实现一下么----基于对话框?
2007-03-17 11:19 | 文科

# re: POP(110)监控  回复  更多评论   

请问:POP(110)监控----是在收信方收到邮件之前:先截获此邮件的pop3数据包,获取pop3包中的用户名和密码,直接删除我想删除的某一个用户名的邮件 ,只有我没有删除的邮件,才能被收信方收到;
我想pop(110)监控:在WINDOWS下---针对Foxmail能做到我认为的上述功能,你可以帮忙代码实现一下么----基于对话框?
2007-03-17 11:29 | 文科

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理