查找自己的网卡:

 #include <libnet.h>
#include <stdio.h>
#include <iostream> #pragma comment(lib, "libnet.lib")
#pragma comment(lib, "wsock32.lib") int main(int argc, char **argv)
{
pcap_if_t *alldevs;
pcap_if_t *d;
int inum;
int i=;
pcap_t *adhandle;
char errbuf[PCAP_ERRBUF_SIZE]; /* Retrieve the device list */
if (pcap_findalldevs(&alldevs, errbuf) == -)
{
fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
exit();
} /* Print the list */
for(d=alldevs; d; d=d->next)
{
printf("%d. %s", ++i, d->name);
if (d->description)
printf(" (%s)\n", d->description);
else
printf(" (No description available)\n");
} if(i==)
{
printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
return -;
} printf("Enter the interface number (1-%d):",i);
scanf("%d", &inum);
cin.get(); if(inum < || inum > i)
{
printf("\nInterface number out of range.\n");
/* Free the device list */
pcap_freealldevs(alldevs);
cout << "press ENTER to Exit";
cin.get();
return -;
} /* Jump to the selected adapter */
for(d=alldevs, i=; i< inum- ;d=d->next, i++); char *device = NULL;//设备名字,此时为NULL
device=d->name;
l=libnet_init(LIBNET_LINK,device,error_inf);
//。。。 。。。 return ;
}

发送ARP reply:

转载:http://blog.csdn.net/qq372895101/article/details/13769631

参考:http://bbs.csdn.net/topics/360266138

注:将"eth0"替换成上面找到的d->name;

#include <stdio.h>
#include <libnet.h>
#define MAC_ADDR_LEN 6
#define IP_ADDR_LEN 4
//向同一网络内所有机器发送ARP REPLY包,告诉他们,23.23.23.2在00:df:17:17:17:f2那里 int main(int argc, char *argv[])
{
libnet_t *l = NULL; // libnet context char *device = "eth0";
char err_buf[LIBNET_ERRBUF_SIZE];
libnet_ptag_t p_tag;
unsigned char src_mac[MAC_ADDR_LEN]//自己机器的MAC地址
= {0x00, 0xdf, 0x17, 0x17, 0x17, 0xf2};
unsigned char dest_mac[MAC_ADDR_LEN]
= {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
char *src_ip_str = "23.23.23.2";
unsigned long src_ip, dest_ip = ;
src_ip = libnet_name2addr4(l, src_ip_str, LIBNET_RESOLVE); // create libnet environment l = libnet_init(LIBNET_LINK_ADV, device, err_buf);
if(!l)
printf("libnet_init error\n"), exit();
//构造ARP数据包 p_tag = libnet_build_arp( // construct arp packet
ARPHRD_ETHER, // hardware type ethernet
ETHERTYPE_IP, // protocol type
MAC_ADDR_LEN, // mac length
IP_ADDR_LEN, // protocol length
ARPOP_REPLY, // op type
(u_int8_t*)src_mac, // source mac addr这里作用是更新目的地的ARP表 IP-MAC
(u_int8_t*)&src_ip, // source ip addr
(u_int8_t*)dest_mac, // dest mac addr
(u_int8_t*)&dest_ip, // dest ip addr
NULL, // payload
, // payload length
l, // libnet context
//0 stands to build a new one
);
if(- == p_tag)
printf("libnet_build_arp error\n"), exit();
//以太网头部 p_tag = libnet_build_ethernet( // create ethernet header
(u_int8_t*)dest_mac, // dest mac addr
(u_int8_t*)src_mac, // source mac addr这里说明你链路层的源MAC地址,如果改了可以伪装自己
ETHERTYPE_ARP, // protocol type
NULL, // payload
, // payload length
l, // libnet context
// 0 to build a new one
);
if(- == p_tag)
printf("libnet_build_ethernet error!\n"), exit();
int res;
if(- == (res = libnet_write(l)))
printf("libnet_write error!\n"), exit();
libnet_destroy(l);
return ;
}

send arp 也可以:

  /*********send packets*******************************/
for(;;)
{
if((res=libnet_write(l))==-)
{
printf("libnet_write err!\n");
exit();
}
printf("arp packet has been sent\n");
sleep();
} /*********over and destroy**************************/
libnet_destroy(l);
return ;

(如果在linux下编译:gcc -o sendarp sendarp.c -lnet  执行:sudo ./sendarp)

-------------------------------------------------------------------------------------------------------------

转载:blog.csdn.net/xklxlmw/article/details/1620645

Libnet编程之arp扫描存活主机

winpcap获得本机mac和ip:http://www.cnblogs.com/xinsheng/archive/2012/04/18/2456098.html

---

经实验:

arp扫描时自己的ip和mac随便,但是发送出去的arp请求ip地址不能是255的广播地址,mac可以是全f,否则是有网关会回复arp-reply;

根据自己的ip网段从1到254定向发送arp请求,网内机器会回应一个arpreply,网关会回复多个(1或者254),本机不会回复arp。

  1. 交换机是否转发arp,路由器?
  2. 自己的网卡能够收到其发出去的arp请求?
  3. ip地址设为255广播地址,是否有效?
  4. 从1~254发送arp,如果没有回复,网关是否会将这些ip的mac指向自己?

0:网络号,255:广播,1/254:通常选做网关

网段内的主机会默认向网关发送arp请求。

经实验:

1.发送目的ip为255的广播arp时,只有网关会回复,并且将目的ip对应的mac设置成网关自己的mac

2.将目的ip设置成存活主机的ip,都没有返回。

