📄 406.htm
字号:
ctl.len = sizeof(struct sockaddr); <br>
ctl.buf = (char *)&sa; <br>
bp = buf; <br>
<br>
iph.ip_v = IPVERSION; <br>
iph.ip_hl = 5; /* 20 octets--no options */ <br>
iph.ip_tos = htons(0); /* No special service */ <br>
iph.ip_len = htons(40); <br>
iph.ip_id = htons(27); /* "unique" identification */ <br>
iph.ip_off = htons(0); <br>
iph.ip_ttl = htons(60); <br>
iph.ip_p = htons(IPPROTO_TCP); <br>
iph.ip_dst.s_addr = server->sin_addr.s_addr; <br>
gethostname(buf, 2048); <br>
he = gethostbyname(buf); <br>
bcopy((char *)he->h_addr, <br>
(char *)&iph.ip_src.s_addr, <br>
sizeof(iph.ip_src.s_addr)); <br>
iph.ip_sum = 0; <br>
iph.ip_sum = htons(in_cksum_c(&iph, (iph.ip_hl << 2))); <br>
bcopy((char *)&iph, bp, sizeof(struct ip)); <br>
bp += sizeof(struct ip); <br>
oldbp = bp; <br>
computed=1; <br>
} /* if !computed */ <br>
/* Set up the TCP header */ <br>
bp = oldbp; <br>
tcph.th_sport = 5894; /* Random number */ <br>
tcph.th_dport = server->sin_port; <br>
tcph.th_seq = 59595; /* Random number */ <br>
tcph.th_ack = 0; <br>
tcph.th_off = 5; <br>
tcph.th_flags = TH_SYN; <br>
tcph.th_win = 4096; <br>
tcph.th_sum = 0; <br>
/* Calculate the TCP checksum on the TCP pseudoheader*/ <br>
pbp=pbuf; <br>
pbp=pbuf; <br>
bcopy((char *)&iph.ip_src.s_addr, pbp, 4); <br>
pbp+=4; <br>
bcopy((char *)&iph.ip_dst.s_addr, pbp, 4); <br>
pbp+=4; <br>
*pbp=0; <br>
pbp++; <br>
*pbp=(char)iph.ip_p; <br>
pbp++; <br>
*(u_short *)pbp=(u_short)sizeof(struct tcphdr); <br>
pbp+=2; /* go past the u_short */ <br>
bcopy((char *)&tcph, pbp, sizeof(struct tcphdr)); <br>
pbp+=sizeof(struct tcphdr); <br>
if ((pbp-pbuf)%2) { <br>
*pbp=(char)0; <br>
pbp++; <br>
} <br>
tcph.th_sum = htons(in_cksum_c(pbuf, (int)(pbp-pbuf))); <br>
<br>
bcopy((char *)&tcph, bp, sizeof(struct tcphdr)); <br>
bp += sizeof(struct tcphdr); <br>
<br>
datah.len = (int)(bp-buf); <br>
datah.buf = (char *)buf; <br>
<br>
if (putmsg(fd, &ctl, &datah, 0) < 0) { <br>
perror("putmsg (ctl)"); <br>
switch(errno) { <br>
case EAGAIN: fprintf(stderr,"EAGAIN\n");break; <br>
case EBADF: fprintf(stderr,"Bad FD\n");break; <br>
case EFAULT: fprintf(stderr,"Bad ctlptr or dataptr\n");break; <br>
case EINTR: fprintf(stderr,"Signal caught\n");break; <br>
case EINVAL: fprintf(stderr,"undefined flag\n");break; <br>
case ENOSTR: fprintf(stderr,"No stream\n");break; <br>
case ENXIO: fprintf(stderr,"hangup downstream\n");break; <br>
case ERANGE: fprintf(stderr,"data size problem\n");break; <br>
} <br>
exit(1); <br>
} <br>
/* Now that we've sent the syn, scan all return packets for reply */ <br>
if (!setjmp(env_buf)) { <br>
signal(SIGALRM, handle_alarm, -1); <br>
alarm(1); <br>
retval=scan_return(fd, &iph, &tcph); <br>
alarm(0); <br>
alarm(0); <br>
} else retval=1; <br>
return(retval); <br>
} <br>
<br>
int fakeconnect(server, servername) <br>
/* <br>
* Fake the connection, return 1 on failure, 0 on success <br>
*/ <br>
struct sockaddr_in *server; <br>
char *servername; <br>
{ <br>
static int if_fd = -1; <br>
char *device=0; <br>
u_long localnet; <br>
u_long netmask; <br>
int linktype; <br>
char *lookup_device(); <br>
void lookup_net(); <br>
<br>
if (if_fd == -1) { <br>
if (device==0) { <br>
device = lookup_device(); <br>
if (device == 0) <br>
perror("can't find any interfaces"); <br>
} <br>
if_fd = initdevice(device, &linktype); <br>
lookup_net(device, &localnet, &netmask); <br>
} <br>
return(send_packet(if_fd, server, servername, localnet, netmask)); <br>
} <br>
<br>
<br>
/* ====================== begin nasty NIT stuff ======================= */ <br>
<br>
<br>
/* Not all systems have IFF_LOOPBACK */ <br>
#ifdef IFF_LOOPBACK <br>
#define ISLOOPBACK(p) ((p)->ifr_flags & IFF_LOOPBACK) <br>
#else <br>
#define ISLOOPBACK(p) (strcmp((p)->ifr_name, "lo0") == 0) <br>
#endif <br>
<br>
char *lookup_device() <br>
{ <br>
{ <br>
struct ifreq ibuf[16], *ifrp, *ifend, *mp; <br>
struct ifconf ifc; <br>
int fd; <br>
int minunit, n; <br>
char *cp; <br>
static char device[sizeof(ifrp->ifr_name)]; <br>
<br>
fd = socket(AF_INET, SOCK_DGRAM, 0); <br>
if (fd < 0) { <br>
perror("newscan: socket"); <br>
exit(1); <br>
} <br>
ifc.ifc_len = sizeof(ibuf); <br>
ifc.ifc_buf = (caddr_t)ibuf; <br>
<br>
if (ioctl(fd, SIOCGIFCONF, (char *)&ifc) < 0 || <br>
ifc.ifc_len < sizeof(struct ifreq)) { <br>
perror("newscan: SIOCGIFCONF: "); <br>
exit(1); <br>
} <br>
ifrp = ibuf; <br>
ifend = (struct ifreq *)((char *)ibuf + ifc.ifc_len); <br>
<br>
mp = 0; <br>
minunit = 666; <br>
while (ifrp < ifend) { <br>
struct ifreq ifr; <br>
/* <br>
* Need a template to preserve address info that is <br>
* used below to locate the next entry. (Otherwise, <br>
* SIOCGIFFLAGS stomps over it because the requests <br>
* are returned in a union.) <br>
*/ <br>
bcopy(ifrp->ifr_name, ifr.ifr_name, sizeof(ifr.ifr_name)); <br>
if (ioctl(fd, SIOCGIFFLAGS, (char *)&ifr) < 0) { <br>
fprintf(stderr, "newscan: SIOCGIFFLAGS: "); <br>
perror(ifrp->ifr_name); <br>
exit(1); <br>
} <br>
if ((ifr.ifr_flags & IFF_UP) && !ISLOOPBACK(&ifr)) { <br>
for (cp = ifrp->ifr_name; !isdigit(*cp); ++cp) <br>
; <br>
n = atoi(cp); <br>
if (n < minunit) { <br>
minunit = n; <br>
mp = ifrp; <br>
} <br>
} <br>
#if BSD >= 199006 <br>
n = ifrp->ifr_addr.sa_len + sizeof(ifrp->ifr_name); <br>
if (n < sizeof(*ifrp)) <br>
++ifrp; <br>
else <br>
ifrp = (struct ifreq *)((char *)ifrp + n); <br>
#else <br>
++ifrp; <br>
#endif <br>
} <br>
close(fd); <br>
if (mp == 0) <br>
return (0); <br>
<br>
(void)strcpy(device, mp->ifr_name); <br>
return (device); <br>
} <br>
<br>
<br>
/* <br>
* Get the netmask of an IP address. This routine is used if <br>
* SIOCGIFNETMASK doesn't work. <br>
*/ <br>
static u_long <br>
ipaddrtonetmask(addr) <br>
u_long addr; <br>
{ <br>
char str[80]; <br>
<br>
if (IN_CLASSA(addr)) <br>
return (IN_CLASSA_NET); <br>
if (IN_CLASSB(addr)) <br>
return (IN_CLASSB_NET); <br>
if (IN_CLASSC(addr)) <br>
return (IN_CLASSC_NET); <br>
sprintf(str,"unknown IP address class: %08X", addr); <br>
perror(str); <br>
/* NOTREACHED */ <br>
} <br>
<br>
void <br>
void <br>
lookup_net(device, netp, maskp) <br>
char *device; <br>
u_long *netp; <br>
u_long *maskp; <br>
{ <br>
int fd; <br>
struct ifreq ifr; <br>
struct sockaddr_in *sin = (struct sockaddr_in *)&ifr.ifr_addr; <br>
<br>
/* Use data gram socket to get IP address. */ <br>
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { <br>
perror("newscan: socket"); <br>
exit(1); <br>
} <br>
(void)strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name)); <br>
if (ioctl(fd, SIOCGIFADDR, (char *)&ifr) < 0) { <br>
/* <br>
* This will fail if an IP address hasn't been assigned. <br>
*/ <br>
*netp = 0; <br>
*maskp = 0; <br>
return; <br>
return; <br>
} <br>
*netp = sin->sin_addr.s_addr; <br>
if (ioctl(fd, SIOCGIFNETMASK, (char *)&ifr) < 0) <br>
*maskp = 0; <br>
else <br>
*maskp = sin->sin_addr.s_addr; <br>
if (*maskp == 0) <br>
*maskp = ipaddrtonetmask(*netp); <br>
*netp &= *maskp; <br>
(void)close(fd); <br>
} <br>
<br>
u_long snaplen = 0; <br>
<br>
int <br>
initdevice(device,linktype) <br>
char *device; <br>
int *linktype; <br>
{ <br>
struct strioctl si; /* struct for ioctl() */ <br>
struct timeval timeout; /* timeout for ioctl() */ <br>
struct ifreq ifr; /* interface request struct */ <br>
u_long if_flags; /* modes for interface */ <br>
int ret; <br>
/* int chunksize = (8*1024); */ <br>
int chunksize = 0; <br>
int if_fd; <br>
char *dev = "/dev/nit"; <br>
int nonblock; <br>
<br>
struct ether_header eh; <br>
struct ip iptest; <br>
struct packetfilt pf; <br>
register u_short *fwp = pf.Pf_Filter; <br>
u_short ethoffset; <br>
u_short ipoffset; <br>
u_short masker = 255; <br>
<br>
si.ic_timout = INFTIM; <br>
<br>
/* Set up the Packet Filter */ <br>
ethoffset=((u_int)&eh.ether_type-(u_int)&eh.ether_dhost)/(sizeof(u_short)); <br>
ipoffset = 11; <br>
*fwp++ = ENF_PUSHZERO; <br>
*fwp++ = ENF_PUSHWORD + ethoffset; <br>
*fwp++ = ENF_PUSHLIT; <br>
*fwp++ = htons(ETHERTYPE_IP); <br>
*fwp++ = ENF_COR; <br>
*fwp++ = ENF_PUSHWORD + ipoffset; <br>
*fwp++ = ENF_PUSHLIT; <br>
*fwp++ = (u_short)255; <br>
*fwp++ = ENF_AND; <br>
*fwp++ = ENF_PUSHLIT; <br>
*fwp++ = (u_short)6; <br>
*fwp++ = ENF_COR; <br>
*fwp++ = ENF_PUSHLIT; <br>
*fwp++ = (u_short)1; <br>
<br>
/* open /dev/nit Read/write */ <br>
if ((if_fd = open(dev, O_RDWR)) < 0) { <br>
(void) fprintf(stderr, "newscan: open: "); <br>
perror(dev); <br>
exit(-1); <br>
} <br>
<br>
/* arrange to get discrete messages from the STREAM and use NIT_BUF */ <br>
ioctl(if_fd, I_SRDOPT, (char*)RMSGD); <br>
<br>
/* it is important to have this stuff in the stream BEFORE! the nbuf */ <br>
si.ic_cmd = NIOCSETF; <br>
si.ic_len = sizeof(struct packetfilt); <br>
si.ic_dp = (char*)&pf; <br>
pf.Pf_FilterLen = fwp - &pf.Pf_Filter[0]; <br>
if (ioctl(if_fd, I_PUSH, "pf")<0) { <br>
perror("I_PUSH pf"); <br>
fprintf(stderr,"No pf being used\n"); <br>
} else { <br>
if ((ioctl(if_fd, I_STR, (char*)&si)) < 0) { <br>
perror("newscan: NIOCSETF"); <br>
/* exit(-1); */ <br>
fprintf(stderr,"No pf being used (or one already applied)\n"); <br>
} <br>
} <br>
<br>
ioctl(if_fd, I_PUSH, "nbuf"); <br>
<br>
/* set the timeout */ <br>
timeout.tv_sec = 1; <br>
timeout.tv_usec = 0; <br>
si.ic_cmd = NIOCSTIME; <br>
si.ic_len = sizeof(timeout); <br>
si.ic_dp = (char*)&timeout; <br>
if ((ret = ioctl(if_fd, I_STR, (char*)&si)) < 0) { <br>
perror("newscan: NIOCSTIME"); <br>
exit(-1); <br>
} <br>
<br>
/* set the chunksize */ <br>
si.ic_cmd = NIOCSCHUNK; <br>
si.ic_len = sizeof(chunksize); <br>
si.ic_dp = (char*)&chunksize; <br>
if ((ret = ioctl(if_fd, I_STR, (char*)&si)) < 0) { <br>
perror("newscan: NIOCSCHUNK"); <br>
exit(-1); <br>
} <br>
<br>
/* Set up the NIT device (bind it,set snapshot length etc) */ <br>
/* bind the interface */ <br>
strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name)); <br>
ifr.ifr_name[sizeof(ifr.ifr_name) - 1] = ' '; <br>
si.ic_cmd = NIOCBIND; <br>
si.ic_len = sizeof(ifr); <br>
si.ic_dp = (char*)𝔦 <br>
if ((ret = ioctl(if_fd, I_STR, (char*)&si)) < 0) { <br>
(void) fprintf(stderr, "newscan: NIOCBIND"); <br>
perror(ifr.ifr_name); <br>
exit(1); <br>
} <br>
<br>
/* set the snapshot length */ <br>
si.ic_cmd = NIOCSSNAP; <br>
si.ic_len = sizeof(snaplen); <br>
si.ic_dp = (char*)&snaplen; <br>
if ((ret = ioctl(if_fd, I_STR, (char*)&si)) < 0) { <br>
perror("newscan: NIOCSSNAP"); <br>
exit(1); <br>
} <br>
<br>
/* set the interface flags */ <br>
si.ic_cmd = NIOCSFLAGS; <br>
if_flags = NI_TIMESTAMP | NI_LEN | NI_DROPS; <br>
if_flags |= NI_PROMISC; <br>
si.ic_len = sizeof(if_flags); <br>
si.ic_dp = (char*)&if_flags; <br>
if ((ioctl(if_fd, I_STR, (char*)&si)) < 0) { <br>
perror("newscan: NIOCSFLAGS"); <br>
exit(1); <br>
} <br>
<br>
nonblock = 1; <br>
ioctl(if_fd, FIONBIO,&nonblock); <br>
<br>
ioctl(if_fd, I_FLUSH, (char*)FLUSHR); <br>
/* <br>
* NIT supports only ethernets. <br>
*/ <br>
*linktype = 1; <br>
<br>
return if_fd; <br>
} <br>
<br>
-- <br>
※ 来源:.武汉白云黄鹤站 bbs.whnet.edu.cn.[FROM: 202.114.208.83] <br>
-- <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="316.htm">上一层</a>][<a href="407.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -