[C++]VC自定义发IP包例子

/************************************
*自定义发IP包例子(TCP/IP包发送)
*给目标主机的端口发送一个 syn请求,
*注意目标主机的信息会发给发送IP地址的主机
*这说明TCP/IP协议本身有IP期骗的漏洞
*这种方运可以自己写成特殊的基于IP协议上层的自定义协议
************************************/
 
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netinet/ip.h>   //ip
#include <netinet/tcp.h> //tcp
#include <stdlib.h>
 
//发送端IP
char  srcip[]= "100.100.100.100" ;
//目标端IP
char  dstip[]= "192.168.11.220" ;
//发送端IP端口
int  srcport=25;
//目标IP端口
int  dstport=99;
 
//以下是从ip.h和tcp.h取的,但BSD和LINUX用的名称有些不一样主要是TCP不一样
 
typedef  struct  _IP
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
     unsigned int  ip_hl:4;               //little-endian IP头长度(单位为32位)4位
     unsigned int  ip_v:4;                //版本号4 IP4用4
#endif
#if __BYTE_ORDER == __BIG_ENDIAN
     unsigned int  ip_v:4;                // version
     unsigned int  ip_hl:4;               // header length
#endif
     u_int8_t ip_tos;                    //服务类型  一般为0
     u_short ip_len;                     //数据总长度 (单位为32位)
     u_short ip_id;                      //标识16
     u_short ip_off;                     //分段偏移
#define IP_RF 0x8000                    // reserved fragment flag  //标志
#define IP_DF 0x4000                    // dont fragment flag
#define IP_MF 0x2000                    // more fragments flag
#define IP_OFFMASK 0x1fff               // mask for fragmenting bits
     u_int8_t ip_ttl;                    //生存时间
     u_int8_t ip_p;                      //传输协议 tcp是6
     u_short ip_sum;                     //头校验和
     struct  in_addr ip_src, ip_dst;      // 源地址 目标地址
}IP;
 
typedef  struct  _TCPHeader
{
     u_int16_t source;               // 源端口
     u_int16_t dest;                 // 目的端口
     tcp_seq seq;                    // 序号
     tcp_seq ack_seq;                // 确认号 收到的TCP信息的序号+1
#if __BYTE_ORDER == __LITTLE_ENDIAN
     u_int16_t res1:4;               //保留
     u_int16_t doff:4;               //保留
     u_int16_t fin:1;                //标志 结束
     u_int16_t syn:1;                //标志 同步
     u_int16_t rst:1;                //标志 重置
     u_int16_t psh:1;                //标志 入栈
     u_int16_t ack:1;                //标志 确认
     u_int16_t urg:1;                //标志 紧急
     u_int16_t res2:2;
#elif __BYTE_ORDER == __BIG_ENDIAN
     u_int16_t doff:4;
     u_int16_t res1:4;
     u_int16_t res2:2;
     u_int16_t urg:1;
     u_int16_t ack:1;
     u_int16_t psh:1;
     u_int16_t rst:1;
     u_int16_t syn:1;
     u_int16_t fin:1;
#else
#error  "Adjust your <bits/endian.h> defines"
#endif
     u_int16_t window;           //窗口
     u_int16_t check;            //校验和
     u_int16_t urg_ptr;          //紧急指针
}TCPHeader;
 
//校验和函数 ip头
unsigned short  IPCheakSum (unsigned short  *packet, int  packlen)
{
     register  unsigned long  sum = 0;
     while  (packlen > 1) {
         sum+= *(packet++);
         packlen-=2;
     }
     if  (packlen > 0)
         sum += *(unsigned char  *)packet;
     while  (sum >> 16)
         sum = (sum & 0xffff) + (sum >> 16);
 
     return  (unsigned short ) ~sum;
}
//校验和函数 tcp头
unsigned short  TCPCheckSum (unsigned char  *iphdr, unsigned short  *packet, int  packlen)
{
     unsigned short  *buf;
     unsigned short  res;
     buf = malloc (packlen+12);
     if (buf == NULL) return  0;
     memcpy (buf,iphdr+12,8); //源IP地址和目标IP地址
     *(buf+4)=htons((unsigned short )(*(iphdr+9)));
     *(buf+5)=htons((unsigned short )packlen);
     memcpy (buf+6,packet,packlen);
     res = IPCheakSum(buf,packlen+12);
     free (buf);
     return  res;
}
 
int  main()
{
     int  sock, bytes_send, fromlen,n,id,s;
     unsigned char  buffer[65535];
     sockaddr_in toaddr;
     IP *ip;
     TCPHeader *tcp;
     for  (n=0;n<60000;n++ )
     {
         buffer[n]=0;
     }
     //发送地址
     toaddr.sin_family =AF_INET;
     //        inet_aton("192.168.11.38",&toaddr.sin_addr);   //字符串转入地址
     inet_aton(dstip,&toaddr.sin_addr);   //字符串转入地址
     //建立原始TCP包方式IP+TCP信息包
     sock = socket(AF_INET, SOCK_RAW,IPPROTO_RAW);   //IP方式
     //     sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);
     if  (sock>0) { printf ( "socket ok\n" );}
     else  { printf  ( "socket error \n" );}
     n=1;
     if  (setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &n, sizeof (n)) < 0) {
         printf ( "2" );
         perror ( "IP_HDRINCL" );
         exit (1);
     }
     ip=( struct  ip *)buffer;
     ip->ip_id=0x9911;              
     ip->ip_v=4;
     ip->ip_hl=5;                          
     ip->ip_ttl=36;                        
     ip->ip_p=6;     //tcp 为6
     ip->ip_len=htons(60);
     inet_aton(dstip,&ip->ip_dst);
     //        inet_aton("192.168.11.38",&ip->ip_dst);
     tcp = ( struct  tcphdr *)(buffer + (4*ip->ip_hl));
     tcp->source=htons(srcport);                            //源端口
     tcp->dest=htons(dstport); 
     tcp->seq=htons(0x9990);
     tcp->doff=0x15;
     tcp->ack_seq=0;
     tcp->syn=1;
     tcp->window=htons(0x20);
     inet_aton(srcip,&ip->ip_src);
 
     //        ip->ip_src.s_addr=htonl(0x09010101+n);
     tcp->check=0x0;      
     tcp->check=TCPCheckSum((unsigned char  *)buffer, (unsigned short  *)tcp,40);
     ip->ip_sum=0;
     ip->ip_sum=IPCheakSum((unsigned short  *)buffer,20);
     bytes_send=sendto(sock,buffer,60,0,( struct  sockaddr *)&toaddr, sizeof (toaddr));   
 
     if  (bytes_send>0)
     {
         printf ( "OK bytes_send %d \n" ,bytes_send);
         printf ( "IP_source address ::: %s \n" ,inet_ntoa(ip->ip_src));
         printf ( "IP_dest address ::: %s \n" ,inet_ntoa(ip->ip_dst));
     }
}

本文转自静默虚空博客园博客,原文链接:http://www.cnblogs.com/jingmoxukong/articles/2119536.html,如需转载请自行联系原作者


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值