NT下的SNIFFER

include <winsock2.h>
#include <ws2tcpip.h> //用于IP_HDRINCL标记
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
#define BUFFER_SIZE 65535

typedef struct _TCP{ WORD SrcPort; // 源端口
WORD DstPort; // 目的端口
DWORD SeqNum; // 顺序号
DWORD AckNum; // 确认号
BYTE DataOff; // TCP头长
BYTE Flags; // 标志(URG、ACK等)
WORD Window; // 窗口大小
WORD Chksum; // 校验和
WORD UrgPtr; // 紧急指针
} TCP;
typedef TCP *LPTCP;
typedef TCP UNALIGNED * ULPTCP;
typedef struct _IP{
union{ BYTE Version; // 版本
BYTE HdrLen; // IHL
};
BYTE ServiceType; // 服务类型
WORD TotalLen; // 总长
WORD ID; // 标识
union{ WORD Flags; // 标志
WORD FragOff; // 分段偏移
};
BYTE TimeToLive; // 生命期
BYTE Protocol; // 协议
WORD HdrChksum; // 头校验和
DWORD SrcAddr; // 源地址
DWORD DstAddr; // 目的地址
BYTE Options; // 选项
} IP;
typedef IP * LPIP;
typedef IP UNALIGNED * ULPIP;
#define PROTOCOL_STRING_ICMP_TXT "ICMP"
#define PROTOCOL_STRING_TCP_TXT "TCP"
#define PROTOCOL_STRING_UDP_TXT "UDP"
#define PROTOCOL_STRING_SPX_TXT "SPX"
#define PROTOCOL_STRING_NCP_TXT "NCP"
#define PROTOCOL_STRING_UNKNOW_TXT "UNKNOW"

一个辅助函数,得到每一种协议的名字:

CString CABCDlg::GetProtocolTxt(int Protocol)
{
    switch (Protocol){
           case IPPROTO_ICMP : //1 /* control message protocol */
                return PROTOCOL_STRING_ICMP_TXT;
           case IPPROTO_TCP : //6 /* tcp */
                return PROTOCOL_STRING_TCP_TXT;
           case IPPROTO_UDP : //17 /* user datagram protocol */
                return PROTOCOL_STRING_UDP_TXT;
           default:
                return PROTOCOL_STRING_UNKNOW_TXT;

   }
}

监听的函数及过程:

void CABCDlg::OnButton1()
{
 // 检查 Winsock 版本号,WSAData为WSADATA结构对象
 WSADATA WSAData;
 WSAStartup(MAKEWORD(2, 2), &WSAData);
 // 创建原始套接字
 //SOCKET sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
 SOCKET sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP);//第三个参数必须设置成IPPROTO_IP
 // 设置IP头操作选项,其中flag 设置为ture,亲自对IP头进行处理
 bool flag = true;
 setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag));
 // 获取本机名
 char LocalName[50];
 gethostname((char*)LocalName, sizeof(LocalName)-1);
 // 获取本地 IP 地址
 hostent* pHost = gethostbyname((char*)LocalName);
 // 填充SOCKADDR_IN结构
 sockaddr_in addr_in;
 addr_in.sin_addr = *(in_addr *)pHost->h_addr_list[0]; //IP
 addr_in.sin_family = AF_INET;
 addr_in.sin_port = htons(57274);
 // 把原始套接字sock 绑定到本地网卡地址上
 bind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in));
 // dwValue为输入输出参数,为1时执行,0时取消
 DWORD dwValue = 1;
 // 设置 SOCK_RAW 为SIO_RCVALL,以便接收所有的IP包。其中SIO_RCVALL
 // 的定义为: #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
 ioctlsocket(sock, SIO_RCVALL, &dwValue);
 char RecvBuf[65535]={'0'};
 while (true)
 {
  // 接收原始数据包信息
  int ret = recv(sock, RecvBuf, BUFFER_SIZE, 0);
  if (ret > 0)
  {
   // 对数据包进行分析,并输出分析结果
   IP ip;
   TCP tcp;
   ip = *(IP*)RecvBuf;
   tcp = *(TCP*)(RecvBuf + ip.HdrLen);
   CString a;
   a.Format("协议:%s",GetProtocolTxt(ip.Protocol));
   AfxMessageBox(a);
   m_list.InsertString(-1,a);
   a.Format("IP源地址:%s",inet_ntoa(*(in_addr*)&ip.SrcAddr));
   AfxMessageBox(a);
   m_list.InsertString(-1,a);
   a.Format("IP目标地址:%s",inet_ntoa(*(in_addr*)&ip.DstAddr));
   AfxMessageBox(a);
   m_list.InsertString(-1,a);
   a.Format("源端口号:%d",tcp.SrcPort);
   AfxMessageBox(a);
   m_list.InsertString(-1,a);
   a.Format("目标端口号:%d",tcp.DstPort);
   AfxMessageBox(a);
   m_list.InsertString(-1,a);
   a.Format("数据包长度:%d",ntohs(ip.TotalLen));
    AfxMessageBox(a);
   m_list.InsertString(-1,a);   
  }
 }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
