Raw Socket 之HTTP,效果不理想

Raw Socket 之HTTP,效果不理想
包已经发出,但是伪造IP,无法实现3次握手,在服务器端,包将被丢弃。继续研究。

//  stdafx.h : 标准系统包含文件的包含文件,
//  或是经常使用但不常更改的
//  特定于项目的包含文件
//

#pragma once

#include 
" targetver.h "

#include 
< stdio.h >
#include 
< tchar.h >
#include 
< iostream >  

using   namespace  std;

typedef unsigned 
short  USHORT;
typedef unsigned 
char  UCHAR;

#define  URG 0x20 
#define  ACK 0x10 
#define  PSH 0x08 
#define  RST 0x04 
#define  SYN 0x02 
#define  FIN 0x01 

typedef 
struct  ip_hdr  // 定义IP首部 

    unsigned 
char  h_verlen;  // 4位首部长度,4位IP版本号 
    unsigned  char  tos;  // 8位服务类型TOS 
    unsigned  short  total_len;  // 16位总长度(字节) 
    unsigned  short  ident;  // 16位标识 
    unsigned  short  frag_and_flags;  // 3位标志位 
    unsigned  char  ttl;  // 8位生存时间 TTL 
    unsigned  char  proto;  // 8位协议 (TCP, UDP 或其他) 
    unsigned  short  checksum;  // 16位IP首部校验和 
    unsigned  int  sourceIP;  // 32位源IP地址 
    unsigned  int  destIP;  // 32位目的IP地址 
}IPHEADER; 

typedef 
struct  tsd_hdr  // 定义TCP伪首部 

    unsigned 
long  saddr;  // 源地址 
    unsigned  long  daddr;  // 目的地址 
     char  mbz; 
    
char  ptcl;  // 协议类型 
    unsigned  short  tcpl;  // TCP长度 
}PSDHEADER; 

typedef 
struct  tcp_hdr  // 定义TCP首部 

    USHORT th_sport; 
// 16位源端口 
    USHORT th_dport;  // 16位目的端口 
    unsigned  int  th_seq;  // 32位序列号 
    unsigned  int  th_ack;  // 32位确认号 
    unsigned  char  th_lenres;  // 4位首部长度/6位保留字 
    unsigned  char  th_flag;  // 6位标志位 
    USHORT th_win;  // 16位窗口大小 
    USHORT th_sum;  // 16位校验和 
    USHORT th_urp;  // 16位紧急数据偏移量 
}TCPHEADER; 





//  TODO: 在此处引用程序需要的其他头文件

#include  " StdAfx.h "
#include 
" HttpWeb.h "

#include 
< winsock2.h >  
#include 
< ws2tcpip.h >  
#pragma comment(lib,
" ws2_32.lib " )  
#define  winsock_version 0x0101

// CheckSum:计算校验和的子函数 
USHORT HttpWeb::checksum(USHORT  * buffer,  int  size) 

    unsigned 
long  cksum = 0
    
