Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.04.2010, 02:54   #1
DRagono
 
Аватар для DRagono
 
Регистрация: 17.03.2010
Сообщений: 6
По умолчанию [C++] TCP/IP Авто-генерация IP RAW пакета

Проблема следующая. Программа вроде не еррорит, всё посылает, но сниффер ничего не ловит, и дело 100% в программе, а не в снифере. Постараюсь скинуть сюда все основные куски кода. Заранее благодарен за любую помощь.

Код:
WSADATA wsadata;
SOCKET s;
Код:
int CRAWDlg::rs_set_tos (SOCKET s, unsigned char new_tos)
{	
	int tos = new_tos;
	int tos_len = sizeof (tos);
	int per=setsockopt(s, IPPROTO_IP, 3, (char *)&tos, 
				 tos_len);
	if (per == SOCKET_ERROR)
	{
		return WSAGetLastError();
	}
	return 0;
}
Код:
int CRAWDlg::rs_set_raw (SOCKET s)
{
	unsigned int use_own_header = 1;

	// Установка опции RAW для сокета, что говорит о том
	// что мы вручную будем формировать заголовки пакетов
	if ( setsockopt (s, IPPROTO_IP, 2, (char*)&use_own_header, 
				sizeof(use_own_header))== SOCKET_ERROR)
	{
		return WSAGetLastError();
	}

	return 0;
}
Код:
unsigned short CRAWDlg::rs_crc (unsigned short * buffer, int length)
{
	unsigned long crc = 0;

	// Вычисление CRC.
	while (length > 1)
	{
		crc += *buffer++;
		length -= sizeof (unsigned short);
	}

	// Если имеется символ слева.
	if (length) crc += *(unsigned char*) buffer;

	//Закончить вычисления.
	crc = (crc >> 16) + (crc & 0xffff);
	crc += (crc >> 16);

	// Смещение CRC если необходимо.
	if (1) crc = crc << 1;

	// Возвращаем инвертированне значение.
	return (unsigned short)(~crc);
}
Код:
int CRAWDlg::rs_send_ip (SOCKET s, struct ip_header iph, char * data, int data_length, unsigned short dst_port_raw)
{
	char * buffer;
	int result;
	sockaddr_in target;

	unsigned char header_length;
	unsigned int packet_length;

	memset (&target, 0, sizeof (target));

	target.sin_family = AF_INET;
	target.sin_addr.s_addr = iph.dst_addr;
	target.sin_port = dst_port_raw;

	// Вычисление длины пакета и заголовка пакета.
	header_length = sizeof (struct ip_header);
	packet_length = header_length + data_length;

	// Установка CRC.
	iph.crc = 0;

	// Заполнение некоторых полей заголовка IP.
	iph.version = header_length / 4 + (unsigned char) atoi ("4") * 16;

	// Если длина пакета не задана , то
	//длина пакета равна длине заголовка
	if (!iph.length) iph.length = htons (packet_length);

	// Выделение памяти под новый пакет
	buffer =(char *) calloc (packet_length, sizeof (char));

	// Копирование заголовка в буфер (CRC равно 0).
	memcpy (buffer, &iph, sizeof (struct ip_header));


	// Копирование данных
	if (data) memcpy (buffer + header_length, data, data_length);

	// Вычисление CRC.
	iph.crc = rs_crc ((unsigned short *) buffer, packet_length);

	// копирование заголовка пакета (CRC посчитана).
	memcpy (buffer, &iph, sizeof (struct ip_header));

	// Посылка законченного IP пакета.
	result = sendto (s, buffer, packet_length, 0,(struct sockaddr *)&target, sizeof (target));
	if (result==SOCKET_ERROR)
	{
		result = GetLastError();
	}
	free (buffer);
	return result;
}
DRagono вне форума Ответить с цитированием
Старый 27.04.2010, 02:55   #2
DRagono
 
Аватар для DRagono
 
Регистрация: 17.03.2010
Сообщений: 6
По умолчанию