P2P文件共享 前面有人文嗅探器的问题,我在这里做个详细的解释: 嗅探器(snifffer)就是能够捕获网络报文的设备。嗅探器的正当用处在于分析网络的流量,以便找出所关心的网络中潜在的问题。例如,假设网络的某一段运行得不是很好,报文的发送比较慢,而我们又不知道问题出在什么地方,此时就可以用嗅探器来作出精确的问题判断。 嗅探器在功能和设计方面有很多不同。有些只能分析一种协议,而另一些可能能够分析几百种协议。一般情况下,大多数的嗅探器至少能够分析下面的协议: ■标准以太网 ■TCP/IP ■IPX ■DECNet 嗅探器通常是软硬件的结合。专用的嗅探器价格非常昂贵。另一方面,免费的嗅探器虽然不需要花什么钱,但得不到什么支持。 嗅探器与一般的键盘捕获程序不同。键盘捕获程序捕获在终端上输入的键值,而嗅探器则捕获真实的网络报文。嗅探器通过将其置身于网络接口来达到这个目的——例如将以太网卡设置成杂收模式。(为了理解杂收模式是怎么回事,先解释局域网是怎么工作的)。 数据在网络上是以很小的称为帧(Ftame)的单位传输的帧由好几部分组成,不同的部分执行不同的功能。(例如,以太网的前12个字节存放的是源和目的的地址,这些位告诉网络:数据的来源和去处。以太网帧的其他部分存放实际的用户数据、TCP/IP的报文头或IPX报文头等等)。 帧通过特定的称为网络驱动程序的软件进行成型,然后通过网卡发送到网线上。通过网线到达它们的目的机器,在目的机器的一端执行相反的过程。接收端机器的以太网卡捕获到这些帧,并告诉操作系统帧的到达,然后对其进行存储。就是在这个传输和接收的过程中,嗅探器会造成安全方面的问题。 每一个在LAN上的工作站都有其硬件地址。这些地址唯一地表示着网络上的机器(这一点于Internet地址系统比较相似)。当用户发送一个报文时,这些报文就会发送到LAN上所有可用的机器。 在一般情况下,网络上所有的机器都可以“听”到通过的流量,但对不属于自己的报文则不予响应(换句话说,工作站A不会捕获属于工作站B的数据,而是简单的忽略这些数据)。 如果某在工作站的网络接口处于杂收模式,那么它就可以捕获网络上所有的报文和帧,如果一个工作站被配置成这样的方式,它(包括其软件)就是一个嗅探器。 嗅探器可能造成的危害: ■嗅探器能够捕获口令 ■能够捕获专用的或者机密的信息 ■可以用来危害网络邻居的安全,或者用来获取更高级别的访问权限 事实上,如果你在网络上存在非授权的嗅探器就以为着你的系统已经暴露在别人面前了。(大家可以试试天行2的嗅探功能) 一般我们只嗅探每个报文的前200到300个字节。用户名和口令都包含在这一部分中,这是我们关心的真正部分。工人,也可以嗅探给定接口上的所有报文,如果有足够的空间进行存储,有足够的那里进行处理的话,将会发现另一些非常有趣的东西…… 简单的放置一个嗅探器宾将其放到随便什么地方将不会起到什么作用。将嗅探器放置于被攻击机器或网络附近,这样将捕获到很多口令,还有一个比较好的方法就是放在网关上。如果这样的话就能捕获网络和其他网络进行身份鉴别的过程。这样的方式将成倍地增加我们能够攻击的范围。 关于怎么抵御嗅探器的攻击我就不说了,那是网管们的事儿,有三种方法可能会有所作用: ■检测和消灭嗅探器 ■将数据隐藏,使嗅探器无法发现。 ■会话加密

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值