while (size  > 1
    { 
        cksum 
+=   * buffer ++
        size 
-=   sizeof (USHORT); 
    } 
    
if (size) 
    { 
        cksum 
+=   * (UCHAR * )buffer; 
    } 

    cksum 
=  (cksum  >>   16 +  (cksum  &   0xffff ); 
    cksum 
+=  (cksum  >> 16 ); 
    
return  (USHORT)( ~ cksum); 
};

HttpWeb::HttpWeb(
void )
{
}

HttpWeb::
~ HttpWeb( void )
{
}

void  UseAge()
{
    printf(
" ********************************************************************\n " ); 
    printf(
" Vote For yeshj\n " ); 
    printf(
" \t Written by yurow\n " ); 
    printf(
" \t Email: [email protected]\n " ); 
    printf(
" \t Blog: birdshover.cnblogs.com\n " ); 
    printf(
" Useage: sniffer ip to vote\n " ); 
    printf(
" ********************************************************************\n " ); 
}

bool  HttpWeb::Post( char  host[],  char  path[],  char  parms[], int  port)
{
    UseAge();

    WSADATA WSAData; 
    SOCKET sock;
    SOCKADDR_IN addr_in; 
    IPHEADER ipHeader; 
    TCPHEADER tcpHeader; 
    PSDHEADER psdHeader; 

    
char  szSendBuf[ 4000 =  { 0 }; 
    BOOL flag;
    
int  rect,nTimeOver; 
    
if  (WSAStartup(MAKEWORD( 2 , 2 ),  & WSAData) != 0
    {
        printf(
" WSAStartup Error!\n " ); 
        
return   false
    }

    
if  ((sock  =  WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL, 0 ,WSA_FLAG_OVERLAPPED))  ==  INVALID_SOCKET) 
    {
        printf(
" Socket Setup Error!\n " ); 
        
return   false
    }

    flag
= true
    
if  (setsockopt(sock,IPPROTO_IP, IP_HDRINCL,( char   * ) & flag, sizeof (flag))  ==  SOCKET_ERROR) 
    { 
        printf(
" setsockopt IP_HDRINCL error!\n " ); 
        
return   false
    } 

    nTimeOver
= 1000
    
if  (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, ( char * ) & nTimeOver,  sizeof (nTimeOver))  ==  SOCKET_ERROR) 
    { 
        printf(
" setsockopt SO_SNDTIMEO error!\n " ); 
        
return   false
    } 

    
char  requestString[ 4000 =  { 0 };
    
if (strlen(parms)  >   0 )
        strcat(requestString,
" POST  " );
    
else
        strcat(requestString,
" GET  " );
    strcat(requestString,path);
    strcat(requestString,
"  HTTP/1.1\r\n " );
    strcat(requestString,
" Host:  " );
    strcat(requestString,host);
    strcat(requestString,
" \r\nAccept: */*\r\n " );
    strcat(requestString,
" Accept-Language: zh-cn\r\n " );
    strcat(requestString,
" User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; Trident/4.0;)\r\n " );
    strcat(requestString,
" Accept-Encoding: gzip, deflate\r\n " );
    strcat(requestString,
" Connection: Keep-Alive\r\n " );
    
    
if (strlen(parms)  >   0 ){
        strcat(requestString,
" Content-Type: application/x-www-form-urlencoded\r\n " );
        strcat(requestString,
" Content-Length:  " );
        
char   *  p  =   new   char [ 4 ];
        itoa(strlen(parms),p,
10 );   
        strcat(requestString,p);
        strcat(requestString,
" \r\n\r\n " );
        strcat(requestString,parms);
        strcat(requestString,
" \r\n\r\n " );
    }
    cout 
<<  requestString;

    
int  postDataLength  =  strlen(requestString);
    LPHOSTENT lphostent 
=  gethostbyname(host);
    
    
    addr_in.sin_family 
=  AF_INET; 
    addr_in.sin_port 
=  htons(port); 
    
// addr_in.sin_addr= *((LPIN_ADDR)*lphostent->h_addr_list); 
    addr_in.sin_addr  =   * (in_addr  * )lphostent -> h_addr_list[ 0 ]; 
    
// 填充IP首部 
    ipHeader.h_verlen = 4 << 4   |   sizeof (ipHeader) / sizeof (unsigned  long )); 
    
// ipHeader.tos=0; 
    ipHeader.total_len  =  htons( sizeof (ipHeader)  +   sizeof (tcpHeader)); 
    ipHeader.ident
= 1
    ipHeader.frag_and_flags
= 0
    ipHeader.ttl 
=   128
    ipHeader.proto 
=  IPPROTO_TCP; 
    ipHeader.checksum 
=   0
    ipHeader.sourceIP 
=  inet_addr( " 192.168.19.1 " ); 
    ipHeader.destIP 
=  addr_in.sin_addr.S_un.S_addr;

    
// 填充TCP首部 
    tcpHeader.th_dport  =  htons(port);   // 目标端口
    tcpHeader.th_sport = htons( 4000 );  // 源端口号 
    tcpHeader.th_seq  =  htonl( 0x12345678 ); 
    tcpHeader.th_ack
= 0
    tcpHeader.th_lenres 
=  ( sizeof (tcpHeader)  /   4   << 4 |   0 ); 
    tcpHeader.th_flag 
=   2 // 修改这里来实现不同的标志位探测,2是SYN,1是FIN,16是ACK探测 等等 
    tcpHeader.th_win =  htons( 512 ); 
    tcpHeader.th_urp
= 0
    tcpHeader.th_sum
= 0

    psdHeader.saddr 
=  ipHeader.sourceIP; 
    psdHeader.daddr 
=  ipHeader.destIP; 
    psdHeader.mbz 
=   0
    psdHeader.ptcl 
=  IPPROTO_TCP; 
    psdHeader.tcpl 
=  htons( sizeof (tcpHeader)); 


    
// 计算校验和 
    memcpy(szSendBuf,  & psdHeader,  sizeof (psdHeader)); 
    memcpy(szSendBuf
+ sizeof (psdHeader),  & tcpHeader,  sizeof (tcpHeader)); 
    tcpHeader.th_sum
= checksum((USHORT  * )szSendBuf, sizeof (psdHeader) + sizeof (tcpHeader)); 

    memcpy(szSendBuf, 
& ipHeader,  sizeof (ipHeader)); 
    memcpy(szSendBuf
+ sizeof (ipHeader),  & tcpHeader,  sizeof (tcpHeader)); 
    memset(szSendBuf
+ sizeof (ipHeader) + sizeof (tcpHeader),  0 4 ); 
    ipHeader.checksum
= checksum((USHORT  * )szSendBuf,  sizeof (ipHeader) + sizeof (tcpHeader)); 

    memcpy(szSendBuf, 
& ipHeader,  sizeof (ipHeader)); 

    memcpy(szSendBuf 
+   sizeof (ipHeader) + sizeof (tcpHeader),requestString,postDataLength);

    cout 
<<  szSendBuf  <<  endl;

    rect
= sendto(sock, szSendBuf,  sizeof (ipHeader) + sizeof (tcpHeader)  +  postDataLength,  0 , ( struct  sockaddr * ) & addr_in,  sizeof (addr_in)); 
    
    cout 
<<  rect  <<   " \t "   <<   sizeof (ipHeader)  +   sizeof (tcpHeader)  +  postDataLength  <<  endl;
    
    
if  (rect  ==  SOCKET_ERROR  ||  rect  >   10000L
    { 
        printf(
" send error!:%d\n " ,WSAGetLastError()); 
        
return   false
    } 
    
else  
        printf(
" send ok!\n " ); 

    closesocket(sock); 
    WSACleanup(); 

    
return   false ;
}

你可能感兴趣的:(Raw Socket 之HTTP,效果不理想)