(转)手把手教你捕获数据包(下)【数据包的游戏系列之二】

news/2024/4/16 1:16:43

B. 打开相应网卡并设置为混杂模式:

   在此之前肯定要有一段让用户选择网卡、并获得用户选择的网卡的名字的代码,既然上面已经可以获得所有网卡的名字了,这段代码就暂且略过了。

   我们主要是要用到 pcap_open_live 函数,不过这个函数 winpcap 的开发小组已经建议用 pcap_open 函数来代替,不过因为我的代码里面用的就是 pcap_open_live ,所以也不便于修改了,不过 pcap_open_live 使用起来也是没有任何问题的,下面是 pcap_open_live 的函数声明:

 /*************************************************

pcap_t* pcap_open_live  (  char *    device, 

                              int    snaplen, 

  int    promisc, 

  int    to_ms, 

  char *    ebuf

 )  

     功能:

           根据网卡名字打开网卡,并设置为混杂模式,然后返回其句柄

     参数:

           Device  : 就是前前面我们获得的网卡的名字;

           Snaplen :  我们从每个数据包里取得数据的长度,比如设置为 100 ,则每次我们只是获得每个数据包 100 个长度的数据,没有什么特殊需求的话就把它设置为 65535 最大值就可以了;

           Promisc :这个参数就是设置是否把网卡设置为“混杂模式”,设置为 1 即可;

           to_ms :   超时时间,毫秒,一般设置为 1000 即可。

     返回值:

           pcap_t :  类似于一个网卡“句柄”之类的,不过当然不是,这个参数是后面截获数据要用到的。

******************************************************************************/

虽然看起来比较复杂,不过用起来还是非常简单的,其实 1 行就 OK 了:

     pcap_t* adhandle;

       char errbuf[PCAP_ERRBUF_SIZE];

// 打开网卡,并且设置为混杂模式

// pCardName 是前面传来的网卡名字参数

adhandle = pcap_open_live(pCardName,65535,1,1000,errbuf);

C. 截获数据包并保存为文件: ------------------------------------------------------

     当然,不把数据包保存为文件也可以,不过如果不保存的话,只能在截获到数据包的那一瞬间进行分析,转眼就没了 ^_^

所以,为了便于日后分析,所以高手以及我个人经常是把数据包保存下来的慢慢分析的。

但是注意网络流量,在流量非常大的时候注意硬盘空间呵呵,常常几秒中就有好几兆是很正常的事情。

下面首先来详细讲解一下,这个步骤中需要用到的 winpcap 函数:

/**************************************************************

pcap_dumper_t* pcap_dump_open  (  pcap_t *    p, 

                                       const char *    fname

 )

功能:

      建立或者打开存储数据包内容的文件 , 并返回其句柄

参数:

       pcap_t *    p     :前面打开的网卡句柄;

      const char * fname :要保存的文件名字    

返回值:

       pcap_dumper_t* 保存文件的描述句柄,具体细节我们不用关心

***************************************************************/

/***************************************************************

int pcap_next_ex          (  pcap_t *    p, 

                               struct pcap_pkthdr **    pkt_header, 

  u_char **    pkt_data

 )  

功能:

      从网卡或者数据包文件中读取数据内容

参数:

      pcap_t *    p:    网卡句柄

      struct pcap_pkthdr ** pkt_header: 并非是数据包的指针,只是与数据包捕获驱动有关的一个 Header

      u_char ** pkt_data :指向数据包内容的指针 ,包括了协议头   

返回值:

           1 : 如果成功读取数据包

          0 pcap_open_live() 设定的超时时间之内没有读取到内容

          -1: 出现错误

          -2: 读文件时读到了末尾

***************************************************************/

/***************************************************************

void pcap_dump  (  u_char *    user, 

                       const struct pcap_pkthdr *    h, 

  const u_char *    sp

 )   

功能:

      将数据包内容依次写入 pcap_dump_open ()指定的文件中

参数:

      u_char * user   :  网卡句柄

      const struct pcap_pkthdr * h: 并非是数据包的指针,只是与数据包捕获驱动有关的一个 Header

       const u_char * sp 数据包内容指针    

返回值:

          Void

****************************************************************/

  下面给出一段完整的捕获数据包的代码,是在线程中写的,为了程序清晰,我去掉了错误处理代码以及线程退出的代码,完整代码可下载文后的示例源码,老规矩,重要的步骤用粗体字标出。

我们实际在捕获数据包的时候也最好是把代码放到另外的线程中。

/*********************************************************

*   进程 :

*                   这个是程序的核心部分,完成数据包的截获

*     参数 :

*                   pParam: 用户选择的用来捕获数据的网卡的名字

*********************************************************/

UINT CaptureThread(LPVOID pParam)

