LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: home

请问ICMP报文有多少字节?

[复制链接]
发表于 2003-11-8 19:04:37 | 显示全部楼层
如果要这样子的话,其实问题多多,比如你冒充A主机的ip向某一个非本地的网络上的主机发出请求,那么当对方发回还有这个主机A的ip地址的数据报的时候,还要涉及到ARP,所以说还要解决这一步,关于IP欺骗偶也不了解,只是凭现有的知识推断一下。

proxy ARP也可以说是一种IP欺骗的技术,另外,gratuitous ARP则是用于防止在同一个subnet上出现相同的IP
发表于 2003-11-8 21:23:14 | 显示全部楼层

ip 欺骗的话 好像要占领一个中间的路由才有可能

ip 欺骗的话 好像要占领一个中间的路由才有可能
发表于 2003-11-8 21:26:38 | 显示全部楼层

arp 和rarp 好像不是tcp/ip 所必须的 这只是以太网这类共享媒体所需要的

arp 和rarp 好像不是tcp/ip 所必须的 这只是以太网这类共享媒体所需要的
发表于 2003-11-8 23:20:15 | 显示全部楼层
arp是一个一般性的协议,可以用于其他类型的网络以及解析其他类型的高层地址。
从ARP的hard type和protocol type字段就可以看出这一点
 楼主| 发表于 2003-11-8 23:30:33 | 显示全部楼层
arp AND rarp都是基础的协议,所有的网络协议都需要这两个协议吧:ask :ask
发表于 2003-11-8 23:57:24 | 显示全部楼层
对于Ethernet来说,arp是不能少的,至于RARP,BOOTP可以用来代替,而且可以比RARP提供更多的信息,比如subnet mark。

之所以有ARP,是因为IP和MAC地址之间没有什么联系,是彼此独立的,如果IP可以通过某种数学运算可以推导出MAC,那么ARP就不需要啦
发表于 2003-11-9 11:50:51 | 显示全部楼层
/*
This program sends out one ARP packet with
source/target IP  and Ethernet hardware addresses
suuplied by the user. It  compiles and works on
Linux and will probably work on any  Unix that has
SOCK_PACKET. volobuev@t1.chem.umn.edu  */
#include <netdb.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdio.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <signal.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/ip_icmp.h>
#include <linux/if_ether.h>
#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. yuri volobuev  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,1);  
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++;
}
}





这个arp用了没什么效果!!谁知道怎么使用啊??
发表于 2003-11-9 13:17:55 | 显示全部楼层
这个程序能让你发送一些由你自己定义源/目的IP的ARP,比如你的IP是1.1.1.1,还有一台主机的是2.2.2.2,当2.2.2.2想和3.3.3.3通信的时候,首先他要广播一个ARP REQUEST,询问3.3.3.3的MAC是什么,因为这台主机不存在,理论上是无法通信的,那么这时候你可以伪造一个ARP REPLY,使用你自己的MAC回复,这样子你接收到了不属于你的东东
发表于 2003-11-9 16:47:14 | 显示全部楼层
具体怎么实现啊??都不知道从何入手啊~
 楼主| 发表于 2003-11-9 17:05:59 | 显示全部楼层
但要求是自己小先得到远程主机的信任。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表