информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Microsoft Authenticator прекращает... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
[Net] Работа с Raw сокетами (Win2000) 17.04.03 07:00  
Автор: makeworld Статус: Member
<"чистая" ссылка>
Набросал прогу, которая должна отправлять TCP пакет, но sendto() возвращает ошибку 10022. TCP-checksum вроде считал как в RFC написано, IP-checksum ОС поидее должна сама высчитываться. Непонятно в чем проблема..
Компилирую на VC++ .NET

----send_tcp.c----
#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib,"ws2_32")

typedef struct ip_header {
        unsigned char ip_verlen;        // IP version & length
        unsigned char ip_tos;           // IP type of service
        unsigned short ip_totallength;   // Total length
        unsigned short ip_id;            // Unique identifier 
        unsigned short ip_offset;        // Fragment offset field
        unsigned char ip_ttl;           // Time to live
        unsigned char ip_protocol;      // Protocol(TCP,UDP etc)
        unsigned short ip_sum;          // IP checksum
        unsigned int ip_srcaddr;       // Source address
        unsigned int ip_destaddr;      // Destination address
} IPHDR;

typedef struct tcp_header {
        unsigned short int tcp_sport; //
        unsigned short int tcp_dport; //
        unsigned int tcp_seq; //
        unsigned int tcp_ack;
        unsigned char tcp_x2:4, th_off:4;
        unsigned char tcp_flags;
        unsigned short int tcp_win;
        unsigned short int tcp_sum;
        unsigned short int tcp_urp;
} TCPHDR; 

#define FROM_IP "127.0.0.1"
#define TO_IP "127.0.0.1"

// подсчет чексуммы взял из статьи "Программирование raw сокетов под bsd", xaoc ezine #1
USHORT checksum(USHORT *buffer, int size)
{
    unsigned long cksum=0;

    while (size > 1)
    {
        cksum += *buffer++;
        size  -= sizeof(USHORT);   
    }
    if (size)
    {
        cksum +=(UCHARbuffer;   
    }
    cksum = (cksum >> 16) + (cksum & 0xffff);
    cksum += (cksum >>16); 

    return (USHORT)(~cksum); 
}

void main() {
	WSADATA wd;
	SOCKET s;
	IN_ADDR addr;
	int optret,ret;
	BOOL bopt;
	IPHDR iphdr;
	TCPHDR tcphdr;
	unsigned short tsz,tcpsum,chksum;
	char buf[4096], *ptr;
	struct sockaddr_in s_in;

	if (WSAStartup(MAKEWORD(2,2),&wd))
		printf("WSAStartup() failed\n");
	
	addr.S_un.S_addr = inet_addr(FROM_IP);

	s = socket(AF_INET,SOCK_RAW,IPPROTO_TCP);
	if (s == INVALID_SOCKET)
		printf("socket() failed\n");

	bopt = TRUE;
	optret = setsockopt(s,IPPROTO_IP,IP_HDRINCL,(char *)&bopt,sizeof(bopt));
	if (optret == SOCKET_ERROR)
		printf("setsockopt() failed\n");

	tsz = sizeof(IPHDR) + sizeof(TCPHDR);

	iphdr.ip_verlen = (4 << 4) | (sizeof(iphdr) / sizeof(unsigned long));
	iphdr.ip_tos =  0;
	iphdr.ip_totallength = htons(tsz);
	iphdr.ip_id = 0;
	iphdr.ip_offset = 0;
	iphdr.ip_ttl = 128;
	iphdr.ip_protocol = 0x06;
	iphdr.ip_sum = 0;
	iphdr.ip_srcaddr = inet_addr(FROM_IP);
	iphdr.ip_destaddr = inet_addr(TO_IP);

	tcphdr.tcp_sport = htons(666);
	tcphdr.tcp_dport = htons(999);
	tcphdr.tcp_seq = 555;
	tcphdr.tcp_ack = 777;
	tcphdr.tcp_flags = 0x10; // ACK
	tcphdr.tcp_win = htons(6666);

	ptr = buf;
	ZeroMemory(buf,sizeof(buf));
	tcpsum = 0;

	memcpy(ptr,&iphdr.ip_srcaddr,sizeof(iphdr.ip_srcaddr));
	ptr += sizeof(iphdr.ip_srcaddr);
	tcpsum += sizeof(iphdr.ip_srcaddr);

	memcpy(ptr,&iphdr.ip_destaddr,sizeof(iphdr.ip_destaddr));
	ptr += sizeof(iphdr.ip_destaddr);
	tcpsum += sizeof(iphdr.ip_destaddr);

	memcpy(ptr,&iphdr.ip_destaddr,sizeof(iphdr.ip_destaddr));
	ptr += sizeof(iphdr.ip_destaddr);
	tcpsum += sizeof(iphdr.ip_destaddr);

	ptr++;
	tcpsum++;

	memcpy(ptr,&iphdr.ip_protocol,sizeof(iphdr.ip_protocol));
	ptr += sizeof(iphdr.ip_protocol);
	tcpsum += sizeof(iphdr.ip_protocol);

	memcpy(ptr,&tcphdr,sizeof(tcphdr));
	ptr += sizeof(tcphdr);
	tcpsum += sizeof(tcphdr);

        tcphdr.tcp_sum = checksum((USHORT *)&buf,tcpsum);

	ZeroMemory(buf,4096);
	ptr = buf;
	
	memcpy(ptr,&iphdr,sizeof(iphdr));
	ptr += sizeof(iphdr);
	memcpy(ptr,&tcphdr,sizeof(tcphdr));

	s_in.sin_family = AF_INET;
	s_in.sin_port = htons(666);
	s_in.sin_addr.s_addr = inet_addr(TO_IP);

	ret = sendto(s,&buf,tsz,0,(struct sockaddr *)&s_in,sizeof(s_in));

	if (ret == SOCKET_ERROR)
		printf("sendto() failed: %d\n",WSAGetLastError());

}
------eof-------

---
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach