Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Сеть > Socks5 чекинг


Автор: alligator 1.9.2005, 23:38
Сабж собственно =))
Подскажите как сделать socks5 чекинг....
Прочитал туториал про socks5 http://codenet.ru/webmast/socks51.php
такой вопрос у соксов есть комманды в спецификации написаны запросы как мне выполнить нужный запрос ? не понятно smile
То что надо коннектить через сокеты это понятно вот что нужно записать в сокет и в каком формате нет =((

Автор: Mal Hack 2.9.2005, 16:12
А это не socket_* случаем?

Автор: alligator 3.9.2005, 12:19
fsockopen открываем подключение на сокс
fputs вставляем комманду , у меня есть пример только я незнаю как он работает а мне интересно хочу сделать свой вариант
вот пример:
Код

function hex2bin($dump){
$dump=str_replace(' ', '', $dump);
$res='';
$dumplen=strlen($dump);
for ($i=0; $i<$dumplen; $i+=2){
$bt=$dump[$i].$dump[$i+1];
$res=$res.chr(hexdec($bt));}
return $res; }

function hexlen($s) {
$s=str_replace(' ', '', $s);
if (strlen($s)/2 <16) $v='0';
if (strlen($s)/2 <256) $v.='0';
if (strlen($s)/2 <4096) $v.='0';
$v.=dechex(strlen($s)/2);
return $v; }

function sockcheck( $sockip, $sockport, $timeout=10) {
$sres=0;
$f=fsockopen($sockip, $sockport, $ern, $ers, $timeout);
if (!$f) {
return 0;
} else {
$s=hex2bin('05 02 00 02');
fputs ($f, $s);
$g=fgets ($f,2);
$list= bin2hex($g);
if (($g[0]==hex2bin('04')) or ($g[0]==hex2bin('05'))) $sres=1;
fclose($f);
return $sres; }
}

Добавлено @ 12:26
я незнаю через что лучше делать, подскажите пожалуйста? smile

Автор: Mal Hack 3.9.2005, 16:15
Я имел ввиду класс фунций socket_*();

Автор: alligator 3.9.2005, 16:37
Ну да я понял.... что ты это имел ввиду , через эти функции делать ?

Автор: Mal Hack 3.9.2005, 18:27
Ага.

Автор: alligator 3.9.2005, 22:46
Окей попробуем...

Автор: alligator 4.9.2005, 23:01
Не хочет ничего выводить =(
и оч долго коннектит на сокс , что не есть гуд
Код

<?php
$sopen = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Ошибка создания сокета\n");
socket_connect($sopen,'213.215.169.210', 1080);
$res = socket_read ($sopen,1024, PHP_BINARY_READ);
print $res;
socket_close($sopen);
?>

Автор: alligator 11.9.2005, 08:57
Ну что ни кто не поможет чтоль ((

Автор: Mal Hack 11.9.2005, 09:26
alligator а только с данным сервером?
Порт все-таки 80, а не 1080 должен быть.

Автор: alligator 11.9.2005, 09:34
Нет именно 1080 ,сокс висит на это порту
Добавлено @ 09:34
Пока только с одним для начала хочу реализовать проверку хотябы одного а потом уже можно и цикл сделать

Автор: Mal Hack 11.9.2005, 09:39
alligator
1. Проверь он так только с этим хостом работает или с любыми.
2. Виснет именно на коннекте или на чтении?

Автор: alligator 11.9.2005, 09:42
На чтении виснет
Добавлено @ 09:44
Код

if(socket_connect($sopen,'213.215.169.210', 1080)===true){
    print "Ok";
}else{
    print "Error";
}

Сокс вроде рабочий
если добовляю виснет
Код

$a2 = socket_read ($sopen,1024);
print $a2;


Автор: Mal Hack 11.9.2005, 10:00
socket_strerror() че-ть выдает?
Попробуй так:
$a2 = socket_read ($sopen,1024,PHP_BINARY_READ);
ТОлько ты не забывай, что твой код выводит только первый килобайт....

Автор: alligator 11.9.2005, 10:09
да я знаю мне для начала нужно посмотреть что он вооще выводит.
Ничего не выводит
Код

<?php
$sopen = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Ошибка создания сокета\r\n");
if(socket_connect($sopen,'213.215.169.210', 1080)===true){
    print "Ok\r\n";
$buffer=socket_read($sopen,4096,PHP_BINARY_READ);
print socket_strerror(socket_last_error($buffer)) . "\r\n";
print $buffer;
}else{
    print "Error";
}
?>

http://vipartconcert.ru/php/77/t.php

Автор: Mal Hack 11.9.2005, 10:11
Так. а на другом IP пробовал?
Если он виснет на чтении, значит что-то не так коннектом...
Попробуй PHP_NORMAL_READ

Автор: alligator 11.9.2005, 10:13
Не могу найти других беспланых соксов ((

Автор: alligator 11.9.2005, 10:32
вот вроде нашел рабочий
посмотри что возвращает http://vipartconcert.ru/php/77/t.php

Автор: alligator 11.9.2005, 10:53
Сделал так , токо не пойму как ответы разбирать(
Код

if(socket_connect($sopen,'24.255.15.217', 4321)===true){
$buffer=socket_read($sopen,4096,PHP_BINARY_READ);
print $buffer;
print "<br/>";
print bin2hex($buffer)."\r\n";
}

выводит:
005b4e8000f0fa7f

Автор: Mal Hack 11.9.2005, 11:05
Поставь цикл while и в нем read...

Автор: alligator 11.9.2005, 11:38
Что то я не догнал а цикл зачем ?

Автор: alligator 11.9.2005, 12:21
Я думаю что наверное нужно послать запрос сначала а потом считывать ответ, допустим делаю так
Запрос:
05 02 00 01
где 05 версия протокола ,02 - bind ,00 - RSV зарезервировано , 01 - тип ip адреса тобишь IPv4
как мне перевести требуемый запрос в формат понятный соксику )
можно вроде использовать pack() только я непонял как к ней составлять параметры
pack ( string format [, mixed args [, mixed ...]] )

Автор: Mal Hack 11.9.2005, 14:08
Цитата(alligator @ 11.9.2005, 12:38)
Что то я не догнал а цикл зачем ?

Ну тыже читаешь первые 4096 байт, а остальное как же?

Автор: alligator 11.9.2005, 14:54
дык а больше не нужно

Автор: nerezus 11.9.2005, 14:55
Вот кусок моего (nerezus(ICQ 547097), 2005, GPL v.2)

Код

function hex2bin($dump){
$dump=str_replace(' ', '', $dump);
$res='';
$dumplen=strlen($dump);
for ($i=0; $i<$dumplen; $i+=2){
$bt=$dump[$i].$dump[$i+1];
$res=$res.chr(hexdec($bt));}
return $res; }

function hexlen($s) {
$s=str_replace(' ', '', $s);
if (strlen($s)/2 <16) $v='0';
if (strlen($s)/2 <256) $v.='0';
if (strlen($s)/2 <4096) $v.='0';
$v.=dechex(strlen($s)/2);
return $v; }

function sockcheck( $sockip, $sockport, $timeout=10) {
$sres=0;
$f=fsockopen($sockip, $sockport, $ern, $ers, $timeout);
if (!$f) {
return 0;
} else {
$s=hex2bin('05 02 00 02');
fputs ($f, $s);
$g=fgets ($f,2);
$list= bin2hex($g);
if (($g[0]==hex2bin('04')) or ($g[0]==hex2bin('05'))) $sres=1;
fclose($f); 
return $sres; }
}

Автор: alligator 11.9.2005, 14:55
кстати если использовать pack("nvc*",05,02,00,01); то нормально будет ?
заместо hex2bin ?
Добавлено @ 14:56
Да спасибо вот я как раз пытаюсь разобраться с твоим кодом , хочу немного модифицировать его....

Автор: nerezus 11.9.2005, 15:19
hexlen кстати не нужна тут(она при работе с аськой нужна будет)
а hex2bin сам знаю, что хреново писана: когда писал, я пхп не зал. smile

Автор: alligator 11.9.2005, 15:36
Поможешь доработать ?

Автор: nerezus 11.9.2005, 16:05
ты это хочешь сделать?

Код

<?

//PHP socks proxyhunter by nerezus(ICQ 547097), 2005, GPL v.2

$from =$_GET['from'];
$to =$_GET['to'];
$pfrom =$_GET['pfrom'];
$pto =$_GET['pto'];
$outfile =$_GET['outfile'];
$timeout =$_GET['timeout'];
if ($outfile=='') $outfile='out.txt';
if ($timeout=='') $timeout=3;


function hex2bin($dump){
$dump=str_replace(' ', '', $dump);
$res='';
$dumplen=strlen($dump);
for ($i=0; $i<$dumplen; $i+=2){
$bt=$dump[$i].$dump[$i+1];
$res=$res.chr(hexdec($bt));}
return $res; }

function hexlen($s) {
$s=str_replace(' ', '', $s);
if (strlen($s)/2 <16) $v='0';
if (strlen($s)/2 <256) $v.='0';
if (strlen($s)/2 <4096) $v.='0';
$v.=dechex(strlen($s)/2);
return $v; }

function sockcheck( $sockip, $sockport, $timeout=10) {
$sres=0;
$f=fsockopen($sockip, $sockport, $ern, $ers, $timeout);
if (!$f) {
return 0;
} else {
$s=hex2bin('05 02 00 02');
fputs ($f, $s);
$g=fgets ($f,2);
$list= bin2hex($g);
if (($g[0]==hex2bin('04')) or ($g[0]==hex2bin('05'))) $sres=1;
fclose($f); 
return $sres; }
}


$form = "<form action=\"".$_SERVER['PHP_SELF']."\" method=\"get\">
<center>
<b>PHP socks proxyhunter by nerezus(ICQ 547097),<br> 2005, GPL v.2</b><br>
IP range:<br>
<input type=\"text\" name=\"from\" size=\"15\" maxlength=\"15\">
<input type=\"text\" name=\"to\" size=\"15\" maxlength=\"15\"><br>
Port range:<br>
<input type=\"text\" name=\"pfrom\" size=\"5\" maxlength=\"5\">
<input type=\"text\" name=\"pto\" size=\"5\" maxlength=\"5\"><br>
Timeout: <input type=\"text\" name=\"timeout\" size=\"2\" maxlength=\"2\"><br>
Outfile: <br>
<input type=\"text\" name=\"outfile\" size=\"16\" maxlength=\"255\"><br>
<input type=\"submit\" value=\".: GO! :.\">
</form></center>";
if ($from == '' or $to == '' or $pfrom=='' or $pto=='')  echo $form;  else {
$flist=explode('.', $from);
$tlist=explode('.', $to);
$fip=$flist[0]*256*256*256+$flist[1]*256*256+$flist[2]*256+$flist[3];
$tip=$tlist[0]*256*256*256+$tlist[1]*256*256+$tlist[2]*256+$tlist[3];
for ($i=$fip; $i<=$tip; $i++) {
    $tmp=$i;
    $d1=floor($tmp / (256*256*256)); $tmp=$tmp-$d1*(256*256*256);
    $d2=floor($tmp / (256*256)); $tmp=$tmp-$d2*(256*256);
    $d3=floor($tmp / 256); $tmp=$tmp-$d3*256;
    $d4=$tmp;
    $ip="$d1.$d2.$d3.$d4";
    if (($d4!=0) && ($d4!=255)){ 
        for ($prt=$pfrom; $prt<=$pto; $prt++) {
            if (sockcheck($ip, $prt, $timeout)) { 
                $file = fopen ($outfile, "a");
                echo "$ip:$prt<br>\n";
                fputs ($file, "$ip:$prt\n");
                fclose($file);
                flush();
                }
            }
        
} } }?>

Автор: alligator 11.9.2005, 16:31
Нет зачем у тебя он ищет прокси , а мне нужно чтобы просто список чекал...
Добавлено @ 16:36
Я просто хотел усовершенствовать функцию чека чтобы еще версию сокса возвращал

Автор: nerezus 11.9.2005, 18:02
Ну обычно сейчас все проксисервера держат и сокс4, и сокс5 =)
это относительно версии =)

а вобще сделай проверку для сокс4(у мну сокс5).
и через обе функции прогоняй =)

Автор: alligator 12.9.2005, 13:50
А зачем через 2 функции если допустим можно послать 2 запроса на сокс и посмотреть ответ что вернёт и из этого выводить ответ потипу 1 - сокс5 2 - сокс4
Где можно посмотреть спецификацию протокола сокс4 ??
я хочу еще сделать прокси чек но это легко просто каким нить гет запросом , хотя можно еще сделать проверку анонимный прокси или нет , только незнаю как это реализовать , а вот проверку на то отвечает ли прокс на комманды я знаю.....В
В общем какая задача:
1 - проверка сокс5\сокс4 и определение версий удалённых серверов
2 - проверка прокси http\https и определение типа удалённого сервера(как определить http\https)
3 - ну и само сабой вывод результата работы

И всё же меня еще мучает такой вопрос через что лучше организовать через :
socket_* или fsockopen что быстрее и оптимальнее ?


Автор: nerezus 12.9.2005, 21:52
socket_*, ибо неблок. поставишь smile

http://socks.permeo.com/protocol/socks4.protocol
http://socks.permeo.com/protocol/socks4a.protocol

Автор: user665 8.12.2009, 02:23
А нет не у кого PHP готового скрипта который чекает socks5?

Автор: Pfailed 8.12.2009, 18:21
Ссылку на rfc1928 на русском уже давали. На самом деле там ничего сложного.
Нужно только понимать несколько фундаментаьных вещей: сколько бит в байте, что такое шестнадцетеричная система счисления, для чего нужны функции pack/unpack.

В первом приближении подключение к socks5 можно оформить следующим образом:
Код

<?php
    //rfc1928
    //http://www.realcoding.net/article/view/639
    
    function get_socks5_socket($socks_host, $socks_port, $host, $port, $timeout=30)
    {
        $ip = gethostbyname($host);
        
        if(!$sock = fsockopen($socks_host, $socks_port, $errno, $errstr, $timeout))
        {
            return false;
        }
        
        stream_set_timeout($sock, $timeout);
        
        if(!fwrite($sock, "\x05\x01\x00"))
        {
            fclose($sock);
            return false;
        }
        
        if(strlen($response = fread($sock, 3)) != 2)
        {
            fclose($sock);
            return false;
        }
        
        if($response[1] != "\x00")
        {
            fclose($sock);
            return false;
        }
        
        if(!fwrite($sock, "\x05\x01\x00\x01".pack("Nn", ip2long($ip), $port)))
        {
            fclose($sock);
            return false;
        }
        
        if(strlen($response = fread($sock, 11)) != 10)
        {
            fclose($sock);
            return false;
        }

        if($response[1] != "\x00")
        {
            fclose($sock);
            return false;
        }
        
        return $sock;
    }
?>


Далее с возвращенным значением можно работать как с обычным сокетом (если не возвратился false).

Автор: krypt3r 21.12.2009, 11:58
Цитата

А нет не у кого PHP готового скрипта который чекает socks5?

На перле есть только. Для его написания достаточно было инфы с вики и снифера

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)