RAW сокет.Отправка пакета.
От: Laymer  
Дата: 26.02.03 19:19
Оценка:
Написал прогу которая должна собирать пакет и отсылать. Решил протестировать у себя на компе. Сделал вторую прогу-сервер. В общем запустил клиента(спуфер). Сервер не отвечает, как-будто к нему ни кто не коннектится. Написал клиент на простых сокетах, что бы проверить сервак. Сервак работает хорошо, отвечает на запросы клиента на сокетах. Не знаю в чем дело. Может быть я не правильно сформировал пакет. От чего это может зависить. Вот исходный код:
***********************************************************
//Инклуды**********
#include "windows.h"
#include "ras.h"
#include "iostream.h"
#include <process.h>
#include "conio.h"
#define IP_HDRINCL 2
//Структуры**********
struct HEADER
{
int id;
int rd;
int aa;
int opcode;
int qr;
short qdcount;
short ancount ;
short nscount;
short arcount;
int ra;
short tc;
int rcode;
};

struct DNS_MSG
{
HEADER head;
char query[255];
};

struct iphdr
{
unsigned char ihl:4;
unsigned char version:4;
unsigned char tos;
unsigned short tot_len;
unsigned short id;
unsigned short frag_off;
unsigned char ttl;
unsigned char protocol;
unsigned short check;
unsigned int saddr;
unsigned int daddr;
};
struct udphdr { //Заголовок UDP пакета
unsigned short source;
unsigned short dest;
unsigned short len;
unsigned short check;
};

struct dns_pkt
{
struct iphdr ip;
struct udphdr udp;
char data[1000];
};
//Прога**********
void main()
{
//Открываю RAW сокет
SOCKET sfd;
sfd=socket(AF_INET,SOCK_RAW,IPPROTO_IP);
unsigned int sfdo=1;
setsockopt(sfd,IPPROTO_IP,IP_HDRINCL,(char*)&sfdo,sizeof(sfdo));

struct DNS_MSG killer;
memset(&killer,0,sizeof(killer));
killer.head.id =getpid();
killer.head.rd=1;
killer.head.aa=0;
killer.head.opcode=0;
killer.head.qr=0;
killer.head.qdcount=htons(1);
killer.head.ancount=htons(0);
killer.head.nscount=htons(0);

wsprintf(killer.query,"local"); //Вот здесь надо писать домен который запрашиваем. А что делать на локальном компе. Я решил написать local. Имеет это какое-нибудь значение?

struct dns_pkt dpk;
short src,dst;
dpk.udp.source=htons(2000);
dpk.udp.source=htons(2000);
int len;
len=(12+strlen(killer.query)+5);
dpk.udp.len=htons(20+len);
memcpy(dpk.data,(void*)&killer,len);
dpk.ip.tos=0;
dpk.ip.tot_len=htons(sizeof(dpk)+len);
dpk.ip.frag_off=0;
dpk.ip.ttl=64;
dpk.ip.protocol=IPPROTO_UDP;
dpk.ip.saddr=inet_addr("127.0.0.1");
dpk.ip.daddr=inet_addr("127.0.0.1");

struct sockaddr_in sin;
memset(&sin,0,sizeof(sin));
sin.sin_family=AF_INET;
sin.sin_port=htons(2000);
sin.sin_addr.s_addr=inet_addr("127.0.0.1");
connect(sfd,(PSOCKADDR)&sin, sizeof(sin));
sendto(sfd,(char*)&dpk,sizeof(dpk)+len,0,(struct sockaddr*)&sin,sizeof(sin));
}
***********************************************************
Помогите или хотя бы подскажите в чем дело пожалуйста. Спасибо...
Re: RAW сокет.Отправка пакета.
От: Laymer  
Дата: 27.02.03 13:24
Оценка:
Протестировал строку:setsockopt(sfd,IPPROTO_IP,IP_HDRINCL,(char*)&sfdo,sizeof(sfdo));
возвращает -1.Не знаю в чем дело вреде написана правильно. Нашел на одном .com сайте кусочек кода,там вообще этой строчке не было. Разве так можно она же объявляет опции RAW сокета(говорит то что пакет мы будем формировать сами) или я ошибаюсь. В любом случае я попробовал и без этой строчке, одна хрень не отсылает.
Помогите кто знает.........
Re[2]: RAW сокет.Отправка пакета.
От: Pascha  
Дата: 28.02.03 16:52
Оценка:
Здравствуйте, Laymer, Вы писали:

