1.mystery引入
  1)网络嗅探属于网络攻防类的安全软件,其基于原始套接字技术开发的
  2)原始套接字是一种套接字底层技术,它工作在网络层
  3)谈到网络安全,刚好本学期学过这门课程,这里mystery总结下基于原始套接字技术开发的网络安全软件类型
   木马中的通信模块:为了躲避杀毒软件的检测,有一些木马程序采用原始套接字技术进行通信,例如,开启本地嗅探,对特定格式的ICMP报文进行响应触发。对外传输数据时采用自定义的报文格式,比如伪造成80端口中的请求或响应数据以逃过防火墙的阻断。
   伪造IP地址:生成自定义格式的IP报文,填充任意的IP源地址,以达到伪装自己的目的。在局域网上的ARP病毒就是基于这种原理
   拒绝服务攻击:类似于伪造IP地址,通过自定义特定格式的IP报文,向目标机器以送大量的同类型信息,以达到淹没对方处理能力的目的。由于这种非法报文会占据大量的目标机器的资源,造成服务不能正常运行,从而实现拒绝服务的目的。
   数据包嗅探:数据包嗅探是原始套接字技术最广泛的一项应用,通过设置网卡的工作模式,采集所有流经本网卡的网络数据包,通过分析数据包,以达到既定的目的

4)在原始套接字中,执行数据发送要调用setsocketopt函数进行套接字的首部设定。设定套接字的首部选项IP_HDRINCL,不然系统会自动填充套接字的首部


2.实例操作
   1)实现一个简单的网络数据包嗅程序
   2)基本原理是:将网卡设为混杂模式,然后采集网络数据包,针对到来的数据包,按相应的协议字段进行反向解析,并输出到终端
   3)基本流程
   1)创建一个原始套接字,设置属性为SOCK_RAW,协议号htons(ETH_P_IP)
   2)循环调用recvfrom()函数,采集到来的网络数据包,并进行如下解析
   3)解析源MAC地址
   4)解析目的MAC地址
   5)解析源IP地址
   6)解析目的IP地址
   7)解析协议号
   8)若协议号为TCP或UDP,则解析数据包中的源端口与目的端口

4)源代码

 //rawsocket.c
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <linux/if_ether.h>
#include <linux/in.h>
#include <stdlib.h>
#define BUFFER_MAX 2048
int main(int argc, char *argv[])
{
int rawsock;
char buffer[BUFFER_MAX];
char *ethhead;
char *iphead;
char *tcphead;
char *udphead;
char *icmphead;
char *pHead;
if((rawsock = socket(PF_PACKET,SOCK_RAW,htons(ETH_P_IP))) < )
{
printf("error: create raw socket!!!\n");
exit();
}
long framecount = ;
while()
{
int readnum = recvfrom(rawsock, buffer,,, NULL, NULL);
if(readnum < )
{
printf("error: Header is incomplete!!!\n");
continue;
}
ethhead = (char *)buffer;
pHead = ethhead;
int ethernetmask = 0XFF;
framecount++;
printf("------------------Analysis Packet [%d]---------------------\n",framecount);
printf("MAC:");
int i = ;
for(; i <=; i++)
{
printf("%.2X:",pHead[i]&ethernetmask);
}
printf("---->");
for(i = ; i <=; i++)
{
printf("%.2X:",pHead[i]&ethernetmask);
}
printf("\n");
iphead = ethhead + ;
pHead = iphead + ;
printf("IP:");
for(i = ; i <=; i++)
{
printf("%d",pHead[i]&ethernetmask);
if(i != )
printf(".");
}
printf("---->");
for(i = ; i <=; i++)
{
printf("%d",pHead[i]&ethernetmask);
if(i != )
printf(".");
}
printf("\n");
int prototype = (iphead + )[];
pHead = iphead + ;
printf("Protocol: ");
switch(prototype)
{
case IPPROTO_ICMP:
printf("ICMP\n");
break;
case IPPROTO_IGMP:
printf("IGMP\n");
break;
case IPPROTO_IPIP:
printf("IP\n");
break;
case IPPROTO_TCP :
printf("TCP | source port: %u | ",(pHead[]<<)&0XFF00 | pHead[]&0XFF);
printf("dest port: %u\n", (pHead[]<<)&0XFF00 | pHead[]&0XFF);
break;
case IPPROTO_UDP :
printf("UDP | source port: %u | ",(pHead[]<<)&0XFF00 | pHead[]&0XFF);
printf("dest port: %u\n", (pHead[]<<)&0XFF00 | pHead[]&0XFF);
break;
case IPPROTO_RAW :
printf("RAW\n");
break;
default:
printf("Unkown\n");
}
printf("-------------------------end-----------------------\n");
}
}

3.mystery注解
   1)运行效果

   2)如图所示,运行此程序需要root权限
    原因:原始套接字提供管理下层传输的能力,他们可能会被恶意利用。因此,仅root组的成员能够窗口SOCK_RAW类型的套接字

3)本程序是采用的PF_PACKET来创建的SOCK_RAW,即工作在数据链路层,另外也可以指定在网络层使用


4.mystery说明

这只是我在学习计算机网络时一个小小的知识点验证实验,记录了一些知识总结和心得体会,这只是学习,无关任何作业或者开发之说。

算法的艺术:http://infohacker.blog.51cto.com/6751239/1171388

算法之美,解剖艺术:http://infohacker.blog.51cto.com/6751239/1194158

在此附上我学习计算机网络时的一系列心得体会,我相信不管是对自己,还是对别人,总会有一定的帮助。

linux无连接编程技术:http://infohacker.blog.51cto.com/6751239/1155102

linux套接字技术之tcp:http://infohacker.blog.51cto.com/6751239/1155096

