对网络数据包进行嗅探

例如我现在发表了一个帖子,点击提问按钮,我如何截获点击提问按钮时所发出去的包呢?并把我发表的内容取出来。  
---------------------------------------------------------------  
---------------------------------------------------------------  
 
选自小猪的Blog:  
 
一.捕获数据包的实现原理  
 
二.捕获数据包的编程实现:  
 
1.      raw  socket的实现方法  
 
2.      Winpcap的实现方法  
 
a.            枚举本机网卡的信息  
 
b.            打开相应网卡并设置为混杂模式  
 
c.              截获数据包并保存为文件  
 
   
 
作者:  
 
CSDN    VC/MFC  网络编程版主  PiggyXP      
 
   
 
一.捕获数据包的实现原理:--------------------------------------------------------------------  
 
在通常情况下,网络通信的套接字程序只能响应与自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将不引起响应,也就是说应用程序无法收取与自己无关的的数据包。  
 
所以我们要想实现截获流经网络设备的所有数据包,就要采取一点特别的手段了:  
 
将网卡设置为混杂模式。  
 
这样一来,该主机的网卡就可以捕获到所有流经其网卡的数据包和帧。  
 
但是要注意一点,这种截获仅仅是数据包的一份拷贝,而不能对其进行截断,要想截断网络流量就要采用一些更底层的办法了,不在本文的讨论范围之内。  
 
   
 
二.  捕获数据包的编程实现:  
 
1.raw  socket的实现方法--------------------------------------------------------------------  
 
不同于我们常用的数据流套接字和数据报套接字,在创建了原始套接字后,需要用WSAIoctl()函数来设置一下,它的定义是这样的    
 
int  WSAIoctl(  
 
   SOCKET  s,  
 
   DWORD  dwIoControlCode,  
 
   LPVOID  lpvInBuffer,  
 
   DWORD  cbInBuffer,  
 
   LPVOID  lpvOutBuffer,  
 
   DWORD  cbOutBuffer,  
 
   LPDWORD  lpcbBytesReturned,  
 
   LPWSAOVERLAPPED  lpOverlapped,  
 
   LPWSAOVERLAPPED_COMPLETION_ROUTINE  lpCompletionRoutine  
 
);  
 
虽然咋一看参数比较多,但是其实我们最关心的只是其中的第二项而已,我们需要做的就是把第二项设置为SIO_RCVALL,讲了这么多其实要做的就是这么一行代码,很简单吧?^_^    
 
 当然我们还可以指定是否亲自处理IP头,但是这并不是必须的。  
 
完整的代码类似与如下这样,加粗的代码是与平常不同的需要注意的地方:  
 
(  为了让代码一目了然,我把错误处理去掉了,下同)  
 
   
 
#include  “WinSock2.h”  
 
#define  SIO_RCVALL  _WSAIOW(IOC_VENDOR,1)  
 
   
 
SOCKET  SnifferSocket  
 
   WSADATA  wsaData;  
 
   iFlag=WSAStartup(MAKEWORD(2,2),&wsaData);                      //开启winsock.dll  
 
                                                                     
 
SnifferSocket=WSASocket(AF_INET,                          //创建raw    socket  
 
SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);  
 
   
 
   char  FAR  name[128];                                                                //获取本机IP地址  
 
gethostname(name,  sizeof(name));  
 
   struct  hostent  FAR  *  pHostent;  
 
   pHostent  =  gethostbyname(name);  
 
   
 
   SOCKADDR_IN  sa;                                                      //填充SOCKADDR_IN结构的内容  
 
   sa.sin_family  =  AF_INET;  
 
   sa.sin_port  =  htons(6000);                      //  端口号可以随便改,当然与当然系统不能冲突  
 
   memcpy(&(sa.sin_addr),pHostent->h_addr,pHostent->h_length);  
 
   
 
