vorslov
Guest
PHP и ICQ - проблема авторизации на сервере
Пытаюсь написать программу, которая бы соединялась с сервером ICQ и авторизовавалась на нем.
Есть следущий код...
Проблема:
При первом соединении с сервером получаю запрос на авторизацию, создаю пакет, отправляю его и вот тут должен получить хать какой то ответ от сервера, но... но соединение завершается сервером (судя по ошибке PHP).
Может кто сталкивался с этим или увидит в чем проблема.
Заранее благодарен.
Работал по инструкции:
http://icq2000cc.hobi.ru/page5.html
http://vic20.blipp.com/pipermail/icq-devel/2003-July/005839.html
http://www.aolhackers.ru/articles/art0001ru.htm
Пытаюсь написать программу, которая бы соединялась с сервером ICQ и авторизовавалась на нем.
Есть следущий код...
Проблема:
При первом соединении с сервером получаю запрос на авторизацию, создаю пакет, отправляю его и вот тут должен получить хать какой то ответ от сервера, но... но соединение завершается сервером (судя по ошибке PHP).

Может кто сталкивался с этим или увидит в чем проблема.
Заранее благодарен.
PHP:
<?
error_reporting (E_ALL);
set_time_limit (0);
ob_implicit_flush ();
$UIN='224775055';
$Password='221459';
echo '<b>ICQ Connect</b><br><br>';
$handle = fopen("file.txt", "w");
//////////////////////////////////////////////////////////////////
echo 'connect login.icq.com:5190<br>';
// $fp = fsockopen('login.icq.com', 5190, $errno, $errstr, 30) or die("$errstr ($errno)");
// $Replay=fread($fp, 1024);
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die('error create socet');
socket_connect($socket, 'login.icq.com', 5190) or die('error connect to login.icq.com:5190');
$Replay=socket_read($socket, 1024, PHP_BINARY_READ) or die ('error readingfrom socket');
$array = unpack("c*", $Replay);
$i=0;
$DataFromReplay=array();
foreach ($array as $value){
if ($i==0) $PaketIdent=$value;
if ($i==1) $ChanelNumber=$value;
if ($i==2) $TmpVal=$value;
if ($i==3) $RandomNuber=$TmpVal*256+$value;
if ($i==4) $TmpVal=$value;
if ($i==5) $PaketLength=$TmpVal*256+$value;
if ($i>5) $DataFromReplay[$i-6]=$value;
$i++;
}
echo '<i>Replay:<br>';
echo 'Номер пакета: '.dechex($PaketIdent).'<br>';
echo 'Номер канала: '.dechex($ChanelNumber).'<br>';
echo 'Случайное число: '.dechex($RandomNuber).'<br>';
echo 'Длина пакета данных: '.dechex($PaketLength).'<br>';
echo 'Данные:<br>';
print_r($DataFromReplay);
echo '</i><br>';
if (dechex($PaketIdent)=='0') die('Connection login.icq.com:5190 error!');
//////////////////////////////////////////////////////////////////
$TVL01=makeTVL(0x01, $UIN);
$TVL02=makeTVL(0x02, Calc_Pass($Password));
$TVL03=makeTVL(0x03, '3ICQ Inc. - Product of ICQ (TM).2003a.5.47.1.3800.85');
$TVL16=makeTVL(0x16, chr(0x01).chr(0x0A));
$TVL17=makeTVL(0x17, chr(0x00).chr(0x05));
$TVL18=makeTVL(0x18, chr(0x00).chr(0x2F));
$TVL19=makeTVL(0x19, chr(0x00).chr(0x01));
$TVL1A=makeTVL(0x1A, chr(0x0E).chr(0xD8));
$TVL14=makeTVL(0x14, chr(0x00).chr(0x00).chr(0x00).chr(0x55));
$TVL0F=makeTVL(0x0F, 'en');
$TVL0E=makeTVL(0x0E, 'us');
$SNAC=$TVL01.$TVL02.$TVL03.$TVL16.$TVL17.$TVL18.$TVL19.$TVL1A.$TVL14.$TVL0F.$TVL0E;
$FLAP=makeFLAP(0x2A, 0x01, $SNAC);
fwrite($handle, $FLAP);
fclose($handle);
echo '<br>send pacet to login.icq.com:5190<br>';
socket_write($socket, $FLAP) or die ('error writ to socket ('.socket_last_error().'), '.socket_strerror(socket_last_error()));
sleep(10);
$Replay1=socket_read($socket, 1024, PHP_BINARY_READ) or die ('error writ to socket ('.socket_last_error().'), '.socket_strerror(socket_last_error()));
socket_close($socket);
if (empty($Replay1)) die('no data received from login.icq.com:5190');
$array1 = unpack("c*", $Replay1);
$i=0;
$DataFromReplay=array();
foreach ($array1 as $value){
if ($i==0) $PaketIdent=$value;
if ($i==1) $ChanelNumber=$value;
if ($i==2) $TmpVal=$value;
if ($i==3) $RandomNuber=$TmpVal*256+$value;
if ($i==4) $TmpVal=$value;
if ($i==5) $PaketLength=$TmpVal*256+$value;
if ($i>5) $DataFromReplay[$i-6]=$value;
$i++;
}
echo '<i>Replay:<br>';
echo 'Номер пакета: '.dechex($PaketIdent).'<br>';
echo 'Номер канала: '.dechex($ChanelNumber).'<br>';
echo 'Случайное число: '.dechex($RandomNuber).'<br>';
echo 'Длина пакета данных: '.dechex($PaketLength).'<br>';
echo 'Данные:<br>';
print_r($DataFromReplay);
echo '</i><br>';
//////////////////////////////////////////////////////////////////
function makeFLAP($num, $channel, $data){
$TmpDat=pack('c', $num);
$TmpDat.=pack('c', $channel);
$TmpDat.=pack('S', round(rand(1, 65525)));
$TmpDat.=pack('c', 0);
$TmpDat.=pack('c', (strlen($data)*1+3));
$TmpDat.=chr(0x00).chr(0x00).chr(0x00).chr(0x01);
$TmpDat.=$data;
// $array = unpack("c*", $TmpDat);
// foreach ($array as $value){
// echo dechex($value).'<br>';
// }
return $TmpDat;
}
function makeTVL($num, $data){
$TmpDat=pack('c', 0);
$TmpDat.=pack('c', $num);
$TmpDat.=pack('c', 0);
$TmpDat.=pack('c', strlen($data));
$TmpDat.=$data;
// $array = unpack("c*", $TmpDat);
// foreach ($array as $value){
// echo dechex($value).'<br>';
// }
return $TmpDat;
}
function Calc_Pass($PassIN){
$pass_tab = array(0xF3,0x26,0x81,0xC4,0x39,0x86,0xDB,0x92,0x71,0xA3,0xB9,0xE6,0x53,0x7A,0x95,0x7C);
$Result='';
$i=0;
$PassINArr = unpack("c*", $PassIN);
foreach($PassINArr as $value){
$Result.=pack('c', $value^$pass_tab[$i]);
$i++;
}
return $Result;
}
?>
http://icq2000cc.hobi.ru/page5.html
http://vic20.blipp.com/pipermail/icq-devel/2003-July/005839.html
http://www.aolhackers.ru/articles/art0001ru.htm