Одним сообщением не влезло. Ну и в общем что-то вроде main-функции
Код:
void CRAWDlg::start(void* param)
{
	std::ostringstream wLog_;
	struct ip_header ipheader_;
	ZeroMemory (&ipheader_, sizeof (ipheader_));
	CString sip_, sport_, stos_, sdata_, sn_;

	mainWindow->IP_.GetWindowTextA(sip_);
	ipheader_.dst_addr = inet_addr(sip_);

	mainWindow->port_.GetWindowTextA(sport_);
	unsigned short iport_ = htons(atoi(sport_.GetBuffer(0)));

	mainWindow->tos_.GetWindowTextA(stos_);
	size_t newsizea = (stos_.GetLength() + 1);
    char *ctos_ = new char[newsizea];
    strcpy_s(ctos_, newsizea, stos_);
	ipheader_.tos = (unsigned char)ctos_;

	mainWindow->data_.GetWindowTextA(sdata_);
	newsizea = (sdata_.GetLength() + 1);
    char *cdata_ = new char[newsizea];
    strcpy_s(cdata_, newsizea, sdata_);

	mainWindow->n_.GetWindowTextA(sn_);
	int in_ = atoi(sn_.GetBuffer(0));

	wLog_ << "Starting winsock...\r\n";
	mainWindow->Log_.SetWindowTextA(wLog_.str().c_str());
	if (WSAStartup(MAKEWORD(2,2), &wsadata))
	{
		wLog_ << "Winsock cannot be started. Error: " << WSAGetLastError() << "\r\n";
		mainWindow->Log_.SetWindowText(wLog_.str().c_str());
		WSACleanup();
		goto End_;
	}
	
	wLog_ << "Creating socket...\r\n";
	mainWindow->Log_.SetWindowTextA(wLog_.str().c_str());
	s = WSASocket (AF_INET, SOCK_RAW, IPPROTO_RAW, NULL, 0, WSA_FLAG_OVERLAPPED);

	if (s == INVALID_SOCKET)
	{
		wLog_ << "WSASocket call failed: " << WSAGetLastError() << "\r\n";
		mainWindow->Log_.SetWindowTextA(wLog_.str().c_str());
		WSACleanup();
		goto End_;
	}

	wLog_ << "====================\r\nChosen IP: " << sip_ << "::" << ipheader_.dst_addr << "\r\nChosen Port: "
		<< sport_ << "::" << iport_ <<"\r\nChosen TOS: " << ctos_ << "\r\nEntered data: " << cdata_
		<< "\r\nNumber of sending packets: " << in_ << "\r\n====================\r\n";
	mainWindow->Log_.SetWindowTextA(wLog_.str().c_str());

	ipheader_.ttl = 225;
	ipheader_.length = sizeof(struct ip_header);
	ipheader_.proto = IPPROTO_RAW;
		
	wLog_ << "Testing TOS Options...\r\n";
	mainWindow->Log_.SetWindowTextA(wLog_.str().c_str());
	int res_= mainWindow->rs_set_tos (s, 0);
	if( res_ != 0)
	{
		wLog_ << "TOS Options error: " << res_ << "\r\n";
		mainWindow->Log_.SetWindowTextA(wLog_.str().c_str());
		goto End_;
	}
		
	wLog_ << "Testing RAW Options...\r\n";
	mainWindow->Log_.SetWindowTextA(wLog_.str().c_str());
	res_ = mainWindow->rs_set_raw (s);
	if( res_ != 0)
	{
		wLog_ << "RAW Options error: " << res_ << "\r\n";
		mainWindow->Log_.SetWindowTextA(wLog_.str().c_str());
		goto End_;
	}
	
	wLog_ << "Sending " << in_ << " packets...\r\n";
	mainWindow->Log_.SetWindowTextA(wLog_.str().c_str());
	int s_;
	for (int i=0; i<in_; i++)
	{
		s_= mainWindow->rs_send_ip(s, ipheader_, cdata_, sizeof(cdata_), iport_);
		wLog_ << (i+1) << " packet sended. Size: " << s_ << "\r\n";
	}
	wLog_ << "Sending complete!\r\n";
	mainWindow->Log_.SetWindowTextA(wLog_.str().c_str());

End_:
	closesocket(s);
	WSACleanup();
}
DRagono вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание и редактирование Raw (карты) Trol-100 Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 10.11.2009 00:15
Декодирование 48 битного RAW формата Rezet Мультимедиа в Delphi 5 23.01.2009 18:21
raw пакет spoool Работа с сетью в Delphi 1 02.12.2008 08:43
Отправка->Распаковка пакета Saxon Работа с сетью в Delphi 10 15.04.2007 20:56