`
memorymyann
  • 浏览: 270677 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

28.sniffer程序2

阅读更多

对前面27中sniffer中的一个改进。这里只贴出改动地方的代码。

void get_packet(u_char * args, const pcap_pkthdr * header, const u_char * packet){
        char from_ip[24], to_ip[24];
        const struct sniffer_ethernet * ethernet = (struct sniffer_ethernet *) packet;

//packet记载了包的内容,因为是从数据链路层开始抓取,第一头部当然是以太网(当然不是绝对,但大部分局域网是以太网,如果是其它网络,就 用对应的数据结构

//前面我设置的端口是常用的WEB端口80,WEB协议是HTTP,下一层则是TCP,TCP又是构建在IP基础之上,所以这里包的分层解析就很 清楚了
        const struct ip * ip_header = (struct ip *)(packet + SIZE_ETHERNET);

//越过以太网头部,获取IP头部,struct ip是linux中对IP头部的一个数据结构,如果是windows机器,就请使用对应的数据结构

        const struct tcphdr * tcp_header = (struct tcphdr *)(packet + SIZE_ETHERNET + sizeof(struct ip));
//越过以太网和IP头部,获取TCP头部指针,同样道理struct tcphdr是linux下的tcp描述结构,如果是windows机器,换成对应的数据结构
        inet_ntop(AF_INET, &ip_header->ip_src, from_ip, sizeof(from_ip));
        inet_ntop(AF_INET, &ip_header->ip_dst, to_ip, sizeof(to_ip));

//从ip头部获取目的IP地址和源IP地址

        printf("from %s:%d to %s:%d, ip packet len = %d\n", from_ip, ntohs(tcp_header->source), to_ip, ntohs(tcp_header->dest), ip_header->ip_len);

//从TCP头部可以获取目的端口和源端口


        printf("tcp syn = %d, ack = %d\n", tcp_header->syn, tcp_header->ack);

        char * content = (char *)(packet + SIZE_ETHERNET + sizeof(struct ip) + sizeof(struct tcphdr));

//这里就是TCP包所承载的内容所在,80号端口自然是HTTP内容,这里还包括HTTP头部,但HTTP是应用层协议,linux内核中集成了 TCP和UDP协议,并没有关于HTTP描述。不过HTTP比较简单,之后的运行结果可以看到HTTP内容


        string content_str(content);
        int loc = content_str.find("HTTP", 0);
        if(loc != string::npos) { //这个判断后面运行结果会提到
                cout << content_str << endl;
        }
}

 

改动后

void get_packet(u_char * args, const pcap_pkthdr * header, const u_char * packet){
        char from_ip[24], to_ip[24];
        const struct sniffer_ethernet * ethernet = (struct sniffer_ethernet *) packet;
        const struct ip * ip_header = (struct ip *)(packet + SIZE_ETHERNET);
        const struct tcphdr * tcp_header = (struct tcphdr *)(packet + SIZE_ETHERNET + sizeof(struct ip));

        inet_ntop(AF_INET, &ip_header->ip_src, from_ip, sizeof(from_ip));
        inet_ntop(AF_INET, &ip_header->ip_dst, to_ip, sizeof(to_ip));

        printf("from %s:%d to %s:%d, ip packet len = %d, ip head len = %d\n", from_ip, ntohs(tcp_header->source), to_ip, ntohs(tcp_header->dest), ntohs(ip_header->ip_len), ip_header->ip_hl * 4);
        printf("tcp syn = %d, ack = %d, fin = %d, seq = %d, len = %d\n", tcp_header->syn, tcp_header->ack, tcp_header->fin, ntohl(tcp_header->seq), tcp_header->doff * 4);

//一般情况下tcp头部和ip头部的长度都是20个字节,但他们都是可以增加的,因此之前获取TCP承载的数据的头不指针的办法char * content = (char *)(packet + SIZE_ETHERNET + sizeof(struct ip) + sizeof(struct tcphdr));所获取的位置不一定正确,ip头长度记录在ip_hl中,tcp头部长度记录在doff中,至于×4的原因,因为TCP和IP头部都是以4字节为基本单位来增长。

//至于判断,ip_len记录了IP包总长度,如果TCP和IP实际长度之和等于IP包总长,则说明IP包没有承载数据,(比如三路握手的起始的3个包就是不带数据的),如果大于则说明有数据,一般情况下不可能出现小于的情况。
        if(ntohs(ip_header->ip_len) == ip_header->ip_hl * 4 + tcp_header->doff * 4) {
                printf("no data\n");
        } else {
        char * content = (char *)(packet + SIZE_ETHERNET + ip_header->ip_hl * 4 + tcp_header->doff * 4);

// +的意思是向后移动

//承载的数据起始指针,应该就是头指针+以太网包头长度+ip包头长度+tcp包头长度,依次类推UDP换成UDP即可,关键是弄清楚协议所在的层次,和所使用的协议
        printf("data = %s\n", content);
    }   
}

 

分享到:
评论

相关推荐

    简单的sniffer程序

    【简单的Sniffer程序】是一种用于网络数据包捕获的基础工具,它可以帮助我们了解网络通信的细节,对于学习网络安全和网络编程具有重要的实践意义。在网络安全领域,嗅探器(Sniffer)是一种网络分析工具,它可以捕获...

    sniffer 程序

    《深入理解Sniffer程序:揭示网络通信的奥秘》 在计算机网络的世界里,Sniffer程序扮演着一个至关重要的角色,它是一种能够捕获网络上数据包的工具,用于监控和分析网络通信。本文将围绕“Sniffer程序”这一主题,...

    Sniffer_XE10.3版.rar

    2. UnitSniffer.dcu - 这是Delphi的编译单元文件,包含了Sniffer组件的具体实现代码。 3. UnitWorkThread.dcu - 同样是编译单元文件,可能涉及到了工作线程的实现,用于在网络数据捕获时的多线程处理。 4. ...

    简单的sniffer小程序

    用mfc编写的的sniffer小程序,可以实现简单ip地址、类型、端口等数据的收集分析,算是网络编程的一个小实验

    基于winpcap的sniffer程序

    基于winpcap的sniffer程序 基于winpcap的sniffer程序 基于winpcap的sniffer程序 基于winpcap的sniffer程序 基于winpcap的sniffer程序

    一个VC++的Sniffer程序

    【标题】"一个VC++的Sniffer程序"指的是使用Microsoft Visual C++(VC++)编写的网络嗅探器。在计算机网络中,嗅探器是一种工具,它能够捕获网络上的数据包,以便进行网络诊断、性能分析或安全审计。 【描述】中...

    sniffer程序分析与设计 实验报告

    2. **Sniffer程序**:嗅探器或sniffer是一种网络监控工具,用于捕获网络上的数据包。它们通常工作在混杂模式(Promiscuous Mode),在这种模式下,网络接口卡可以接收所有通过其连接的网络流量,而不只是那些发送给...

    网络编程sniffer源程序

    在这个项目中,我们将会修改一个现有的Sniffer源程序,以便它能显示捕获到的数据包的关键信息,如协议类型、源IP地址、目的IP地址、源端口和目的端口。 首先,我们需要了解网络数据包的基本结构。在TCP/IP协议栈中...

    sniffer程序源码(MFC)

    "sniffer程序源码(MFC)" 指的是一款使用Microsoft Foundation Class (MFC) 库开发的网络嗅探器(sniffer)的源代码。MFC是微软为Windows应用程序开发提供的一套C++类库,它基于面向对象的编程思想,简化了Win32 ...

    VC源码sniffer

    源码分析是指对程序的源代码进行检查和评估,以找出潜在的问题,如性能瓶颈、错误或不规范的编程习惯。这对于软件维护、优化和质量保证至关重要。VC源码sniffer就是这样一个工具,它能够解析C++源代码,并提供有关...

    Sniffer POP3 Visual C++

    2. Sniffer_POP3.clw是类视图窗口文件,用于管理类和成员信息。 3. Sniffer_POP3Dlg.cpp和Sniffer_POP3.cpp是源代码文件,分别包含了主对话框类和应用程序类的实现。 4. StdAfx.cpp包含预编译头文件,提高编译效率。...

    Winsock 本地抓包Sniffer程序源码

    【Winsock 本地抓包Sniffer程序源码】是一个基于Delphi编程语言并利用Winsock API实现的简单网络监听工具。这个程序的核心功能是通过设置网卡为混杂模式,来捕获并分析本地网络中的所有数据包。下面将详细阐述相关...

    一个用VC实现的经典sniffer程序

    《VC实现的经典Sniffer程序详解》 Sniffer,也称为网络嗅探器,是一种在网络监控中广泛使用的工具,用于捕获并分析网络上的数据包。本文将深入探讨一个使用Visual C++(VC)开发的经典Sniffer程序,它虽功能简单,...

    WIN7旗舰版SNIFFER.PORTABLE.V4.7.5SP5安装过程

    4. **下载SNIFFER.PORTABLE.V4.7.5SP5安装包:**访问官方网站或其他可信渠道下载最新版本的SNIFFER.PORTABLE.V4.7.5SP5安装程序,并将其保存到本地硬盘上。 5. **检查Java环境:**SNIFFER.PORTABLE.V4.7.5SP5的运行...

    一个简单的sniffer从程序

    标题 "一个简单的sniffer程序" 暗示我们即将探讨的是网络嗅探工具,也称为网络包分析器。网络嗅探器(Sniffer)是一种软件工具,它允许用户捕获和查看通过网络传输的数据包。这些工具对于网络管理员、安全专家和开发...

    sniffer源程序

    Sniffer源程序是一种网络分析工具,它主要用于监测和分析网络数据包。在IT领域,了解和使用Sniffer类工具是网络管理员、安全专家以及软件开发者的重要技能之一。Sniffer能够捕获并解码网络上的传输数据,这对于故障...

    用RawSocket实现的Sniffer的C++Builder源程序

    2. `WMain.cpp`:这可能包含主窗口或应用程序的主要控制逻辑,通常有`WinMain`函数,是程序的入口点。 3. `sniffer.cpp`:此文件很可能包含了嗅探器的主要功能实现,如创建Raw Socket,监听网络流量,解析和显示...

    原始套接字Sniffer程序

    基于原始套接字编写的Sniffer程序。

Global site tag (gtag.js) - Google Analytics