日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Windows 2000下的Raw Socket編程( 二 )


USHORT th_win; //16位窗口大小
USHORT th_sum; //16位校驗和
USHORT th_urp; //16位緊急數(shù)據(jù)偏移量
}TCP_HEADER;

TCP偽首部并不是真正存在的,只是用于計算檢驗和 。校驗和函數(shù):

USHORT 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);
}

當(dāng)需要自己填充IP頭部和TCP頭部的時候,就同時需要自己計算他們的檢驗和 。

3、發(fā)送原始套接字?jǐn)?shù)據(jù)報

填充這些頭部稍微麻煩點,發(fā)送就相對簡單多了 。只需要使用sendto()就OK 。

sendto(sock, (char*)&tcpHeader, sizeof(tcpHeader), 0, (sockaddr*)&addr_in,sizeof(addr_in));

下面是一個示例程序,可以作為SYN掃描的一部分 。

#include
#include
#include

#define SOURCE_PORT 7234
#define MAX_RECEIVEBYTE 255

typedef struct ip_hdr //定義IP首部
{
unsigned char h_verlen; //4位首部長度,4位IP版本號
unsigned char tos; //8位服務(wù)類型TOS
unsigned short total_len; //16位總長度(字節(jié))
unsigned short ident; //16位標(biāo)識
unsigned short frag_and_flags; //3位標(biāo)志位
unsigned char ttl; //8位生存時間 TTL
unsigned char proto; //8位協(xié)議 (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; //協(xié)議類型
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位確認(rèn)號
unsigned char th_lenres; //4位首部長度/6位保留字
unsigned char th_flag; //6位標(biāo)志位
USHORT th_win; //16位窗口大小
USHORT th_sum; //16位校驗和
USHORT th_urp; //16位緊急數(shù)據(jù)偏移量
}TCPHEADER;

//CheckSum:計算校驗和的子函數(shù)
USHORT 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);
}

void useage()
{
printf("******************************************n");
printf("TCPPingn");
printf("t Written by Refdomn");
printf("t Email: refdom@263.netn");
printf("Useage: TCPPing.exe Target_ip Target_port n");
printf("*******************************************n");
}

int main(int argc, char* argv[])
{
WSADATA WSAData;
SOCKET sock;
SOCKADDR_IN addr_in;
IPHEADER ipHeader;
TCPHEADER tcpHeader;
PSDHEADER psdHeader;

char szSendBuf[60]={0};
BOOL flag;
int rect,nTimeOver;

useage();

if (argc!= 3)
{ return false; }

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;
}
addr_in.sin_family=AF_INET;
addr_in.sin_port=htons(atoi(argv[2]));

推薦閱讀