Есть задумка соорудить скрипт работающий с серверами мэйл.ру. Все бы хорошо, но есть один трабол.
из теории: авторизация проходит следующим образом:
1. соединяемся с сервером он нам дает в ответ пакет данных.
2 из пакета вытаскиваем ключ
3 на основе ключа логина и пароля генерируем md5 хэш
4 составляем пакет и отправляем его обратно.
5 в ответ должен придти ответ.... НО ЕГО НЕТ(((
теперь поподробнее
Первый пакет который приходит
Из этих данных интересен только ключ 7B0000D0000000001EFE176437E87D6A
2. теперь нужно отправить пакет с опкодом 0х03 структура пакета:
хэш считается hash_hmac('md5', md5($l.$p, true),$key,true)
где $l логин $p пароль
также привожу сам текст скрипта на пхп
По моему мнению неверно расчитывается хэш.
из теории: авторизация проходит следующим образом:
1. соединяемся с сервером он нам дает в ответ пакет данных.
2 из пакета вытаскиваем ключ
3 на основе ключа логина и пароля генерируем md5 хэш
4 составляем пакет и отправляем его обратно.
5 в ответ должен придти ответ.... НО ЕГО НЕТ(((
теперь поподробнее
Первый пакет который приходит
Код:
0132107B0000D0000000001EFE176437E87D6A00010500001A333030303030353836663532383563313330353066376261383300
где
01 - CUInt опкод пакета
32 - CUInt длина пакета
10 - CUInt размер ключа
7B0000D0000000001EFE176437E87D6A - Bytes ключ
000105 - Bytes версия
00 - Byte, тип авторизации (MD5)
1A - CUInt, размер CRC
3330303030303538366635323835633133303530663762613833 - Bytes, CRC
00 - Byte, модификатор
2. теперь нужно отправить пакет с опкодом 0х03 структура пакета:
Код:
03 - CUInt опкод пакета
ХХ -CUInt размер пакета
XX - CUInt длина логина
xx xx ... xx - Bytes логин
XX -CUInt длина хэша
xx xx ... xx - Bytes хэш
00 04 ff ff ff ff Bytes нужные данные
где $l логин $p пароль
также привожу сам текст скрипта на пхп
PHP:
<?php
set_time_limit(0);
$l='user'; //логин
$p='password'; //пароль
// все конвертируется iconv("UTF-8", "UTF-16LE", $Message)
//$l=PackString($l);
//$p=PackString($p);
if(!@$sock=socket_create(AF_INET, SOCK_STREAM, SOL_TCP))
{throw new Exception("Не удалось связать сокет"); exit();}
socket_connect($sock,'link12.pwonline.ru','29000');
socket_set_block($sock);
$bufer=SocketRead($sock); // получили пакет авторизации
//echo $bufer;
//var_dump(unpack("H*", $bufer));
$key = substr($bufer,3, 16); //key
// var_dump(unpack("H*", $key));
$hash=hash_hmac('md5', md5($l.$p, true),$key,true);
$lLengh = cuint(StrLen($l));//длина логина
$hLengh = cuint(StrLen($hash));//длина hash
$Packet=$lLengh.$l.$hLengh.$hash."\x00\x04\xff\xff\xff\xff";
//echo $Packet;
SendPacket(3,$Packet,$sock);
//socket_recv($sock, $bu, 8192, 0); // получили пакет авторизации
$bu=SocketRead($sock);
echo $bu;
socket_set_nonblock($sock);
echo socket_strerror(socket_last_error($sock)) ;
SocketClose($sock);
// Функции для работы
function cuint($Data)
{ // Пакует и переворачивает строку задом на перед)))
if($Data < 64)
return StrRev(PACK("C", $Data));
else if($Data < 16384)
return StrRev(PACK("S", ($Data | 0x8000)));
else if($Data < 536870912)
return StrRev(PACK("I", ($Data | 0xC0000000)));
return StrRev(PACK("c", -32) . PACK("I", $Data));
}
function PackString($data)
{
$data = iconv("UTF-8", "UTF-16LE", $data);
return $data;
}
function PackOctet($data)
{
$data = pack("H*", $data);
return cuint(strlen($data)).$data;
}
function SendPacket($id,$data,$sock)
{ //$id - CUInt, тип/опкод пакета
//$count - CUInt, размер пакета
//$data - данные
$d = PackOctet('');
$d = cuint($id).cuint(strlen($data)).$data;
echo $d;
// $m= unpack("C*", $d);
// var_dump($m);
SocketSend($d,$sock);
}
function SocketConnect($ip,$port)
{
}
function SocketSend($data,$sock)
{
$byte=socket_send($sock, $data, 8192, 0);
var_dump(unpack("H*", $data));
echo "send $byte";
}
function SocketRead($sock)
{
socket_recv($sock, $buf, 8192, 0);
socket_set_nonblock($sock);
return $buf;
}
function SocketClose($sock)
{
socket_close($sock);
}
?>
По моему мнению неверно расчитывается хэш.
Последнее редактирование: