ec_dissector_smb.c
上传用户:nilegod
上传日期:2007-01-08
资源大小:220k
文件大小:4k
源码类别:

网络截获/分析

开发平台:

C/C++

  1. /*
  2.     ettercap -- dissector SMB (Server Message Block)
  3.     Copyright (C) 2001  ALoR <alor@users.sourceforge.net>, NaGA <crwm@freemail.it>
  4.     This program is free software; you can redistribute it and/or modify
  5.     it under the terms of the GNU General Public License as published by
  6.     the Free Software Foundation; either version 2 of the License, or
  7.     (at your option) any later version.
  8.     This program is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.     GNU General Public License for more details.
  12.     You should have received a copy of the GNU General Public License
  13.     along with this program; if not, write to the Free Software
  14.     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  15. */
  16. #include "include/ec_main.h"
  17. #include <string.h>
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include <errno.h>
  21. #include "include/ec_dissector.h"
  22. #include "include/ec_inet_structures.h"
  23. #include "include/ec_error.h"
  24. #ifdef DEBUG
  25.    #include "include/ec_debug.h"
  26. #endif
  27. typedef struct {
  28.    u_char  proto[4];
  29.    u_char  cmd;
  30.    u_char  err[4];
  31.    u_char  flags1;
  32.    u_short flags2;
  33.    u_short pad[6];
  34.    u_short tid, pid, uid, mid;
  35. } SMB_header;
  36. typedef struct {
  37.    u_char  mesg;
  38.    u_char  flags;
  39.    u_short len;
  40. } NetBIOS_header;
  41. // protos
  42. FUNC_DISSECTOR(Dissector_smb);
  43. // --------------------
  44. FUNC_DISSECTOR(Dissector_smb)
  45. {
  46.    TCP_header *tcp;
  47.    u_char *payload;
  48.    SMB_header *smb;
  49.    NetBIOS_header *NetBIOS;
  50.    u_char *ptr;
  51.    
  52.    ONLY_CONNECTION;
  53.    
  54.    tcp = (TCP_header *) data;
  55.    if (ntohs(tcp->source) == 139) return 0;            // skip server messages...
  56.    payload = (char *)((int)tcp + tcp->doff * 4);
  57.    NetBIOS = (NetBIOS_header *)payload;
  58.    smb = (SMB_header *)(NetBIOS + 1);
  59.    if (memcmp(smb->proto, "xffSMB", 4) != 0 || smb->cmd != 0x73) return 0;  // it isn't SMBsesssetupX
  60.    ptr = (u_char *)(smb + 1);
  61.    if ( *ptr == 13 )
  62.    {
  63.       short pwlen, unilen;
  64.       char pass[25];
  65.       char *user;
  66.       char *domain;
  67.       ptr += 15;
  68.       pwlen = ptohs(ptr);        // ANSI password len
  69.       ptr += 2;
  70.       unilen = ptohs(ptr);       // UNICODE password len
  71.       #ifdef DEBUG
  72.          Debug_msg("tDissector_SMB NT LM 0.12 LEN [%d]-[%d]", pwlen, unilen);
  73.       #endif
  74.       if (pwlen > 0)
  75.       {
  76.          strncpy(pass, ptr + 12, 25);
  77.          strcat(data_to_ettercap->pass, pass);
  78.          strcat(data_to_ettercap->pass, "n");  // don't forget it !!   datadecode needs it !!
  79.       }
  80.       user = ptr + 12 + pwlen + unilen;
  81.       snprintf(data_to_ettercap->user, 25, "%sn", user);
  82. domain = user + strlen(user)+1;
  83. snprintf(data_to_ettercap->info, 100, "DOMAIN: %s  OS: %sn", domain, domain+strlen(domain)+1);
  84.       #ifdef DEBUG
  85.          Debug_msg("tDissector_SMB NT LM 0.12 USER & PASS");
  86.       #endif
  87.    }
  88.    else if ( *ptr == 10 )
  89.    {
  90.       int pwlen;
  91.       char pass[25];
  92.       char *user;
  93.       char *domain;
  94.       ptr += 15;
  95.       pwlen = ptohs(ptr);     // ANSI password len
  96.       ptr += 2;
  97.       if (pwlen > 0)
  98.       {
  99.          strncpy(pass, ptr + 6, 25);
  100.          strcat(data_to_ettercap->pass, pass);
  101.          strcat(data_to_ettercap->pass, "n");  // don't forget it !!   datadecode needs it !!
  102.       }
  103.       user = ptr + 6 + pwlen;
  104.       snprintf(data_to_ettercap->user, 25, "%sn", user);
  105. domain = user + strlen(user)+1;
  106. snprintf(data_to_ettercap->info, 100, "DOMAIN: %s  OS: %sn", domain, domain+strlen(domain)+1);
  107.       #ifdef DEBUG
  108.          Debug_msg("tDissector_SMB pre NT LM 0.12 USER & PASS");
  109.       #endif
  110.    }
  111.    return 0;
  112. }
  113. /* EOF */