{

       const char* pCardName=(char*)pParam;          // 转换参数,获得网卡名字                        

       pcap_t* adhandle;

       char errbuf[PCAP_ERRBUF_SIZE];             

       // 打开网卡,并且设置为混杂模式

  adhandle=pcap_open_live(pCardName,65535,1,1000,errbuf)       {

       pcap_dumper_t* dumpfile;

// 建立存储截获数据包的文件

       dumpfile=pcap_dump_open(adhandle, "Packet.dat");    

       int re;

       pcap_pkthdr* header;      // Header

       u_char* pkt_data;         // 数据包内容指针

// 从网卡或者文件中不停读取数据包信息

       while((re=pcap_next_ex(adhandle,&header,(const u_char**)&pkt_data))>=0)

      {

           // 将捕获的数据包存入文件

              pcap_dump((unsignedchar*)dumpfile,header,pkt_data);      

       }

       return 0;

}   

将个线程加入到程序里面启动以后。。。等等,如何来启动这个线程就不用我说了吧,类似这样的代码就可以

::AfxBeginThread(CaptureThread,chNIC);     // chNIC 是网卡的名字 ,char* 类型

启动线程一段时间以后 ( 几秒中就有效果了 ) ,可以看到数据包已经被成功的截获下来,并存储到程序目录下的 Packet.dat 文件中。

=====================================================

至此,数据包的截获方法就讲完了,大家看了这篇文章,其实你就一定也明白了,无论是 raw socket 的方法还是 winpcap 的方法,其实都很简单的,真的没有什么东西,只是会让不明白原理的人看起来很神秘而已, isn’t it?

呵呵,不过也不要高兴的太早,这个保存下来的数据包文件,你可以试着用 UltraEdit 打开这个文件看看,是不是大部分都是乱码?基本上没有什么可读性,这是因为:

此时捕获到的数据包并不仅仅是单纯的数据信息,而是包含有 IP 头、 TCP 头等信息头的最原始的数据信息,这些信息保留了它在网络传输时的原貌。通过对这些在低层传输的原始信息的分析可以得到有关网络的一些信息。由于这些数据经过了网络层和传输层的打包,因此需要根据其附加的帧头对数据包进行分析。

呵呵,所以我们要走的路还很长,这只是刚刚入门而已 ^_^

 

http://www.ppmy.cn/news/920005.html

相关文章

Unity游戏存档 (将游戏数据储存至本地文档)

在Unity中 添加本地文档储存游戏数据 首先我们应该在Unity中创建一个C#脚本,将其命名为Inventory 脚本不用挂在任何物体上,只需要在命名空间之前写一句代码,如下: 代码写好之后保存,在Unity的文件栏中右键就会发现&…

Android网络数据包的抓和分析

1. 手机获得root权限; 2. push tcpdump到 /; 3. chmod 755 tcpdump; 4. 抓包: adb shell tcpdump -s 0 -w /sdcard/capture.pcap 5. pull数据包到pc,使用wireshark查看数据包 。 tcpdum…

如何修改游戏服务器数据包,游戏服务器 数据包设计

游戏服务器 数据包设计 内容精选 换一换 应用容器化改造有三种方式,您可单击这里查看。本教程以某游戏为例,将该游戏进行微服务的架构改造,再进行容器化。本教程不对改造细节做深度讲解,仅讲解大致的建议。如需要详细了解容器化改…

android11obb,exagear安卓11数据包obb

软件简介 exagear安卓11数据包obb是一款独特的模拟器程序。软件有着很经典的游戏可以进行下载运行的,而且这些游戏通过它就可以在手机上进行体验到了。对于需要的用户来说有着很优质的服务体验。需要的用户下载它! exagear安卓11数据包obb可以通过网盘下载&#xff…

android11obb,exagear安卓11数据包obb合集版

exagear安卓11数据包obb合集版能够在手机上模拟端游游戏,兼容性特别的强大,可以运行非常多的大型游戏,想要玩端游在手机上就来这里体验吧。 exagear安卓11数据包obb合集版特色: 1、模拟运行中的电脑游戏的软件,通过手机…

游戏数据包设计

首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才 移 动∣专 题∣SUN∣IBM∣微 软∣微 创∣精 华∣Donews∣人 邮 我的技术中心 我的分类我的文档全部文章发表文章专栏管理使用说明 RSS 订阅 最新文档列表 Windows/.NET.NET (rss…

如何修改游戏服务器数据包,游戏数据包的定义

在网络游戏中,会涉及到数据传送,所以就有一个要解决的问题,如何定义数据包格式,就目前我所知道的数据定义方式描述一下,欢迎各位高手指点, 第一种方式: 定义数据头: //网络包头 typedef struct PacketHeader {byte id[4]; //u_int32 lb byte len[4]; //u_int32 lb …

安卓数据包游戏常见问题及解决办法

鉴于 Android 手机软硬件十分繁杂,导致绝大部分数据包游戏很难同时兼容全部机型,因此数据包游戏往往会分版本、机型独立提供给各位玩家。下面就一些常见的问题及解决方法汇总如下: Q1:数据包游戏如何安装? 方法一&…

如何使用数据包破解游戏 - 从这里开始

什么是包? 您的游戏客户端和服务器始终处于通信状态。从一个到另一个的每次传输称为一个数据包。 有时它是由一系列数据包组成的数据包“流”,有时它只是一个具有个人用途的数据包。 游戏使用的协议是 TCP 和 UDP 游戏将打开端口,操作系统…

手把手教你捕获数据包(上)【数据包的游戏系列之二】

前 言 经常看到论坛有人问起关于数据包的截获、分析等问题,幸好本人也对此略有所知,也写过很多的sniffer,所以就想写一系列的文章来详细深入的探讨关于数据包的知识。 我希望通过这一系列的文章,能使得关于数据包的知识得以普及…

手把手教你捕获数据包(下)【数据包的游戏系列之二】

B. 打开相应网卡并设置为混杂模式: 在此之前肯定要有一段让用户选择网卡、并获得用户选择的网卡的名字的代码,既然上面已经可以获得所有网卡的名字了,这段代码就暂且略过了。 我们主要是要用到 pcap_open_live 函数,不过这个函数w…

游戏.数据包程序

/**************************************************game Data Storage Demo codehttp://blow.csdn.net/chinayaosir**************************************************///0.头文件#include <windows.h>#include <stdio.h>//1.数据包类定义class cDataPackage{…

狂野飙车8服务器在哪个文件夹,狂野飙车8数据包放哪?安卓版数据包路径介绍

狂野飙车8也算是目前安卓平台上最好玩的赛车游戏之一了&#xff0c;还有另外一款则是极品飞车。不过很多新手们&#xff0c;不知道狂野飙车8数据包放哪&#xff0c;其实很简单&#xff0c;下面就详细介绍下数据包的放置路径&#xff0c;还不知道如何放置的可以来看看&#xff0…

数据包覆盖Android,安卓数据包怎么安装 安卓游戏数据包安装教程

安卓数据包怎么安装?安卓数据包放在哪?这是很多安卓单机游戏爱好者经常问的问题,下面小编就为各位玩家带来:安卓游戏数据包安装教程,诸如数据包存放好后,为什么还是不能正常玩都能为您解答~ 安卓数据包怎么安装? 在回答这个问题之前玩家们应该知道,数据包分为两种,一种…

安卓游戏数据包 android文件夹将被替换 可以同意么,安卓游戏数据包放哪里位置?安卓游戏数据包安装的注意事项...

安卓游戏数据包放哪里位置&#xff1f;安卓游戏数据包和安卓游戏本体虽然是两回事&#xff0c;但还是有一些大型游戏厂商将游戏数据包与本体APP集成在一起的&#xff0c;不过大部分大型安卓游戏需要用户自行下载数据包&#xff0c;且要放入指定位置。 安卓游戏数据包放哪里位置…

android 游戏数据在哪里下载地址,安卓游戏数据包放哪 小编教你怎么用

现在很多大一点的安卓游戏,都需要下载数据包,关键问题是小伙伴们搞不清什么是SD卡根目录,不知道安卓游戏数据包存放哪。下面小编将会分5个点来给大家解答这个问题。 安卓游戏数据包存放地址 为什么非要下载数据包,不下载行吗 怎么下载数据包 安卓游戏数据包怎么安装 数据包…

手游数据包怎么用

手机游戏数据包是用于大型手机游戏使用的一种安装方式&#xff0c;它包括了一个单独的APK文件和一个数据包文件。单独的apk或者数据包都不能使用&#xff0c;只有2者在一起游戏才能正常运行。 方法/步骤 1 手机游戏数据包文件在下载时一般是打包下载的&#xff0c;如果你只下载…

Android手机游戏数据包使用方法

数据包一般分几类&#xff1a; &#xff08;1&#xff09;gameloft系列&#xff1a;这个比较多&#xff0c;差不多现在所有大型游戏都是gameloft系列的&#xff0c;数据包除了部分是程序英文名&#xff0c;例如&#xff1a;fishking、spiderman、asphalt6....其他大多都是“Glo…

android数据包放在,安卓游戏数据包是什么_安卓游戏数据包放在哪里

现在随着各大游戏厂商的游戏效果越来越华丽&#xff0c;各种游戏也越来越大了。越来越多的游戏也需要用到游戏数据包了&#xff0c;今天小编就和机友们说说关于安卓游戏数据包是什么。 安卓游戏可以分为含数据包的和不含数据包的两个大类&#xff0c;含数据包的游戏除开主程序之…

android数据包放在,安卓游戏数据包放哪,怎么使用?

您可能感兴趣的话题&#xff1a; 安卓 核心提示&#xff1a;正在使用安卓系统手机的朋友们是否知道安卓游戏数据包放哪&#xff1f;如何你还不清楚&#xff0c;就来看看本文的介绍吧。 正在使用安卓系统手机的朋友们是否知道安卓游戏数据包放哪&#xff1f;如何你还不清楚&…
最新文章