Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
BlackOwl
5 / 5 / 1
Регистрация: 23.12.2014
Сообщений: 90
#1

RAW сокет - C++

18.04.2015, 13:29. Просмотров 474. Ответов 4
Метки нет (Все метки)

нужен рабочий пример создания сырого сокета
З.ы под windows

Добавлено через 20 минут
нашел такой код, под хрюшей работает збс, но в 7 неработает, как можно это исправить? и можно ли это исправить вообще?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include <Winsock2.h>//Ws2_32.lib
#include <ws2tcpip.h>
//#include <Windows.h>
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
/*****************************************************************/
void ShowError()
{
        LPVOID lpMsgBuf = NULL;
        FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,NULL,WSAGetLastError(),
                MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR)&lpMsgBuf,0,NULL);
        CharToOem((char*)lpMsgBuf,(char*)lpMsgBuf);
        cout<<(LPCTSTR)lpMsgBuf<<endl;
        LocalFree(lpMsgBuf);
}
 
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);
}
/*****************************************************************/
typedef struct ip_hdr
{
        unsigned char    ip_verlen;
        unsigned char    ip_tos;
        unsigned short   ip_total_len;
        unsigned short   ip_id;
        unsigned short   ip_offset;
        unsigned char    ip_ttl;
        unsigned char    ip_protocol;
        unsigned short   ip_checksum;
        unsigned int     sourceIP;
        unsigned int     destIP;
}IP_HDR;
 
typedef struct udp_hdr
{
        unsigned short   source_port;
        unsigned short   dest_port;
        unsigned short   udp_len;
        unsigned short   udp_sum;
}UDP_HDR;
 
/*****************************************************************/
 
int main()
{
        WSADATA            wsaData;
        struct sockaddr_in remote;
        IP_HDR                 ipHdr;
        UDP_HDR                udpHdr;
        unsigned short     iTotalSize,iIPSize,iUdpSize, iUdpChecksumSize,ver;
        char                       buf[4096],*ptr,szMessage[4068];
        strcpy(szMessage,"Code by Lazy_elf");
 
 
        if(WSAStartup(0x0202,&wsaData)){ShowError();}
        else
        {
                cout<<"WSAStartup - OK"<<endl;
                SOCKET sckt;
                sckt = WSASocket (AF_INET,SOCK_RAW,IPPROTO_UDP,NULL,0,0);
                if(sckt == INVALID_SOCKET){ShowError();}
                {
                        cout<<"Raw scoket is created"<<endl;
 
                        BOOL opt = TRUE;
                        if(setsockopt (sckt,IPPROTO_IP,IP_HDRINCL,(char*)&opt,sizeof(opt))==SOCKET_ERROR)
                        {ShowError();}
                        else
                        {
                                cout<<"setsockopt - OK"<<endl;
                                iTotalSize = sizeof(ipHdr)+sizeof(udpHdr)+strlen(szMessage);
                                iIPSize    = sizeof(ipHdr)/sizeof(unsigned long);
                                ver = 4;
                                ipHdr.ip_verlen    = (ver<<4) | iIPSize;
                                ipHdr.ip_tos       = 0;
                                ipHdr.ip_total_len = htons(iTotalSize);
                                ipHdr.ip_id        = 0;
                                ipHdr.ip_offset    = 0;
                                ipHdr.ip_ttl       = 128;
                                ipHdr.ip_protocol  = IPPROTO_UDP;
                                ipHdr.ip_checksum  = 0;
                                ipHdr.sourceIP     = inet_addr("127.0.0.1");
                                ipHdr.destIP       = inet_addr("127.0.0.1");
                                //-------------------------------------------//
                                iUdpSize = sizeof(udpHdr)+strlen(szMessage);
                                udpHdr.source_port = htons(3004);
                                udpHdr.dest_port   = htons(4004);
                                udpHdr.udp_len     = htons(iUdpSize);
                                udpHdr.udp_sum     = 0;
                                //-------------------------------------------//
                                iUdpChecksumSize = 0;
                                ptr = buf;ZeroMemory(buf,4096);
                                memcpy(ptr,&ipHdr.sourceIP, sizeof(ipHdr.sourceIP));
                                ptr              += sizeof(ipHdr.sourceIP);
                                iUdpChecksumSize += sizeof(ipHdr.sourceIP);
                                memcpy(ptr,&ipHdr.destIP,sizeof(ipHdr.destIP));
                                ptr              += sizeof(ipHdr.destIP);
                                iUdpChecksumSize += sizeof(ipHdr.destIP);
                                ptr++;iUdpChecksumSize += 1;
                            memcpy(ptr,&ipHdr.ip_protocol,sizeof(ipHdr.ip_protocol));
                                ptr              += sizeof(ipHdr.ip_protocol);
                                iUdpChecksumSize += sizeof(ipHdr.ip_protocol);
                                memcpy(ptr,&udpHdr.udp_len,sizeof(udpHdr.udp_len));
                                ptr              += sizeof(udpHdr.udp_len);
                                iUdpChecksumSize += sizeof(udpHdr.udp_len);
                        memcpy(ptr,&udpHdr,sizeof(udpHdr));
                                ptr              += sizeof(udpHdr);
                                iUdpChecksumSize += sizeof(udpHdr);
                                for(unsigned int i = 0; i < strlen(szMessage); i++, ptr++)
                                        *ptr = szMessage[i];
                                iUdpChecksumSize += strlen(szMessage);
                                udpHdr.udp_sum =  checksum((USHORT *)buf, iUdpChecksumSize);
 
                                ZeroMemory(buf,4096);ptr = buf;
 
                                memcpy(ptr,&ipHdr, sizeof(ipHdr)); ptr += sizeof(ipHdr);
                                memcpy(ptr,&udpHdr,sizeof(udpHdr));ptr += sizeof(udpHdr);
                                memcpy(ptr,szMessage,strlen(szMessage));
 
 
                                remote.sin_family      = AF_INET;
                                remote.sin_port        = htons(4004);
                                remote.sin_addr.s_addr = inet_addr("127.0.0.1");
                                if(sendto(sckt,buf,iTotalSize,0,(SOCKADDR *)&remote,sizeof(remote))==SOCKET_ERROR){ShowError();}
                                else{cout<<"sendto - OK"<<endl;}
                        }
 
                        if(closesocket(sckt)== SOCKET_ERROR){ShowError();}
                        else{cout<<"closesocket - OK"<<endl;}
                }
 
                if(WSACleanup()){ShowError();}
                else{cout<<"WSACleanup - OK"<<endl;}
        }
        system("pause");
        return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2015, 13:29     RAW сокет
Посмотрите здесь:

RAW сокеты - C++ WinAPI
как использовать RAW сокеты ? я знаю что это возможно при помощи старого драивера (пегед тем как его заменили &quot;hotfix&quot;-oм) но как...

Raw string - C++
для чего нужны скобки? R&quot;(c:\)&quot; совершенно не понимаю почему не так R&quot;c:&quot;:ireful:

RAW Socket, заголовки и тд - C++
Всех приветствую. Если в функции socket( int AF, int Type, int Protocol ) во второй аргумент пихаем SOCK_RAW, то это подразумевает...

RAW Sockets - Литература - C++
Подскажите пожалуйста литературу по Raw Sockets.

Литература по RAW сокетам - C++
кто знает где можно найти хорошие ссылки по этой теме Добавлено через 41 минуту пожалуйста очень надо хорошую статью. с кока нет...

.RAW to JPEG with Bayer Pattern - C++
Всем привет, боюсь задачка скорее для раздела &quot;C/С++ для профессионалов&quot;, однако там мне писать низя =) Стоит задача (учебная)...