bind(SnifferSocket,(LPSOCKADDR)&sa,sizeof(sa));                        //绑定  
 
     
 
   //  置ioctl来接收所有网络数据,关键步骤  
 
   DWORD  dwBufferLen[10]  ;  
 
   DWORD  dwBufferInLen  =  1  ;  
 
   DWORD  dwBytesReturned  =  0  ;  
 
   WSAIoctl(SnifferSocket,  IO_RCVALL,&dwBufferInLen,  izeof(dwBufferInLen),  
 
               &dwBufferLen,  sizeof(dwBufferLen),&dwBytesReturned  ,  NULL  ,  NULL  );  
 
     
 
至此,实际就可以开始对网络数据包进行嗅探了,而对于数据包的接收还是和普通的socket一样,通过recv()函数来完成,因为这里涉及到不同的socket模型,接收方法差别很大,所以在此就不提供接收的代码了。  

转载于:https://www.cnblogs.com/henryzc/archive/2005/03/14/118270.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法(6) -- heap

binary heap就是一种complete binary tree(完全二叉树)。也就是说,整棵binary tree除了最底层的叶节点之外,都是满的。而最底层的叶节点由左至右又不得有空隙。 以上是一个对heap的简单介绍。本文将用heap指代此种完全二叉树。那么在实际编写代码的时候怎…

涂鸦WIFI模组方案(MCU SDK)

摘自涂鸦官方视频教程:https://www.bilibili.com/video/BV1pb41117LD?spm_id_from333.999.0.0等 摘自:涂鸦IoT开发平台MCU开发接入(Wi-Fi)-App面板 地址:https://www.bilibili.com/video/BV1cK4y1x7Up?spm_id_from333.999.0.0 摘自&#xf…

MySQL数据库添加一个字段

MySQL数据库添加一个字段 1、添加一个字段 alter table tableName add 列名 数据类型; 2、添加一个字段设置默认值 alter table tableName add 列名 数据类型 default 0; (注:这里设置默认值为0) 例子:在users表添加一个int类型…

研究方向

企业软件可以研究的东西实在太多了,从C#的语法细节,底层实现机制到设计模式从全局把握,从微观的页面设计到宏观的性能调整,从具体的编程技巧到具体的事例研究,如此种种。 前两个星期,一个星期抱着《设计模式…

SVN使用教程

摘自:SVN使用教程 地址:https://www.bilibili.com/video/BV1k4411m7mP?fromsearch&seid1516107384812084869&spm_id_from333.337.0.0 摘自:快速掌握Git分布式系统操作 地址:https://www.bilibili.com/read/cv14701783?s…

机器学习sklearn的快速使用--周振洋

ML神器:sklearn的快速使用 传统的机器学习任务从开始到建模的一般流程是:获取数据 -> 数据预处理 -> 训练建模 -> 模型评估 -> 预测,分类。本文我们将依据传统机器学习的流程,看看在每一步流程中都有哪些常用的函数以…

今日个人大事记:)

1、拿到一台1G DDR2内存的电脑,终于可以把虚拟内存设为0了,呵呵。 2、试用了下MS的Virtual Server 2005,发现Client连接可以在Web上或使用应用程序,而虚拟机器配置是在Web上,不大方便。似乎不太符合MS一惯的作风啊。 3…

自动添加注释

程式的时候给代码注释有时候蛮烦人的,尤其是用英文写注释的时候,但是养成写注释的习惯,对日后代码的维护还是很有帮助的,一般脚本的开头会注明编写时间,版本,用途等说明。VIM 里面能够使用映射(map)来帮您自…

太极创客ESP8266 - NodeMCU、JSON、MQTT教程(基于Arduino)

太极创客ESP8266视频教程:https://www.bilibili.com/video/BV1L7411c7jw?fromsearch&seid4858784806004995732&spm_id_from333.337.0.0 官网资料:http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-iot-basics/ 太极创客…

Voltage Keepsake CodeForces - 801C (思维+二分)

题目链接 这是一道很棒的二分题。 思路: 首先先思考什么情况下是可以无限的使用,即输出-1. 我们思考可知,如果每一秒内所有设备的用电量总和小于等于充电器每秒可以充的电,那么这一群设备就可以无限使用。 接下来分析不是无限使用…

Linux网络服务-LAMP之Php基于Apache的模块实现

一、概述 首先,如标题所示我接下来的实验就是搭建一个LAMP平台然后实现一个Blog站点的实现,那"Php基于Apache的模块实现"这又是神马意思呢,我们知道Apache与Php的结合方式有常见的三种:基于module、基于CGI、基于Fa…

4G DTU使用教程

摘自:https://www.bilibili.com/video/BV1uP4y187bw?spm_id_from333.999.0.0 目录了解4G DTUATK - M750模组使用NET模式(网络透传)使用HTTP模式使用阿里云透传模式使用百度云透传模式使用OneNET模式透传模式了解4G DTU 4G DTU对比传统的4G模组更简单易用&#xff…

Kalman Filter

原理介绍 https://pan.baidu.com/s/15zDz8TeM8PKMsH231a0fOw 简单的例子 https://www.jianshu.com/p/d3b1c3d307e0 下图中“对应例子”就是所引用简书博客提到的例子。预测-校正交替运行。 博客:自动驾驶基础之——如何写卡尔曼滤波器? https://mp.weixi…

专注

"选择不做一件事情,有时候比做更难."我很喜欢这句话,一个公司要专注于自己的项目.即使对于一个项目而言,也要专注.因为公司发展初期各种资源是有限的,必须把资源集中在一点上.但有时候项目的定位牵扯到项目的战线问题.既要达到定位,又要控制利用好自己的资源,这个确实…

移远EC20 4G模块LTE开发板三网通模块 MQTT阿里云物联网

摘自:移远EC20 4G模块LTE开发板三网通模块 MQTT阿里云物联网STM32代码-电脑看 地址:https://www.bilibili.com/video/BV1EJ411P7CR?fromsearch&seid6590774415258771438&spm_id_from333.337.0.0 摘自:STM32开发板NB-IOT移远BC26 NB模…

在 LinearLayout里addView一个图表

2019独角兽企业重金招聘Python工程师标准>>> activity_main.xml <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_width"fill_parent"and…

准备写个nhibernate的学习笔记

经理说要用这个做数据层管理。先找点资料 C C 先&#xff5e;&#xff01; 有心得就慢慢贴上来转载于:https://www.cnblogs.com/marsforest/archive/2005/04/19/140670.html

Home Assistant 安装Samba和SSH server 插件

安装 Samba 插件 Samba 是 SMB/CIFS 网络协议的重新实现, 它作为 NFS 的补充使得在 Linux 和 Windows 系统中进行文件共享、打印机共享更容易实现。 Smaba 服务是必装的一个插件&#xff0c;Hass.io 通过它与局域网内的其他设备进行文件共享&#xff0c;是之后编辑 Hass.io 配置…

涂鸦WIFI模组方案(模组 SDK)

摘自&#xff1a;涂鸦智能模组 SDK 开发系列课程 地址&#xff1a;https://www.bilibili.com/video/BV1Kq4y1o728?p1 摘自&#xff1a;涂鸦智能模组SDK开发系列课程——Wi-Fi接入 地址&#xff1a;https://blog.csdn.net/sandwich_iot/category_11289915.html?spm1001.2014.3…

IOS静态库生成及测试

目录&#xff1a;1 生成静态库(.a文件)2 测试静态库文件1 生成静态库文件&#xff1a;1.1创建静态库项目static_library1.2 添加方法&#xff1a; - (int)getMax:(int)a b:(int)b;-(int)getMin:(int)a b:(int)b;(void)print;实现这些方法1.3 编译前选择IOS Device和模拟器&am…