Linux网络抓包

news/2024/5/18 11:52:45 标签: linux, udp, tcp/ip

Linux网络抓包

  • 一、以太网帧格式
  • 二、IP报文格式
  • 三、代码实现
  • 四、总结


一、以太网帧格式

以太网帧格式

以太网帧以7字节前导码和1字节帧开始符开头(物理层),紧跟源地址和目的地址(MAC层)。
IP数据包在DATA字段中,数据段最小为46字节。


二、IP报文格式

IP数据报文
IP包的源IP地址和目的IP地址从格式中看出分别从第12字节、第16字节开始(序号从0字节数起)。


三、代码实现

#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <linux/if_ether.h>

typedef unsigned char uchar;

#define BUF_SIZE 2048
#define MIN_ETH_PAYLOAD 46
#define MAC_ADDR_OFFSET (6+6+2)

int main()
{
    int len = 0;
    uchar buff[BUF_SIZE] = {0};

    //AF_PACKET     /* Packet family.  */
    //SOCK_RAW      /* Raw protocol interface.  */
    //ETH_P_ALL     /* Every packet (be careful!!!) */
    int sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
    if(sock < 0)
    {
        printf("create socket failed!");
        return -1;
    }

    while (true)
    {
        len = recvfrom(sock, buff, BUF_SIZE, 0, NULL, NULL);
        if(len < MIN_ETH_PAYLOAD)
        {
            printf("catch invalid data!");
            return -1;
        }

        //打印MAC信息
        printf("Source MAC %X:%X:%X:%X:%X:%X",
               (uchar)buff[6], (uchar)buff[7], (uchar)buff[8], 
               (uchar)buff[9], (uchar)buff[10], (uchar)buff[11]);
        printf("  ---> Dest MAC %X:%X:%X:%X:%X:%X\n",
               (uchar)buff[0], (uchar)buff[1], (uchar)buff[2], 
               (uchar)buff[3], (uchar)buff[4], (uchar)buff[5]);

        //打印IP信息
        printf("Source IP  %d.%d.%d.%d",
               (uchar)buff[MAC_ADDR_OFFSET + 12], (uchar)buff[MAC_ADDR_OFFSET + 13],
               (uchar)buff[MAC_ADDR_OFFSET + 14], (uchar)buff[MAC_ADDR_OFFSET + 15]);
        printf("  ---> Dest IP  %d.%d.%d.%d\n",
               (uchar)buff[MAC_ADDR_OFFSET + 16], (uchar)buff[MAC_ADDR_OFFSET + 17],
               (uchar)buff[MAC_ADDR_OFFSET + 18], (uchar)buff[MAC_ADDR_OFFSET + 19]);
    }

    return 0;
}

四、总结

抓包的方法简洁有效,相对的我们需要了解以太网帧和IP包的格式,才能知道数据包字段值的意义。
值得注意的是,不同版本的协议格式略有不同。


http://www.niftyadmin.cn/n/1515291.html

相关文章

canonical raft源码编译

canonical raft源码编译一、下载源码二、安装环境三、编译四、问题报错五、总结一、下载源码 https://codeload.github.com/canonical/raft/tar.gz/refs/tags/v0.11.2二、安装环境 sudo apt-get install automake sudo apt-get install libtool三、编译 autoreconf -i ./con…

awk读取ini配置文件

awk读取ini配置文件一、awk基础二、读取ini1. net.ini文件2. 打印三、读取特定Section的Key的值1. 设置特定值2. 查找匹配项四、总结一、awk基础 -F #指定分割符 print #打印 $0 #表示整个当前行 $1 #每行第一个字段 (ini分隔符前的key) $2 #每行第二个字段 (ini分隔符前…

msgpack c++的使用

msgpack C的使用一、MessagePack 是什么二、msgpack的使用三、总结一、MessagePack 是什么 MessagePack 是一种高效的二进制序列化格式。 二、msgpack的使用 #include <vector> #include <string> #include <iostream> #include <msgpack.hpp>//定义…

重启测试 - 检测日志

重启测试 - 检测日志一、背景二、Bash Script三、总结一、背景 检测log的关键字&#xff0c;判断程序是否异常。 正常情况下继续重启&#xff0c;异常情况停止脚本。 二、Bash Script #!/bin/bash echo "start" cd /appPath i0 while [ $i -lt 1 ]; docat /appLog…

编写top脚本kill掉占用CPU过高的进程

编写top脚本kill掉占用CPU过高的进程一、命令二、shell脚本三、总结一、命令 top -b 批处理模式&#xff0c;适合文本处理 -c 命令行&#xff0c;显示完整命令和程序名 -n 迭代次数&#xff0c;即捕获刷新次数 -o 指定排序的列&#xff0c;或-表示降序或升序 -p 指定进程ID gr…

C++ 浮点数的大小比较

C 浮点数的大小比较一、C的精度损失二、浮点数比较三、总结一、C的精度损失 浮点数的存储格式&#xff1a; 符号位指数位尾数位sign bitExponentMantissa 浮点数分为单精度float和双精度double&#xff0c;32位和644位系统存储位数略有不同。 相对于二进制存储小数&#xff…

C# 利用反射实现消息转发处理

C# 利用反射实现消息转发处理一、C# 反射二、代码三、总结一、C# 反射 利用C#反射的特点&#xff0c;我们可以实现函数名来动态调用函数。 通过拼接字符串达到消息处理的效果&#xff0c;配合xml可以实现流程可配置化。 二、代码 以下是一个简单的示例&#xff1a; using S…

C++ bitset的用法实例

C bitset的用法实例一、bitset二、代码三、总结一、bitset 顾名思义&#xff0c;bitset是位bit的set集合&#xff0c;是可以当做容器使用的一种数据结构。 bitset提供了一些很实用的方法&#xff0c;能用来替代C语言的直接按位运算带来的不便。 二、代码 #include <iostr…