Socket Raw Promiscuous mode - C++ Linux
Здравствуйте! Решил сделать небольшую программу для подсчета трафика между своими товарищами по работе. Все бы ничего, но если я...

Преобразование Raw-данных в AIFF - C++
Пытаюсь считать Raw дату, и сформировать из него AIFF файл с заголовком и датой. Тоже самое делал с WAV, получилось. Методы по сути брал...

Raw socket подмена ip адреса отправителя - C++ Builder
Задача такая надо отправить пакет с другим ip адресом отправителя. Подскажите как это сделать? Слышал что можно это сделать через Raw...

Авторизация, игра pw. Нужно получить Raw Stream - C++ Builder
Использую Синапс. Если снифать автаризацию то передается параметр xml version = &quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&lt;Auth ProjectId=&quot;61&quot;...

Визуализация 16 битного raw файла: Нужен совет - C++ Builder
Всем привет! Нужен совет, кто как решал бы такую задачу: На входе есть монохромное изображение в виде raw файла - матрица из 2-х...

Создание TCP/IP заголовка для отправки по Raw сокету - C++
Вкратце, я для ознакомительных целей пишу syn flood dos программу(самая безобидная атака из всех :) ) Так уж случилось, что я не знаю,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
san92der
14 / 14 / 3
Регистрация: 27.10.2012
Сообщений: 108
21.04.2015, 23:55     RAW сокет #2
Ты бы хотя бы ошибки написал. Без этого тебе никто не скажет точно.
Хотя наверняка что-то с либами не так
BlackOwl
5 / 5 / 1
Регистрация: 23.12.2014
Сообщений: 90
22.04.2015, 16:51  [ТС]     RAW сокет #3
san92der, ошибок как таковых нет, это связано с тем что поддержка в виндовс 7 сырых сокетов сильно урезана, они просто не создаются
san92der
14 / 14 / 3
Регистрация: 27.10.2012
Сообщений: 108
22.04.2015, 18:43     RAW сокет #4
Раз уж никто не отвечает, кроме меня, позволю себе написать то, в чем не особо уверен
В универе писал простейший пример клиента-сервера на сырых сокетах.
На семерке у себя все запускал и работало. Была только пара косяков с запуском примеров
на семерке и у меня и у одногруппников. В основном все решалось этой строкой:
C++
1
#pragma comment(lib, "ws2_32.lib");
Либа кажется эта, если память не изменяет. Но без dll-ок ничего не получалось.
BlackOwl
5 / 5 / 1
Регистрация: 23.12.2014
Сообщений: 90
24.04.2015, 11:46  [ТС]     RAW сокет #5
san92der, и на этом спасибо
Yandex
Объявления
24.04.2015, 11:46     RAW сокет
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru