Sniffer技术是网络安全领域里一项非常重要的技术!对于“Hacker”来说,他们可以以非常隐蔽的方式得到网络中传输的大量的敏感信息,如 Telnet,ftp帐号和密码等等明文传送的信息!与主动扫描相比,嗅探的行为更加难以被察觉,操作起来也不是很复杂!对于网络管理人员来说,可以利用嗅探技术对网络活动进行监控,并及时发现各种攻击行为!本文引用地址:http://www.eepw.com.cn/article/151626.htm

在这篇文章里,我们主要探讨在Linux下如何利用C语言来实现一个Sniffer!我们将假设所有的主机在一个局域网内。

首先,我们将简短的回顾一下一个普通的以太网卡是怎么工作的!(如果你对这方面的知识早已熟悉,那么你可以直接跳到下一段)来源于应用程序的IP报文被封装成以太网帧(这是在以太网上传播的数据报文的名称),它是底层链路层报文上面的一层报文,包含有源地址报文和一些需要用来传送至目标主机的信息。通常情况下,目的IP地址对应着一个6字节的目的以太网址(经常叫做MAC地址),它们之间通过ARP协议进行映射!就这样,包含着以太网帧的报文从源主机传输到目的主机,中间经过一些网络设备,如交换机,路由器等等,当然,因为我们的前提是主机在同一网内,所以我们的讨论不涉及以上这些网络设备!

在链路层中并不存在路线的概念,换句话说,源主机发出的帧不会直接指向目的主机,而是基于广播方式传播,网络中的所有网卡都能看到它的传输。每个网卡会检查帧开始的6个字节(目的主机的MAC地址),但是只有一个网卡会发现自己的地址和其相符合,然后它接收这个帧,这个帧会被网络驱动程序分解,原来的IP 报文将通过网络协议栈传送至接收的应用程序!

更准确的说,网络驱动程序会检查帧中报文头部的协议标识,以确定接收数据的上层协议!大多数情况下,上层是IP协议,所以接收机制将去掉IP报文头部,然后把剩下的传送至UDP或者TCP接收机制!这些协议,将把报文送到SOCKET-handling机制,它将最后把报文数据变成应用程序可接收的方式发送出去。在这个过程中,报文将失去所有的和其有关的网络信息,比如源地址(IP和MAC),端口号,IP选择,TCP参数等等!所以如果目的主机没有一个包含正确参数的打开端口,那么这个报文将被丢弃而且永远不会被送到应用层去!

因此我们在进行网络嗅探的时候有两个不同的问题:一个和以太网址有关,我们不能抓到不是发给自己主机的包,另一个和协议栈的运行过程有关,我们需要一个socket去*每个端口,得到那些没有被丢弃的报文!

第一个问题不是最根本的,因为我们可能不会对发往其他主机的报文有兴趣而只想嗅探所有发往自己主机的报文。第二个问题是必须要解决的,下面我们将看到这个问题是怎么样一步一步解决的!

当你打开一个标准的SOCKET套接字时,你需要指明你将使用哪个协议簇,大多数情况下我们一般用PF_UNIX在本地机器间进行通信,PF_INET在基于IPv4协议簇基础之上进行通信,你还需要指明所用的协议类型及与协议簇相关的确切数值,,在PF_INET协议簇中,常用的有 SOCK_STREAM(与TCP相关),SOCK_DGRAM(与UDP相关)。在把报文发送到应用程序前内核对其的处理与SOCKET类型有关,你指定的协议将处理报文在SOCKET的传输!(具体细节问题你可以man socket(3))

在LINUX内核版本中(2.0 releases),一个名为PF_PACKET的协议簇被加了进来!这个簇允许应用程序直接利用网络驱动程序发送和接收报文,避免了原来的协议栈处理过程,在这种情况下,所有SOCKET发出的报文直接送到以太网卡接口,而接口收到的任何报文将直接送到应用程序The PF_PACKET协议簇支持两个稍微有点不同的SOCKET类型,SOCK_DGRAM和SOCK_RAW。

前者让内核处理添加或者去除以太网报文头部工作,而后者则让应用程序对以太网报文头部有完全的控制!在SOCKET调用中的协议类型必须符合/usr /include/linux/if_ether.h中定义的以太网IDs中的一个,除非遇到特别声明的协议,一般你可以用ETH_P_IP来处理IP的一组协议(TCP,UDP,ICMP,raw IP等等)因为它们容易受到一些很严重的安全问题的牵连(比如你可以伪造一个MAC地址),所以只有具有root权限才可以使用PF_PACKET- familysocket.这也就是为什么只有具有root权限后才能运行嗅探器的原因!

PF_PACKET-family 协议簇可以很容易解决协议栈处理嗅探来的数据报文时候遇到的问题!我们一起来看看程序1,我们打开一个属于PF_PACKET-family 协议簇的SOCKET,指定一个SOCK_RAW socket类型和IP相关协议类型。这时我们开始从SOCKET抓包,在一些相关检查后.我们开始得到从链路层和IP层抓来的头部信息,。通过阅读程序一,你将会发现让应用程序从网络层抓包其实并不难!

Example 1.

#include

#include

#include

#include

#include

#include

#include