3.pcap_next_ex()函数有3种返回值,=0是抓包超时(这个时间还不知道是在哪里设置的),>0是正常,

<0是出错(是在pcap_open_live()函数中设置的超时时间,到达这个时间之后,pcap_next_ex()函数的while循环就会退出)。

以太网、arp帧结构:http://www.cnblogs.com/yhl1234/archive/2008/03/04/1090726.html

http://bbs.csdn.net/topics/50489131

网关、网段、arp、ping:http://www.yunsec.net/a/school/wlcs/agreement/2011/0711/9068.html

arp/rarp  工作原理:http://blog.sina.com.cn/s/blog_6e80f1390100mf59.html

windows下libnet ARP的更多相关文章

  1. WINDOWS下绑定ARP绑定网关

    一.WINDOWS下绑定ARP绑定网关步骤一:在能正常上网时,进入MS-DOS窗口,输入命令:arp -a,查看网关的IP对应的正确MAC地址, 并将其记录下来.注意:如果已经不能上网,则先运行一次命 ...

  2. ARP之windows下的ARP命令

    ARP之windows下的ARP命令 arp -a 查看当前电脑上的ARP映射表.可以看到当前的ARP的映射关系是动态的还是静态的. arp -s w.x.y.z aa-bb-cc-dd-ee-ff ...

  3. Windows 7下的ARP

    关于Windows 7和Windows XP下的ARP绑定的不同之处网络上已经很多,没空就不多说,注意用这样的方式绑定的arp项是动态的,动态的意思就是这个项不受任何保护,Windows想什么时候更改 ...

  4. windows下编译libnet0.10.11

    以下编译基于windows下visual studio 2013 (注:编译安装完成之后发现与网上的arp教程中使用的libnet不是一个版本,这个版本太老了,最后没有使用. 网络教程上使用的是lib ...

  5. Windows下查看局域网内某台计算机的MAC地址

    我们知道在局域网中,在Windows下,查看局域网内其他主机的ip和对应mac地址的命令是: arp -a 这样可以看到ip和mac地址的对应关系,还是比较方便的 但是有些时候使用arp命令并不能列出 ...

  6. Windows下使用scapy+python2.7实现对pcap文件的读写操作

    scapy在linux环境中对pcap文件进行操作非常方便,但在windows下,特别是在python2.7环境下却会碰到各种各样的依赖包无法使用的问题,最明显的可能就属dnet和pcap的pytho ...

  7. 初尝Windows 下批处理编程

    本文叫“ 初尝Windows 下批处理编程”是为了延续上一篇“初尝 Perl”,其实对于博主而言批处理以及批处理编程早就接触过了. 本文包括以下内容 1.什么是批处理 2.常用批处理命令 3.简介批处 ...

  8. linux下libnet编程 亲自测试可用

    linux下libnet编程 亲自测试可用 亲自测试  如果build包的时候 只要把类型改了 就能改成相应的协议. 0x0800 ip 0x0806 arp 0x86DD    IPv6 0x86e ...

  9. windows下编译配置libnet-1.2-rc3

    1.下载winpcap(一个底层驱动,可以嗅探.过滤网卡数据包,发包).exe安装包,傻瓜一步式安装 2.下载WpdPack_4_1_2,这个是winpcap的开发者包,解压之后只需要配置相关路径. ...

随机推荐

  1. Python进阶:都说好用的 Python 命令行库click

    click 是一个以尽可能少的代码.以组合的方式创建优美的命令行程序的 Python 包.它有很高的可配置性,同时也能开箱即用. 它旨在让编写命令行工具的过程既快速又有趣,还能防止由于无法实现预期的 ...

  2. 设置 IntelliJ IDEA 主题

    一.选择File选项====>Settings====>Appearance====>Theme====>三选一切换主题

  3. jQuery.proxy(function,context)

    jQuery.proxy(function,context) 概述 jQuery 1.4 新增.返回一个新函数,并且这个函数始终保持了特定的作用域.大理石平台检定规程 当有事件处理函数要附加到元素上, ...

  4. 009_STM32程序移植之_内部falsh

    flash  模拟  EEPROM  实验 1. 测试环境:STM32C8T6 2. 测试接口: 3. 串口使用串口一,波特率9600 单片机引脚------------CH340引脚 VCC---- ...

  5. controller层直接通过server类调用mapper的通用方法

    自己写的方法没有,但是逆向生成的server类会有继承maybatis-plus的框架 与下图的配置有关

  6. 51nod 1412

    考虑到只与深度和点的个数有关$f[n][d]$ 表示 $n$ 个点,深度为 $d$ 的 $AVL$ 树有多少种 枚举左子树大小为 $i$, 进行转移并且深度为 $logn$ 级别 $f[n][d] = ...

  7. gitlab高可用模式

    高可用模式 企业版 社区版 我们这里说一下成本比较低的主备模式,它主要依赖的是DRBD方式进行数据同步,需要2台ALL IN ONE的GitLab服务器,也就是通过上面安装方式把所有组件都安装在一起的 ...

  8. python的协程,monkeyPatch

    monkey patch 一般指运行时候进行动态替换. 基本上我们使用gevent,会在最开头的地方加入gevent.monkey.patch_all();把标准库中的thread/socket等给替 ...

  9. Print工具类

    这篇文章已经废弃. 实际开发中,打印信息只会用日志框架(Log4j2). 受到Thinking in Java中静态引入(import static)的启发, Deolin也打算写一个方便自己的工具类 ...

  10. JAVA基础知识|堆和栈

    一.java六个存储数据的地方 1)寄存器(register):这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配.你不能直 ...