L>Протестировал строку:setsockopt(sfd,IPPROTO_IP,IP_HDRINCL,(char*)&sfdo,sizeof(sfdo));

L>возвращает -1.Не знаю в чем дело вреде написана правильно. Нашел на одном .com сайте кусочек кода,там вообще этой строчке не было. Разве так можно она же объявляет опции RAW сокета(говорит то что пакет мы будем формировать сами) или я ошибаюсь. В любом случае я попробовал и без этой строчке, одна хрень не отсылает.
L>Помогите кто знает.........

Все предельно просто! Надо инициализировать сокеты!!! А у вас в коде я чего то такой вещицы не приметил! И еще про setsockopt — строчка необходима!!! Про исключения умолчу...Если угодил, очень рад!

p.s а когда отлаживались вы не приметили, что socket тоже фигню возвращает ?
Re[3]: RAW сокет.Отправка пакета.
От: Laymer  
Дата: 28.02.03 18:19
Оценка:
Здравствуйте, Pascha, Вы писали:
P>Все предельно просто! Надо инициализировать сокеты!!! А у вас в коде я чего то такой вещицы не приметил! И еще про setsockopt — строчка необходима!!! Про исключения умолчу...Если угодил, очень рад!

P>p.s а когда отлаживались вы не приметили, что socket тоже фигню возвращает ?


Клево щас попробую!!!!
Re[4]: RAW сокет.Отправка пакета.
От: Laymer  
Дата: 01.03.03 02:59
Оценка:
Проинициализировал, но результа всеравно нет.
setsockopt всеравно возвращает -1 . Че с ней делать. Че за...Она же правильно написана...
Re[5]: RAW сокет.Отправка пакета.
От: Spider84 Россия http://spider.vc
Дата: 01.03.03 03:58
Оценка:
Здравствуйте, Laymer, Вы писали:

L>Проинициализировал, но результа всеравно нет.

L>setsockopt всеравно возвращает -1 . Че с ней делать. Че за...Она же правильно написана...

GetLatsError()
Re[6]: RAW сокет.Отправка пакета.
От: Laymer  
Дата: 01.03.03 14:31
Оценка:
Здравствуйте, Spider84, Вы писали:

S>GetLatsError()


Нашел с помощью этой функции ошибку. Ошибка номер 10022:
Invalid argument.

Some invalid argument was supplied (for example, specifying an invalid level to the setsockopt function). In some instances, it also refers to the current state of the socket — for instance, calling accept on a socket that is not listening.

Что получается я передал какой-то недопустимый параметр? Но компилируется же нормально...
Re[6]: RAW сокет.Отправка пакета.
От: Laymer  
Дата: 01.03.03 14:31
Оценка:
Здравствуйте, Spider84, Вы писали:

S>GetLatsError()


Нашел с помощью этой функции ошибку. Ошибка номер 10022:
Invalid argument.

Some invalid argument was supplied (for example, specifying an invalid level to the setsockopt function). In some instances, it also refers to the current state of the socket — for instance, calling accept on a socket that is not listening.

Что получается я передал какой-то недопустимый параметр? Но компилируется же нормально...
Re[7]: RAW сокет.Отправка пакета.
От: icewind  
Дата: 02.03.03 10:49
Оценка:
Здравствуйте, Laymer, Вы писали:

L>Здравствуйте, Spider84, Вы писали:


