当前位置:  技术问答>linux和unix

Linux下C语言+libnet实现ARP数据包广播

    来源: 互联网  发布时间:2016-12-05

    本文导语:  本帖最后由 nihaojiayu 于 2011-06-07 10:33:36 编辑 先说一下相关的“废话”:      近来学校宿舍楼ARP攻击一直很猖獗,而且大多数是主机欺骗型ARP攻击。每次攻击都要至少半天整栋宿舍楼上不去网(我们这边每栋宿舍...

本帖最后由 nihaojiayu 于 2011-06-07 10:33:36 编辑
先说一下相关的“废话”:

     近来学校宿舍楼ARP攻击一直很猖獗,而且大多数是主机欺骗型ARP攻击。每次攻击都要至少半天整栋宿舍楼上不去网(我们这边每栋宿舍楼划分一个网段,像我们楼就是10.1..23.254/22)。我曾经抓到过ARP攻击数据包,局域网遭受攻击的时候被我逮了个正着:某台主机广播一个ARP数据包,内容是10.1.23.254 is at xxxxxxxx(即错误的网关MAC,我们的网关是10.1.23.254),然后整栋楼就断网大半天。

     没有办法,绝大部分人不懂MAC绑定,没有主动防御意识。我自己绑定了MAC只能保护自己,却只能眼睁睁看着局域网瘫痪。这不端午放假前一天的晚上又被攻击,然而网络中心的管理员都放假了,我们一下就断网3天!

      我真的怒了!

      偶尔看到百度百科上ARP那一词条上,作者推荐了一个叫做“欣向全ARP工具”的东西,说是具有主动维护功能,就是向网内广播正确的网关与MAC地址。我觉的这个功能挺好,就下载下来试了试。那是WIN下的软件,我平时都是用Ubuntu,只好在同学机器上试,反正都上不去网,就死马当作活马医吧。没想到那个破烂玩意儿在使用其他任何功能之前,都必须扫描网络。我想扫就扫吧,反正很快(Linux下用nmap扫描10.1.23.254/22 的网段半分钟左右就OK了)。没想到那破东西居然明知道我的网段,却硬是从10.0.0.0扫描到10.254.254.254!!还扫了将近1个小时!终于扫描完成了啊,我就迫不及待用那个“主动维护”功能呐,没想到它不让自己填写网关跟MAC,还弹出窗口说自己找不到MAC(废话嘛,估计它是要读ARP表。都受ARP攻击了,ARP表里面就算有网关对应的MAC也不是间的是正确的啊,真不知这作者怎么设计的!),那我就手动绑定MAC吧(我知道正确的MAC地址,因为网络中心的网站上都公布这些信息的。),没想到同学那WIN7也不知道怎么的就不让绑定,用管理员权限运行CMD也不行,写个批处理也不行!我无奈,只好重启系统,可是再次打开那个破烂工具,它却说还要再扫描一次!!

      我已经出离愤怒了!每次运行都要扫描,每次扫描都要一个小时的话,局域网早就瘫了,还维护个P啊!

      后来有发现我那个网络接口不管用了,没信号(不是同学扫描局域网那台机器,而是那台机器上网的网口!一个宿舍才俩网口啊!大家都是用交换机的,XD!)那是被网络中心给封了啊!!估计扫描的时候流量太大了,它扫的本来就慢,还扫那么多,我只好开最大速度扫描(本以为网络中心放假呢,难道它们写了脚本自动封掉超流量端口?!可恶的是封端口,封一个MAC就行了嘛!),我都想直接找百度百科那个ARP词条作者去理论了!神马破烂玩意儿都往百科上放!!

      我还知道一些P2P软件可以发这种东西,都是WIN下的,但是害怕不安全,怕被人发现痕迹(虽说想做好事儿,但是手段毕竟有点hack)。就罢手Windows了,自己在Linux下来写!

       首先,我写这个东西不是想做坏事儿的,也希望看到这篇博客的朋友不要拿去做坏事儿!

    我只给出实现最基本功能的代码,稍微修改一下还可以实现好多其他的功能(我所在局域网的网关是10.1.23.254,其MAC地址为00:1c:f9:6a:4c:00)

下面是代码:(sendarp.c)
#include 
#include 
int main()
{
int res;
/*********init paras*****************/
libnet_t *l;/*****libnet handler*/
libnet_ptag_t p_tag;
char *device="eth0";
char err_buff[LIBNET_ERRBUF_SIZE];
char *src_ip_str="10.1.23.254";
char *dest_ip_str="0.0.0.0";
u_char src_mac[6]={0x00,0x1c,0xf9,0x6a,0x4c,0x00};
u_char dest_mac[6]={0xff,0xff,0xff,0xff,0xff,0xff};
u_long src_ip;
u_long dest_ip;
src_ip=libnet_name2addr4(l,src_ip_str,LIBNET_RESOLVE);
dest_ip=libnet_name2addr4(l,dest_ip_str,LIBNET_RESOLVE);

/**********init libnet*****************/
l=libnet_init(
LIBNET_LINK_ADV,
device,
err_buff
);
if(l==NULL)
{
printf("libnet_init err!n");
fprintf(stderr,"%s",err_buff);
exit(0);
}

/**********build arp packet************/
p_tag=libnet_build_arp(
ARPHRD_ETHER,/*hardware type ethernet*/
ETHERTYPE_IP,/*protocol type*/
6,/*length of mac*/
4,/*length of IP*/
ARPOP_REPLY,/*ARP operation type*/
src_mac,
(u_int8_t*) &src_ip,
dest_mac,
(u_int8_t*) &dest_ip,
NULL,/*payload*/
0,/*payload size*/
l,/*libnet handler*/
0/*'0' stands out building a new packet*/
);
if(p_tag==-1)
{
printf("libnet_build_arp err!n");
exit(0);
}

/***********build ethernet packet header*************/
p_tag=libnet_build_ethernet(
dest_mac,
src_mac,
ETHERTYPE_ARP,
NULL,
0,
l,
0
);
if(p_tag==-1)
{
printf("libnet_build_ethernet err!n");
exit(0);
}

/*********send packets*******************************/
for(;;)
{
if((res=libnet_write(l))==-1)
{
printf("libnet_write err!n");
exit(0);
}
printf("arp packet has been sentn");
sleep(1);
}

/*********over and destroy**************************/
libnet_destroy(l);
return 0;
}


终端里编译:
gcc -o sendarp sendarp.c -lnet

运行(root权限才可以):
./sendarp


运行时抓包:
[img=http://t2.qpic.cn/mblogpic/4673103d6a8ce0219ff4/460][/img]
PS:1、上述代码总体在Windows下可用,只是包含头文件的方式有所不同,有兴趣的朋友可以研究一下windows下libnet的安装、配置与使用。

2、代码中第9行:char *device="eth0",是指Linux下默认的有线网络接口,如果把“eth0"换做"wlan0"则是默认的无线网络接口。其实我是在无线网络下测试的(怕影响有线局域网),所以才有那么一堆不对应网关为10.1.23.254的IP地址。

转自:http://blog.csdn.net/nihaojiayu/archive/2011/06/07/6528746.aspx

|
感觉这应该发到博客类似的地方

|
进来学习了...

    
 
 

您可能感兴趣的文章:

  • Linux 下如何将广播消息发往多个接口
  • Linux下怎样发送广播信息?
  • 关于LINUX下广播
  • linux 如何接收网内UDP的广播包
  • linux下发udp广播包的问题
  • Linux下C语言strstr()查找子字符串位置函数详细介绍(strstr原型、实现及用法)
  • 求助,在linux下,c语言和汇编语言的接口是什么?
  • linux下进程间通信:共享内存原理及具体用法举例(基于c/c++语言)
  • 我安装的linux时默认语言选择的是中文,又乱码,怎么可以解决?怎么更改默认语言成英文?
  • LINUX 或者Windows 如何保证一个进程只有一个实例在运行?如果是C语言,JAVA语言开发,又怎么样保证?
  • LINUX下面C语言和C++语言所开发的软件有什么区别
  • 有了c语言基础,如何入手学习用c语言linux网络编程
  • Linux 区分语言版本吗?
  • 一个小问题。Linux下编程语言的问题。
  • 我是一个linux新手,不知道如何在linux进行C语言的编写和使用?
  • LINUX下语言的困惑(超菜)
  • 初学Linux要看什么书?, 请问Linux下C语言编程怎么设置环境?
  • LINUX新手提问,如何在LINUX下添加语言项?
  • linux新手想请问大家你们在linux下通常用什么开发语言和工具(C多点还是C++多点还是pascal ?还有工具方面?)
  • LINUX下 C语言编程中 DIR 是做什么用的~?
  • 谁能简单介绍一下LINUX上的各种语言脚本的功能.
  • 什样在linux中学习c语言?
  • linux下的汇编语言的软件是什么?
  • redhat linux中如何卸载语言?
  • 安装Linux,界面一直停留在选择语言的界面
  • Linux启动过程到哪个阶段之后的源代码全是C语言而不是汇编写的?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux下通过crond实现自动执行程序
  • Linux和Unix相对WIN、NETWARE有什么好处?他们之间有什么区别?WIN、NETWARE能实现的功能LINUX和UNIX能实现吗?
  • Linux下c函数dlopen实现加载动态库so文件代码举例
  • linux下如实现与window下的驱动器实现文件共享??
  • Linux内存文件系统(ramdisk)的三种实现方式
  • windows 下的PortTunnel 在linux下怎么实现?或者相应的已经实现的软件?端口映射
  • linux内存文件系统ramfs实现原理
  • 在linux下如何编程实现nslookup命令实现的IP地址和域名互相转换的功能?
  • Linux 共享内存介绍及实现代码
  • 我需要一个模型,在 LINUX C 下。实现线程间的控制,执行,阻塞,再执行。。。。。不知道如何实现。
  • linux下grep命令实现查找多个关键字(与关系和或关系)
  • 我想做linux下的还原备份,实现与还原精灵虚拟还原等一样的功能,应该怎么做?另外现在有实现这种功能的成熟产品是哪一种?
  • Linux c socket编程:简单的客户端(client)和服务端(server)实现
  • 关于linux c程序实现自动实现telnet的问题
  • 请问高手linux中用md5来实现一串字符串的加密,用c++/c实现
  • 在linux实现在任意给定的目录查找文需要的件的程序? 下面的实现思路可不可以呢????
  • 请问:有没有人在Linux下实现过计费网关?
  • 关于XP系统下批处理文件如何实现执行linux下脚本,从而实现版本的自动化编译
  • 如何在linux下实现event事件机制
  • Linux音频, Linux下能否实现 实时语音聊天 ?
  • 想设计几个简单的通信程序,在linux环境下编译通信,怎么实现?
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3