Raw Socket(原始套接字)实现Sniffer(嗅探)

一. 摘要  Raw Socket: 原始套接字  可以用它来发送和接收 IP 层以上的原始数据包, 如 ICMP, TCP,     int sockRaw = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);  这样我们就创建了一个 Raw Socket  Sniffer: 嗅探
 
一. 摘要
  Raw Socket: 原始套接字
  可以用它来发送和接收 IP 层以上的原始数据包, 如 ICMP, TCP,
    int sockRaw = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
  这样我们就创建了一个 Raw Socket
  Sniffer: 嗅探器
  关于嗅探器的原理我想大多数人可能都知道
  1. 把网卡置于混杂模式;
  2. 捕获数据包;
  3. 分析数据包.
  但具体的实现知道的人恐怕就不是那么多了. 好, 现在让我们用 Raw Socket 的做一个自已的 Sniffer.
二. 把网卡置于混杂模式
  在正常的情况下,一个网络接口应该只响应两种数据帧:
  一种是与自己硬件地址相匹配的数据帧
国家税务总局公告2017年第45号
  一种是发向所有机器的广播数据帧
  如果要网卡接收所有通过它的数据, 而不管是不是发给它的, 那么必须把网卡置于混杂模式. 也就是说让它的思维混乱, 不按正常的方式工作. 用 Raw Socket 实现代码如下:
    setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag); //设置 IP 头操作选项
    bind(sockRaw, (PSOCKADDR)&addrLocal, sizeof(addrLocal); //把 sockRaw 绑定到本地网卡上 标准球
    ioctlsocket(sockRaw, SIO_RCVALL, &dwValue);      //让 sockRaw 接受所有的数据
  flag 标志是用来设置 IP 头操作的, 也就是说要亲自处理 IP 头: bool flag = ture;
  addrLocal 为本地地址: SOCKADDR_IN addrLocal;
  dwValue 为输入输出参数, 为 1 时执行, 0 时取消: DWORD dwValue = 1;
  没想到这么简单吧?
三. 捕获数据包
  你的 sockRaw 现在已经在工作了, 可以在局域网内其它的电脑上用 Sniffer 检测工具检测一下, 看你的网卡是否处于混杂模式(比如 DigitalBrain 的 ARPKiller).
  不能让他白白的浪费资源啊, 抓包!
    recv(sockRaw, RecvBuf, BUFFER_SIZE, 0); //接受任意数据包
  #define BUFFER_SIZE 65535
  char RecvBuf[BUFFER_SIZE];
  越来越发现 Sniffer 原来如此的简单了, 这么一个函数就已经完成抓取数据包的任务了.
四. 分析数据包
  这回抓来的包和平常用 Socket 接受的包可就不是一回事儿了, 里面包含 IP, TCP 等原始信息. 要分析它首先得知道这些结构.
  数据包的总体结构:
  ----------------------------------------------
  | ip header | tcp header(or x header) | data |
  ----------------------------------------------
  IP header structure:
      4    8    16                    32 bit
  |--------|--------|----------------|--------------------------------|
  | Ver  | IHL  |Type of service |    Total length    |
  |--------|--------|----------------|--------------------------------|
  | Identification |  Flags  |    Fragment offset    |
  |--------|--------|----------------|--------------------------------|
  | Time to live  |  Protocol  |    Header checksum    |
  |--------|--------|----------------|--------------------------------|
  |            Source address              |
  |--------|--------|----------------|--------------------------------|
  |            Destination address            |
  |--------|--------|----------------|--------------------------------|
  |            Option + Padding              |
江南的冬景教案  |--------|--------|----------------|--------------------------------|
  |                Data                |
  |--------|--------|----------------|--------------------------------|
  TCP header structure:
                  16                32 bit
  |--------------------------------|--------------------------------|
  |    Source port      |    Destination port    |
  |--------------------------------|--------------------------------|
  |            Sequence number            |
  |--------------------------------|--------------------------------|
  |          Acknowledgement number          |
  |--------------------------------|--------------------------------|
  | Offset | Resrvd |U|A|P|R|S|F|      Window      |
  |--------------------------------|--------------------------------|
  |      Checksum      |    Urgent pointer    |
  |--------------------------------|--------------------------------|
  |            Option + Padding            |
  |--------------------------------|--------------------------------|
  |              Data                |
  |--------------------------------|--------------------------------|
五. 实现 Sniffer
  OK!
  现在都清楚了, 还等什么.
  下面是我用 BCB6 写的一个 Simple Sniffer 的代码, 仅供参考. 孑孓
  (需要在工程文件里加入WS2_32.LIB这个文件)
//*************************************************************************//
//* CPP File: WMain.cpp
//* Simple Sniffer by shadowstar
//* shadowstar.126/
//*************************************************************************//
#include <vcl.h>
#pragma hdrstop
#include <winsock2.h> 冲走小老鼠
#include <ws2tcpip.h>
#include <mstcpip.h>
#include <netmon.h>
#include "WMain.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)

本文发布于:2024-09-21 22:14:45,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/233485.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据包   数据   网卡   模式   知道
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议