linux多路复用IO技术:http://infohacker.blog.51cto.com/6751239/1155107

linux网络嗅探底层原理:http://infohacker.blog.51cto.com/6751239/1155113

linux广播技术:http://infohacker.blog.51cto.com/6751239/1155115

linux组播技术:http://infohacker.blog.51cto.com/6751239/1155123

linux高性能网络服务:http://infohacker.blog.51cto.com/6751239/1155167

linux网络扫描程序开发:http://infohacker.blog.51cto.com/6751239/1155170

linux下http服务器开发:http://infohacker.blog.51cto.com/6751239/1155176

我一直比较认同一句话:其实我们一直都不是很优秀,是别人的赞赏和鼓励,让我们有机会成为别人期待的样子!所以,我也一直用我希望被对待的方式去对待别人,在此感谢各们同行以及老师们的认可和支持,谢谢!我会努力做得更好!

【Socket】linux黑客之网络嗅探底层原理的更多相关文章

  1. Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理

    Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理 转自:https://www.jianshu.com/p/2b71ea919d49 本系列文章首发于我的个人博 ...

  2. 操作系统底层原理与Python中socket解读

    目录 操作系统底层原理 网络通信原理 网络基础架构 局域网与交换机/网络常见术语 OSI七层协议 TCP/IP五层模型讲解 Python中Socket模块解读 TCP协议和UDP协议 操作系统底层原理 ...

  3. Linux下TCP网络编程与基于Windows下C#socket编程间通信

    一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ...

  4. Linux高并发网络编程开发——10-Linux系统编程-第10天(网络编程基础-socket)

    在学习Linux高并发网络编程开发总结了笔记,并分享出来.有问题请及时联系博主:Alliswell_WP,转载请注明出处. 10-Linux系统编程-第10天(网络编程基础-socket) 在学习Li ...

  5. Linux从头学06:16张结构图,彻底理解【代码重定位】的底层原理

    作 者:道哥,10+年的嵌入式开发老兵. 公众号:[IOT物联网小镇],专注于:C/C++.Linux操作系统.应用程序设计.物联网.单片机和嵌入式开发等领域. 公众号回复[书籍],获取 Linux. ...

  6. Linux从头学13:想彻底搞懂“系统调用”的底层原理?建议您别错过这篇【调用门】

    作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...

  7. 7)Linux程序设计入门--网络编程

    )Linux程序设计入门--网络编程 Linux系统的一个主要特点是他的网络功能非常强大.随着网络的日益普及,基于网络的 应用也将越来越多. 在这个网络时代,掌握了Linux的网络编程技术,将令每一个 ...

  8. 10分钟看懂, Java NIO 底层原理

    目录 写在前面 1.1. Java IO读写原理 1.1.1. 内核缓冲与进程缓冲区 1.1.2. java IO读写的底层流程 1.2. 四种主要的IO模型 1.3. 同步阻塞IO(Blocking ...

  9. 2、docker安装:内核要求、docker三要素、安装、helloworld、底层原理

    1.前提说明 1.CentOS Docker 安装 Docker支持以下的CentOS版本: CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本 2.前提条件:内 ...

随机推荐

  1. jenkins shell脚本自动化构建阿里云k8s上应用

    #!/bin/bash source /etc/profile cd /mnt/workspace/weifeng-ui-pre/ npm i && npm run build rm ...

  2. springmvc是如何和前端页面联系起来的

    springmvc的使用,在controller中通过注解的形式,获取从前端jsp页面传过来的action参数. 方法/步骤   使用springmvc必须在web.xml中配置(Dispatcher ...

  3. selenium的运行时异常

    selenium这个库是一个伟大的库,它赋予了程序员控制浏览器的能力.但是如果不理解这个库的设计上的一些哲学,就会遇到很多问题. selenium支持多种浏览器,但是这些浏览器里面,只有firefox ...

  4. python+stomp+activemq

    python也可以连接MQ,以ActiveMQ为例,安装stomp.py: https://github.com/jasonrbriggs/stomp.py 下载后安装: python setup.p ...

  5. 转载:librdkafka问题总结

    使用librdkafka过程中,遇到的一些问题,解决办法! 暂时先转载:form:http://blog.csdn.net/lybingo/article/details/52808192?locat ...

  6. ubuntu安装wkhtmltopdf

    下载安装wkhtmltox系统环境 http://wkhtmltopdf.org/downloads.html wget https://bitbucket.org/wkhtmltopdf/wkhtm ...

  7. strace命令解析

    strace常用于跟踪和分析进程执行时中系统调用和耗时以及占用cpu的比例,常用的格式如下: 1.sudo /usr/bin/strace -Ttt -p pid 2>pid.log 跟进pid ...

  8. [think]关于个人发展值得记住的一些建议 听别人的话,即使你不想听 不要只做不想 成功不能被复制,但失败总在不停复制。看看别人是怎么倒下的,你可以更早地成功

    [think]关于个人发展值得记住的一些建议 偶然看到一篇采访周爱民的文章,里面的一些建议虽然朴实无华,却感觉很有道理,特此记录: 记者:对于程序员的技术发展和职业规划能否给大家一些建议呢?----- ...

  9. C语言学习笔记 (003) - C/C++中的实参和形参(转)

    今天突然看到一道关于形参和实参的题,我居然不求甚解.藐视过去在我的脑海里只有一个参数的概念,对于形参和实参的区别还真的不知道,作为学习了几年C++的人来说,真的深深感觉对不起自己对不起C++老师  T ...

  10. rviz学习笔记(二)——Markers: Points and Lines (C++) 点和线

    一.在using_marker/src中编写点和线代码 vim ~/catkin_ws/src/using_marker/src/points_and_lines.cpp 编写代码,其中有注释 #in ...