socket raw tcp

Destruction

Новичок
socket raw tcp

PHP:
$socket = socket_create( AF_INET, SOCK_RAW, SOL_TCP );
socket_connect( $socket, "127.0.0.1", 80 );
Result:
Код:
<br />
<b>Warning</b>:  socket_connect() unable to connect [10022]: Получен недопустимы
й аргумент.
 in <b>C:\serv\php4\test2.php</b> on line <b>13</b><br />
Где ошибка?.. -(
 

Destruction

Новичок
Автор оригинала: slach
var_dump($socket);
что показывает?
Код:
resource(4) of type (Socket)
Давайте я несколько конкретизирую проблему - создание и отправка сырого сокета работает для любого протокола, кроме 0x06 (SOL_TCP).

Т.е. ICMP всякие там запросы я могу отсылать на ура, но мне нужно именно TCP-запрос и именно сырой сокет.

Может быть что-то не так с php_sockets.dll ?

-~{}~ 11.12.07 11:59:

На другом форуме говорят, что у них такой проблемы нету (под линухами).

Всё более и более уверен, что виноват php_sockets.dll..

Может кто-нибудь пересобирал его сам под винду, чтобы так не косячил?
 

phpdev2007

Новичок
Destruction
Можно и так а можно поставить другую версию Php, плюс можно побровать готовые библиотеки, в зависимости что нужно получить от данного запроса.

-~{}~ 11.12.07 19:21:

Вот так должно работать:
PHP:
<?php

$socket = socket_create(AF_INET, SOCK_RAW, getprotobyname('icmp'));
socket_connect($socket, "127.0.0.1", 80 );

var_dump($socket);
Если я правильно понял что нужно вам.
 

Destruction

Новичок
phpdev2007, неправильно. 0х00 я и без вас могу написать.

Мне 0х06 нужно - принципиально, пхп - запрос правит, и в графу "протокол" пишет переданную цифру.

Касательно версии - пробовал 4ую и 5ую, свеже слитые с офсайта - эффекту нуль.

Ещё раз, что нужно:
Нужно отправить TCP-пакет, внеся изменения на уровне IP-протокола.

PS: Я кажется понял.. Не пишите пока, что я тупой - сейчас сам пойму :)
 

phpdev2007

Новичок
Destruction
пробовали выполнить ваш пример на linux|unix?
$socket = socket_create( AF_INET, SOCK_RAW, SOL_TCP );
socket_connect( $socket, "127.0.0.1", 80 );
я думаю будет также ошибка.

Сор, не увидел ваш p/s,
совет почитать мануал :)
 

Destruction

Новичок
Нет, не понял..

Я вдруг решил, что socket_connect - как бы и не нужен, если я в IP-протокол сам пишу, куда конетится.. Оказалось не так, тестил на примере пинга до яндекса (ICMP - не смущайтесь, нужен всё равно TCP, но у него протокол сложнее).

Код:
$socket = socket_create( AF_INET, SOCK_RAW, getprotobyname( 'icmp' ) );

$query = "\x45\x00\x00\x3c\x3f\x38\x00\x00\x3b\x01\xb2\x2f\xd5\xb4\xcc\x08\xd9\xac\x12\xf0\x00\x00\x50\x5c\x01\x00\x04\x00\x61\x62\x63\x64\x65\x66";
$query .= "\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x61\x62\x63\x64\x65\x66\x67\x68\x69";

socket_write( $socket, $query );
Реализацию выдумывать не стал - запрос взят из сниффера.

В итоге:
Код:
<br />
<b>Warning</b>:  socket_write() unable to write to socket [10057]: Запрос на отп
равку или получение данных  (when sending on a datagram socket using a sendto ca
ll) no address was supplied.
Рассказывает про то, что я не сказал куда конетиться (я не понял - я как же байты 0xd5 0xb4 0xcc 0x08 - айпиша яндекса уже не адрес?)..

Ладно, там ещё есть socket_set_option - может через него можно адрес назначить, пойду ман почитаю.

PS: Ман читал - нужно тупо отправить запрос.. Неужели такая проблема? Изначальный пример, под линухом, работает на ура, под виндой - нет. Не думаю, чтобы это была моя вина..

PPS: Прочёл ошибку - попробую socket_sendto.
 

phpdev2007

Новичок
Destruction
а что вы пытаетесь сделать?
что именно?
SOCK_RAW - что сие значит?
 

Destruction

Новичок
SOCK_RAW - сырой сокет.

Вы представляете вообще как выглядет тот же HTTP-пакет?

-Сетевуха
--IP Протокол
---TCP Протокол
----HTTP Протокол

Это чтобы не было недопониманий. Теперь продолжим, код:
Код:
$socket = socket_create( AF_INET, SOCK_RAW, SOL_TCP );

socket_sendto( $socket, $query, strlen( $query ), 0, gethostbyname( "ya.ru" ), 80 );
Ошибка, суть та же, что и в первом примере.

Код2:
Код:
$socket = socket_create( AF_INET, SOCK_RAW, getprotobyname( 'icmp' ) );

