📄 146.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>123</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center"> ● UNIX网络编程 (BM: clown) </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="135.htm">上一层</a>][<a href="147.htm">下一篇</a>]
<hr><p align="left"><small>发信人: guru (好读书,不求甚解), 信区: UNP <br>
标 题: myxray.c <br>
发信站: UNIX编程 (2001年08月07日16:24:07 星期二), 站内信件 <br>
<br>
发信人: sztcww (姑苏一鬼), 信区: Socket <br>
标 题: myxray.c <br>
发信站: 华南网木棉站 (Thu Feb 17 22:54:46 2000), 转信 <br>
<br>
上学期,SCZ大哥老是叫我抓几个包看看 <br>
可是我苦于找不到工具,找到了又下不下来 <br>
于是自己乱拼了个程序,酬和着能用吧 <br>
程序使用说明如下 <br>
myxray dstip <br>
给出目的地址是dstip的所有包的头结构的数据 <br>
包括以太侦头,arp包,ip包,tcp包,udp包,icmp包 <br>
各个字段的值 <br>
<br>
该程序在REDHAT 6.0下编译通过 <br>
//myxray.c <br>
#include <netdb.h> <br>
#include <sys/socket.h> <br>
#include <sys/types.h> <br>
#include <stdio.h> <br>
#include <errno.h> <br>
#include <sys/ioctl.h> <br>
#include <net/if.h> <br>
#include <signal.h> <br>
#include <netinet/ip.h> <br>
#include <netinet/in.h> <br>
#include <string.h> <br>
#include <arpa/inet.h> <br>
#include <netinet/if_ether.h> <br>
#include <netinet/ip_icmp.h> <br>
#define __FAVOR_BSD <br>
#include <netinet/tcp.h> <br>
#include <netinet/udp.h> <br>
#define PACKET_SIZE 4096 <br>
#define ETH_HW_ADDR_LEN 6 <br>
#define IP_ADDR_LEN 4 <br>
struct arp_packet <br>
{ <br>
u_char targ_hw_addr[ETH_HW_ADDR_LEN]; <br>
u_char src_hw_addr[ETH_HW_ADDR_LEN]; <br>
u_short frame_type; <br>
u_short hw_type; <br>
u_short prot_type; <br>
u_char hw_addr_size; <br>
u_char prot_addr_size; <br>
u_short op; <br>
u_char sndr_hw_addr[ETH_HW_ADDR_LEN]; <br>
u_char sndr_ip_addr[IP_ADDR_LEN]; <br>
u_char rcpt_hw_addr[ETH_HW_ADDR_LEN]; <br>
u_char rcpt_ip_addr[IP_ADDR_LEN]; <br>
u_char padding[18]; <br>
} ; <br>
void leave(); <br>
char * <br>
hwaddr (unsigned char *,char *); <br>
int fd_recv = -1 ; <br>
struct ifreq ifr,ifr_old; <br>
main(int argc, char *argv[]) <br>
{ <br>
char device[] = "eth0"; // ethernet device name <br>
char protocol[16]; <br>
u_char buf_recv[PACKET_SIZE]; // buffer for receive <br>
u_short i = 0; // packet number <br>
int ihl; <br>
int ihl; <br>
int ethprotol; <br>
int ipfragoff,df,mf; <br>
int protol; <br>
char buf1[20],buf2[20]; <br>
char strptr[255]; <br>
char *srcaddr,*dstaddr; <br>
struct ethhdr *eth ; <br>
struct arp_packet *arphead; <br>
struct udphdr *udp; <br>
struct icmp *icmphdr; <br>
struct iphdr * ip; <br>
struct tcphdr * tcp1; <br>
struct in_addr in1; <br>
struct in_addr in2; <br>
int from_len, datalen; <br>
struct sockaddr from; <br>
if (argc!=2) { <br>
printf("Hi,dear friends,tell me your advice Good Luck\n"); <br>
printf("Usage:%s dstIP \n",argv[0]); <br>
exit(-1); <br>
} <br>
fd_recv = socket(AF_INET, SOCK_PACKET, htons(0x0003)); <br>
if (fd_recv < 0) { perror( "packet socket error"); exit(-1); } <br>
strcpy(ifr.ifr_name, device); <br>
if (ioctl(fd_recv, SIOCGIFFLAGS, &ifr) < 0 ) { <br>
perror("ioctl SIOCGIFFLAGS error"); <br>
if (fd_recv >= 0) close(fd_recv); <br>
exit(-1); <br>
} <br>
ifr_old = ifr; <br>
ifr.ifr_flags |= IFF_PROMISC; <br>
if (ioctl(fd_recv, SIOCSIFFLAGS, &ifr) < 0 ) { <br>
perror("ioctl SIOCSIFFLAGS error"); <br>
if (fd_recv >= 0) close(fd_recv); <br>
exit(-1); <br>
} <br>
signal(SIGINT, leave); <br>
signal(SIGTERM, leave); <br>
AGAIN: <br>
bzero(&from, sizeof(from)); <br>
from_len = sizeof(from); <br>
bzero(buf_recv, PACKET_SIZE); <br>
datalen = recvfrom(fd_recv, (char *)buf_recv, 4096, 0, <br>
&from, &from_len); <br>
if (datalen < 0) { <br>
perror("recvfrom error"); <br>
exit(-1); <br>
} <br>
buf_recv[datalen] = '\0'; <br>
//if (strcmp(device, from.sa_data) != 0) goto AGAIN; <br>
eth=(struct ethhdr *)buf_recv; <br>
ethprotol=ntohs(eth->h_proto); <br>
if (ethprotol==0x0806){//arp <br>
arphead=(struct arp_packet *)buf_recv; <br>
memcpy(&in1,arphead->sndr_ip_addr, IP_ADDR_LEN); <br>
memcpy(&in2,arphead->rcpt_ip_addr, IP_ADDR_LEN); <br>
srcaddr=inet_ntoa(in1); <br>
dstaddr=inet_ntop(AF_INET,&in2,strptr,sizeof(strptr)); <br>
if (strcmp(dstaddr,argv[1])==0) <br>
{ <br>
printf("ethhdr\nsrchw:%s--->dsthw:%s proto:%xH\n", <br>
hwaddr(eth->h_source,buf1),hwaddr(eth->h_dest,buf2),ethprotol); <br>
printf("arphdr\nhwtype:%d protol:%xH hw_size:%d pro_size:%d <br>
op:%d\ns_ha:%s s_ip:%s\nd_ha:%s d_ip:%s\n",ntohs(arphead->hw_type), <br>
ntohs(arphead->prot_type),arphead->hw_addr_size, <br>
arphead->prot_addr_size,ntohs(arphead->op), <br>
hwaddr(arphead->sndr_hw_addr,buf1),srcaddr, <br>
hwaddr(arphead->rcpt_hw_addr,buf2),dstaddr); <br>
printf("-----------------------------------------------------------\n"); <br>
} <br>
goto AGAIN; <br>
} <br>
ip = (struct iphdr *)&buf_recv[14]; <br>
ihl = (int)ip->ihl << 2; <br>
in1.s_addr = ip->saddr; <br>
in2.s_addr = ip->daddr; <br>
srcaddr=inet_ntoa(in1); <br>
dstaddr=inet_ntop(AF_INET,&in2,strptr,sizeof(strptr)); <br>
if (strcmp(dstaddr,argv[1])==0) <br>
{ <br>
//do with ethhdr data <br>
printf("ethhdr\nsrchw:%s--->dsthw:%s proto:%xH\n",hwaddr(eth->h_source,buf1), <br>
hwaddr(eth->h_dest,buf2),ethprotol); <br>
//iphdr <br>
protol=ip->protocol; <br>
ipfragoff=ntohs(ip->frag_off); <br>
df=ipfragoff&IP_DF; <br>
mf=ipfragoff&IP_MF; <br>
if (df!=0) df=1; <br>
if (mf!=0) mf=1; <br>
printf("iphdr\nver:%d ihl:%d tos:%d tot_len:%d id:%d df:%d mf:%d <br>
fragoff:%d TTL:%d proto:%d\nsrcaddr:%s dstaddr:%s\n",ip->version,ip->ihl, <br>
ip->tos,ntohs(ip->tot_len),ntohs(ip->id),df,mf,ipfragoff&IP_OFFMASK,ip->ttl, <br>
protol,srcaddr,dstaddr); <br>
if (protol==6){//tcp <br>
//tcphdr <br>
tcp1 = (struct tcphdr *)&buf_recv[14 + ihl]; <br>
printf("tcphdr\nsrcport:%d dstport:%d seq:%u ack:%u off:%d <br>
flag:%d win:%d\n",ntohs(tcp1->th_sport),ntohs(tcp1->th_dport), <br>
ntohl(tcp1->th_seq),ntohl(tcp1->th_ack),tcp1->th_off, <br>
tcp1->th_flags,ntohs(tcp1->th_win)); <br>
printf("-----------------------------------------------------------\n"); <br>
} <br>
if (protol==1){//icmp <br>
icmphdr=(struct icmp *)&buf_recv[14 + ihl]; <br>
printf("icmp\ntype:%d code:%d\n",icmphdr->icmp_type,icmphdr->icmp_code); <br>
printf("-----------------------------------------------------------\n"); <br>
} <br>
if (protol==17){//udphdr <br>
udp= (struct udphdr *)&buf_recv[14 + ihl]; <br>
printf("udphdr\nsport:%d dsport:%d len:%d\n",ntohs(udp->uh_sport), <br>
ntohs(udp->uh_dport),ntohs(udp->uh_ulen)); <br>
printf("-----------------------------------------------------------\n"); <br>
} <br>
fflush(stdout); <br>
} <br>
goto AGAIN; <br>
} <br>
char * <br>
hwaddr (unsigned char * s,char *d) <br>
{ <br>
sprintf (d, "%02X:%02X:%02X:%02X:%02X:%02X", s[0], s[1], s[2], s[3], <br>
s[4], s[5]); <br>
return d; <br>
} <br>
void leave() <br>
{ <br>
if (ioctl(fd_recv, SIOCSIFFLAGS, &ifr_old) < 0) { <br>
perror("ioctl SIOCSIFFLAGS error"); <br>
} <br>
if (fd_recv > 0) close(fd_recv); <br>
printf("process terminamted.\n"); <br>
exit(0); <br>
} <br>
-- <br>
Target Locked:Guru In Darkness. <br>
我只是一只静静卧着的狮子。。。 <br>
※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 202.114.36.224] <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="135.htm">上一层</a>][<a href="147.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 + -