S>>GetLatsError()


L>Нашел с помощью этой функции ошибку. Ошибка номер 10022:

L>Invalid argument.

L>Some invalid argument was supplied (for example, specifying an invalid level to the setsockopt function). In some instances, it also refers to the current state of the socket — for instance, calling accept on a socket that is not listening.


L>Что получается я передал какой-то недопустимый параметр? Но компилируется же нормально...


Замени в socet() IPPROTO_IP на IPPROTO_RAW добавь в исходник WSAStartup(MAKEWORD(2,2), &wsaData) и не забудь зайти в винды под Админом
Re[8]: RAW сокет.Отправка пакета.
От: Laymer  
Дата: 02.03.03 13:55
Оценка:
Здравствуйте, icewind, Вы писали:

I>Замени в socet() IPPROTO_IP на IPPROTO_RAW добавь в исходник WSAStartup(MAKEWORD(2,2), &wsaData) и не забудь зайти в винды под Админом


Клево щас попробую...
Re[9]: RAW сокет.Отправка пакета.
От: Laymer  
Дата: 02.03.03 15:08
Оценка:
L>Здравствуйте, icewind, Вы писали:

I>>Замени в socet() IPPROTO_IP на IPPROTO_RAW добавь в исходник WSAStartup(MAKEWORD(2,2), &wsaData) и не забудь зайти в винды под Админом


icewind написал так:
************
WSADATA st;
WSAStartup(MAKEWORD(2,2),&st);
//Открываю RAW сокет
SOCKET sfd;

sfd=socket(AF_INET,SOCK_RAW,IPPROTO_RAW); //<---Вот здесь как ты говорил заменил
unsigned int sfdo=1;
int hk=setsockopt(sfd,IPPROTO_IP,2 ,(char*)&sfdo,sizeof(sfdo));
if(hk==-1)
{
cout<<"ip_hdrincl denied";
}
****************

Насчет зайти с правами админа, у меня 98 виндоза.
setsockopt всеравно мозга е...т. Не мог ты мне свой кусочек кода с этими строчками скопировать, может я где-то что-то упустил. Ты не представляешь как-бы я тебе был благодарен.
Re[10]: RAW сокет.Отправка пакета.
От: icewind  
Дата: 02.03.03 16:08
Оценка:
Здравствуйте, Laymer, Вы писали:

L>>Здравствуйте, icewind, Вы писали:


I>>>Замени в socet() IPPROTO_IP на IPPROTO_RAW добавь в исходник WSAStartup(MAKEWORD(2,2), &wsaData) и не забудь зайти в винды под Админом


L>icewind написал так:

L>************
L> WSADATA st;
L> WSAStartup(MAKEWORD(2,2),&st);
L>//Открываю RAW сокет
L>SOCKET sfd;

L>sfd=socket(AF_INET,SOCK_RAW,IPPROTO_RAW); //<---Вот здесь как ты говорил заменил

L>unsigned int sfdo=1;
L>int hk=setsockopt(sfd,IPPROTO_IP,2 ,(char*)&sfdo,sizeof(sfdo));
L>if(hk==-1)
L>{
L> cout<<"ip_hdrincl denied";
L>}
L>****************

L>Насчет зайти с правами админа, у меня 98 виндоза.

L>setsockopt всеравно мозга е...т. Не мог ты мне свой кусочек кода с этими строчками скопировать, может я где-то что-то упустил. Ты не представляешь как-бы я тебе был благодарен.

Вот он

WSADATA wsaData;
SOCKET sockRaw;
BOOL bOpt = true;
int ret;

WSAStartup(MAKEWORD(2,2), &wsaData);
sockRaw = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
ret = setsockopt(sockRaw, IPPROTO_IP, IP_HDRINCL, (char*)&bOpt, sizeof(bOpt));

Скорей всего проблема в Win98. По моему IP_HDRINCL появилась в 2000.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.