socket_sendto( $socket, $query, strlen( $query ), 0, gethostbyname( "ya.ru" ), 80 );
Пишет данные из $query в ICMP протокол (который я взял снова тока для тесту), а мне нужно, повторяюсь, писать в IP протокол..

PS: Тестирование веду из под администраторского аккаунта, с этим проблемы нету.

PPS: Для большего понимания меня местными спецами - предлагаю всем прочитать, что такое IP спуфинг - мне нужно тоже самое, но править не IP, а TTL, флаги и DSCP напару с ECN (принципно, велосипед, очень надо).
 

phpdev2007

Новичок
хм, это не совместимо SOCK_RAW, SOL_TCP
именно такая комбинация выдает ошибку.
SOCK_RAW === icmp протокол.

[php man]
SOCK_RAW ===
Provides raw network protocol access. This special type of socket can be used to manually construct any type of protocol. A common use for this socket type is to perform ICMP requests (like ping, traceroute, etc).
[/php man]
 

Destruction

Новичок
to manually construct any type of protocol
A common use ... to perform ICMP requests
Читать нужно.. полностью. Вкратце означает - можно юзать для вёрстки любого протокола, обычно используется для ICMP запросов (пинг, трейс итд).

Нигде про несовместимость не вижу.

Вот проблема вся у меня в том, что если я пишу 0x00, 0x01 - он записывается в 10ый байт IP-запроса.. Т.е. я не могу сконструировать TCP-запрос, т.к. при использовании:
1. SOL_TCP
2. getprotobyname( 'tcp' )
3. 0x06
Вылезает ошибка (простите за нескромный вопрос - никто не считал, сколько я раз уже повторился?..)!

Проблема два - повторяюсь, нужно писать в IP-протокол, а пример приведённый мной чуть выше пример - описывает возникающую проблему..

Вобщем незнаю. Про IP спуфинг вы так и не прочитали, а жаль - действительно упростило бы понимание, т.к. данные нужно править на том же уровне.

PS: PHP ведь как-то пишет в IP-протокол такие вещи, как "кто" и "куда" - я не понимаю, почему я не могу сам писать подобные вещи.

PPS: Такой вопрос, кто-нибудь кроме меня работал с TCP-протоколом? Читал спецификацию? Знает какой байт за что отвечает в IP-протоколе?.. Несколько оффтопно, но интересно - с кем же я веду беседу.
 

Luerssen

Новичок
Destruction, к сис. админам обратись, у них с этими понятиями получше будет ;)
 

cDLEON

Онанист РНРСlub
Блин, как меня убивают советчики без знаний, но лезущие "помочь" человеку...
Я сомневаюсь, что вы найдёте ответ на этом форуме.
Здесь на трудные вопросы редко ответ найдёшь...
Да и сомневаюсь я, что какому-нибудь ПХП программисту придётся использывать сырые сокеты.
ЗЫ. На сколько я помню, менять адрес отправителя в TCP не возможно. Иначе бы лёг весь интернет от ддоса =) Хотя утверждать не буду)
 

Destruction

Новичок
В TCP - нет, кто спорит, поэтому я и лезу в IP-протокол.

То, что его мне не дадут править из PHP - я уже понял, нужно что-то посерьёзнее учить.

Тем не менее - остаётся другой вопрос - хочу сырой TCP-сокет, т.е. чтобы полностью самостоятельно писать в TCP-протокол, т.е. SOCK_STREAM - не годиться, нужен именно SOCK_RAW, судя по доке.

Luerssen, с пхп?) Сомневаюсь. Вопрос тут не по протоколу, а потому, как заюзать это дело из пхп :)

cDLEON, спасибо за понимание! Если я встретил тут хоть немного понимания - то возможно и ответ найдёться.. Хотя я непонимаю, как тебя не забанили за такие высказывания.. ИМХО, нужно быть несколько патриотичнее к форуму.

PS: Сам я свой вопрос отношу к разделу не "трудных", а скорее "глупых". Трудным он был, если бы я делал это на нормальном языке. На пхп - это глупый вопрос.

PPS: ддос основывается на том, чтобы послать как можно больше некорректных запросов (с неправильными данными в TCP - чексума, sequence). Соответственно ддосят одновременно с нескольких компьютеров и при таком раскладе - смена сорца в IP-протоколе - не принципиальна, только если пытаться защититься от весьма глупых сисадминов или иметь крайне ограниченный канал. Не так интересен ддос, как непосредственно IP спуфинг, о котором, грубо говоря, и идёт речь. Посмотрите на просторы интернета для накрутки чего-либо через айпи-спуфинг... :) Хотя бы моя голосовалка :)

ЗЫ: "IP-протокол" в моих сообщениях следует читать, как "Internet Protocol", оно конечно и так понятно, но хотел уточнить, для любителей задавать непонятные вопросы.

ЗЫЫ: Я понял, как тут всё работает - сначала я желающим помочь всё разжевываю, а потом начинаю всё сам понимать. Второй вопрос впринципе тоже отпадает - локальный глюк php_sockets.dll - меня вполне устраивает заявленное ранее, мной же, объяснение.
 
Сверху