int main(int argc, char **argv) {

int sock, n;

char buffer[2048];

unsigned char *iphead, *ethhead;

if ( (sock=socket(PF_PACKET, SOCK_RAW,

htons(ETH_P_IP)))0) {

perror(socket);

exit(1);

}

while (1) {

printf(----------n);

n = recvfrom(sock,buffer,2048,0,NULL,NULL);

printf(%d bytes readn,n);

/* Check to see if the packet contains at least

* complete Ethernet (14), IP (20) and TCP/UDP

* (8) headers.

*/

linux如何实现c语言程序,在Linux下如何利用C语言来实现一个Sniffer相关推荐

  1. cygwin中写c语言程序,在windows下怎么利用Cygwin进行编程

    Windows下使用C语言+嵌入SQL实现DB2开发 Cygwin,gcc的介绍和安装在前面的文章有将过,请参考 在Windows中使用Cygwin环境下的gcc编译器编译Informix ESQ/C ...

  2. DSB算法C语言程序,单片机中使用DSB温度传感器C语言程序.doc

    单片机中使用DSB温度传感器C语言程序 单片机中使用DS18B20温度传感器C语言程序(参考1) /************************************************** ...

  3. c语言创建excel文件6,怎么利用c语言创建excel文件

    怎么利用c语言创建excel文件 想要利用c语言创建excel文件再把它导入excel其实很简单,如果数据简单的话,可以使用CSV(逗号分隔值)格式的文件.CSV格式的文件可以用OfficeExcel ...

  4. linux执行可执行命令程序ls,linux运行可执行程序命令

    linux 命令行如何运行程序 我用的是Ubuntu,安装了一个分子模拟软件,但是不知道如何运行程序,比cd到目录下,然后ls -l tleap,如果有x权限,直接./tleap,如果没有x,就先执行 ...

  5. linux 命令美丽,美丽的程序猿-Linux下那些查找文件的小技巧-find

    原标题:美丽的程序猿-Linux下那些查找文件的小技巧-find 一.按照文件名匹配查找 1. 查找当前目录下的文件tmp.sh find . –name tmp.sh 可以看出,使用.查找是查找当前 ...

  6. c语言程序竞赛,2015年江西理工大学C语言程序设计竞赛(初级组)

    JankTao相亲记 解法:排序 #include #include #include #include #include #include #include #include using names ...

  7. 您用c语言程序画过画?用c语言程序画个爱“心”,祝大家春节愉快,身体健康,平安吉祥,牛气冲天!顺便温习一下c语言编写,及运行正确姿势

    前言 在这辞旧迎新的时刻,az_debugIT提前给您拜年啦️,您及全家春节愉快,身体健康,平安吉祥!牛气冲天! Today is the Eve of  lunar year of 2020. Ev ...

  8. c语言程序代码有什么用,用c语言编写的代码程序是什么?

    前言继承是OOP设计中的重要概念.在C++语言中,派生类继承基类有三种继承方式:私有继承(private).保护继承(protected)和公有继承(public).一.继承规则继承是C++中的重要特 ...

  9. c语言程序执行时无法输入字符串,C语言程序设计中键盘输入数据的方法分析

    1. 引言 C语言程序设计是一门实践性很强的语言课程,在程序设计过程中经常需要从键盘输入所需要的数据.C语言没有专门的输入语句,可以调用C语言编译系统提供的函数库中的库函数来实现.有些程序虽然调试成功 ...

  10. c语言程序课程设计问题,矩形问题-C语言程序课程设课程设计(论文).doc

    矩形问题-C语言程序课程设课程设计(论文) PAGE PAGE \* MERGEFORMAT 20课程设计(论文)题 目 名 称 矩形问题 课 程 名 称 C语言程序课程设计 学 生 姓 名 xxx ...

最新文章

  1. 大学计算机组成原理试题答案,计算机组成原理试题及答案(大学期末复习资料).doc...
  2. 【转】心目中的编程高手
  3. sort和uniq命令
  4. VS2005调试时变慢解决办法
  5. 触发键盘_雷蛇这款光轴机械键盘开箱评测,光速触发,颜值爆表
  6. 3 src 获取_CVE-2019-15846:Exim远程获取root权限漏洞分析
  7. Mac本如何卸载MySQL
  8. 创建初始脚本工具mkscript.sh
  9. 怎么实现两周联动加减速_LOL:野辅联动成版本主旋律,三大辅助对线游走兼备...
  10. Vue中如何实现代码高亮功能?
  11. JavaScript学习(六十六)—字符串对象常用的属性和方法总结以及数组元素的排序问题
  12. hp 服务器 无线网卡,惠普HP 615 无线网卡驱动
  13. 转载 Java基本数据类型
  14. 分割 fasta 文件
  15. SNP位点上下游序列查找1.0 2020-9-27
  16. 家庭服务器 作用,家庭网络存储服务器四大主要功能
  17. SQLPro Studio for Mac(可视化数据库管理工具)
  18. (字节流与字符流)OutputStream字节输出流
  19. 一点就分享系列(实践篇3-中篇)— 虽迟但到!全网首发?yolov5之“baseline修改小结“+“CV领域展开-Involutiontransformercnn”
  20. 小白建网站,该如何入手?

热门文章

  1. LOJ#6038. 「雅礼集训 2017 Day5」远行(LCT)
  2. Spring Boot 学习笔记(一)
  3. Carthage的安装和使用
  4. APICloud的BUG 组件UIActionSelector数据格式引起的安卓手机显示不出
  5. 【工具】获取窗口与控件信息
  6. 【转】android题目
  7. 树莓派使用 USB 摄像头做网络监控
  8. 20190911每日一句
  9. 190530每日一句
  10. unity 将虚拟相机的视角局部放大,显示在一个平面上