#include #include #pragma comment(lib, "Ws2_32.lib"); typedef struct iphdr { unsigned char verlen; // IP version & length unsigned char tos; // Type of service unsigned short total_len; // Total length of the packet unsigned short ident; // Unique identifier unsigned short frag_and_flags; // Flags unsigned char ttl; // Time to live unsigned char proto; // Protocol (TCP, UDP etc) unsigned short checksum; // IP checksum unsigned int sourceIP; // Source IP unsigned int destIP; // Destination IP } IPHEADER; typedef struct tcphdr { unsigned short sport; // Source port unsigned short dport; // Destination port unsigned int seq; // Sequence number unsigned int ack_seq; // Acknowledgement number unsigned char lenres; // Length return size unsigned char flags; // Flags and header length unsigned short window; // Window size unsigned short checksum; // Packet Checksum unsigned short urg_ptr; // Urgent Pointer } TCPHEADER; // Our pseudo header struct typedef struct pshdr { unsigned int saddr; // Source address unsigned int daddr; // Destination address unsigned char zero; // Placeholder unsigned char proto; // Protocol unsigned short length; // TCP length struct tcphdr tcp; // TCP Header struct } PSDHEADER; struct InfoPacket { char srcIP[256]; char dstIP[256]; int ttl; int srcPort; int dstPort; }; 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); } unsigned long ResolveAddress(char *szHost) { unsigned long IP = inet_addr(szHost); if (IP==INADDR_NONE) { hostent *pHE = gethostbyname(szHost); if (pHE == 0) return INADDR_NONE; IP = *((unsigned long *)pHE->h_addr_list[0]); } return IP; } int main(void) { IPHEADER ipHeader; TCPHEADER tcpHeader; PSDHEADER psdHeader; struct InfoPacket inf; char szSendBuf[60]={0},buf[64]; int rect; WSADATA WSAData; if (WSAStartup(MAKEWORD(2,2), &WSAData) != 0) return FALSE; SOCKET sock; if ((sock = WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0, 0x01)) == INVALID_SOCKET) { WSACleanup(); return FALSE; } BOOL flag=TRUE; if (setsockopt(sock,IPPROTO_IP,2,(char *)&flag,sizeof(flag)) == SOCKET_ERROR) { closesocket(sock); WSACleanup(); return FALSE; } printf("Podaj adres IP zrodlowy: \n"); scanf("%s", &inf.srcIP); printf("Podaj adres IP docelowy: \n"); scanf("%s", &inf.dstIP); printf("Podaj czas zycia pakietu (TTL): \n"); scanf("%s", &inf.ttl); printf("Podaj port docelowy: \n"); scanf("%s", &inf.dstPort); printf("Podaj port zrodlowy: \n"); scanf("%s", &inf.srcPort); SOCKADDR_IN ssin; memset(&ssin, 0, sizeof(ssin)); ssin.sin_family=AF_INET; ssin.sin_port=htons(133); ssin.sin_addr.s_addr=ResolveAddress("192.168.0.2"); ipHeader.verlen=(4<<4 | sizeof(ipHeader)/sizeof(unsigned long)); ipHeader.total_len=htons(sizeof(ipHeader)+sizeof(tcpHeader)); ipHeader.ident=1; ipHeader.frag_and_flags=0; ipHeader.ttl=inf.ttl; ipHeader.proto=IPPROTO_TCP; ipHeader.checksum=0; ipHeader.destIP=ResolveAddress(inf.dstIP); ipHeader.sourceIP=ResolveAddress(inf.srcIP); tcpHeader.dport=htons(inf.dstPort); tcpHeader.ack_seq=0; tcpHeader.lenres=(sizeof(tcpHeader)/4<<4|0); tcpHeader.flags=2; tcpHeader.window=htons(16384); tcpHeader.urg_ptr=0; tcpHeader.checksum=0; tcpHeader.sport=htons(inf.srcPort); tcpHeader.seq=htons((unsigned short)((rand() << 16) | rand())); psdHeader.daddr=ipHeader.destIP; psdHeader.zero=0; psdHeader.proto=IPPROTO_TCP; psdHeader.length=htons(sizeof(tcpHeader)); psdHeader.saddr=ipHeader.sourceIP; memcpy(szSendBuf, &psdHeader, sizeof(psdHeader)); memcpy(szSendBuf+sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader)); tcpHeader.checksum=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)); rect=sendto(sock, szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader),0,(LPSOCKADDR)&ssin, sizeof(ssin)); if (rect==SOCKET_ERROR) { sprintf(buf, "[SYN]: Send error: <%d>.",WSAGetLastError()); closesocket(sock); WSACleanup(); return 0; } closesocket(sock); WSACleanup(); return 0; }