14 Июнь, 2013

XoT Scanner

private.jpg
Выкладываю для всех свой сканер адресов работающий напрямую с XoT. Сканер до этого был приватным и нигде еще не выкладывался. Глядя на его исходник можно легко понять как в PHP работать напрямую с пакетами. Я уже упоминал про этот сканер в этом посте.

#!phpphp.exe -q
<?php
//------------------'"-'"-----------------------------------
//          XoT Scanner NUA v.1.1
//                  by Soldier
//            http://x25networks.ru/
// 	    sprinter.team@gmail.com
//------------------------------------------------------------
// TODO:
// - написать вывод данных, если вызов принят
// - работа через прокси
// 2009
//Настройки
$address = '193.193.237.65'; // адрес хоста с XOT
$port = 1998; // порт 
$area = "2501090"; // пишем DNIC + часть area code (без последней цифры)
$start = 1000301; // пишем последнюю цифру area code и начальный адрес
$end = 1000410;  // пишем последнюю цифру area code и последний адрес

// если nua больше или меньше 14, то необходимо изменить 
// переменную $packet убрав или добавив - $nua_hex[x] 
// #################################################################################
    error_reporting(E_ALL ^ E_WARNING); // выводить все ошибки
    set_time_limit(0); // убираем ограничение по времени выполнения
    ob_implicit_flush(); //вкл. неявную очистку, отключает буферизацию вывода
   
    echo "-= Elite XoT Scanner NUA=-n";
    echo "by Soldier [http://x25networks.ru]n";
try {
	$date = date("j.m.Y"); // текущая дата
	$log = fopen($area."_log.txt", "a");  // открываем файл для лога
	fwrite($log,"rnXoT Scanner NUArnDate: $daternScan from $area$start to $area$end...rn"); // пишем в файл
//-------------------------/Генерация NUA/-------------------------------------
for ($addr=$start; $addr<=$end; $addr++) {
        $nua = $area.$addr;
//------------------------------/Создаем сокет/--------------------------------
        $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        if ($socket < 0) {
            throw new Exception('socket_create() failed: '.socket_strerror(socket_last_error())."n");
        }
//---------------------/Подключаемся к XOT/-----------------------------------
        	$result = socket_connect($socket, $address, $port);
        	if ($result === false) {
           		throw new Exception('socket_connect() failed: '.socket_strerror(socket_last_error())."n");
        	}
//---------------/Создаем и посылаем x.25 пакет/------------------------------
	echo "n*".$nua;
	fwrite($log,"rn*$nua"); // пишем в файл
	// перевод NUA в hex
	$nua_hex = str_split($nua, 2);
	for ($i=0; $i<sizeof($nua_hex); $i++) {
		$nua_hex[$i] = '0x'.$nua_hex[$i];    // дописываем '0x'
		$nua_hex[$i] = hexdec($nua_hex[$i]); // переводим из строкового формата в dec
	}
	$call_len = '0x'.dechex(strlen($nua)); // рассчет длины nua в hex
	$call_len = hexdec($call_len);		// переводим из строкового формата в dec
	$length = '0x'.dechex(strlen($nua)/2 + 15); // рассчет длины X.25 пакета в hex
	$length = hexdec($length);		// переводим из строкового формата в dec
	$c_len = strlen($nua)/2 + 19; // расчет всей длины пакета(нужен из за разной длины NUA)
	$packet = '';
	$packet = pack("C$c_len", 0x00, 0x00,  // version
				  0x00, $length, 	// length packet
			     	  0x10, 0x01, 	// GFI
			     	  0x0b, 		// CALL
			   	  $call_len, 	// call length
				  // ниже, нужно изменить cтроку для разной длины NUA 
			   	  $nua_hex[0], $nua_hex[1], $nua_hex[2], $nua_hex[3], $nua_hex[4], $nua_hex[5], $nua_hex[6], 			     			  0x06, 0x42, 0x07, 0x07,   // Facilities: length & size
			    	  0x43, 0x02, 0x02, 		 // window size (128/128)
			     	  0x01, 0x00, 0x00, 0x00);  // user data

	socket_write($socket, $packet, strlen($packet)); // отправляем пакет
	// принимаем пакет, приходящий в ответ на наш запрос
	$packet = '';
	$packet = unpack('Cversion1/Cversion2/Clength1/Clength2/Cgfi1/Cgfi2/Ctype/Ccause/Cdiag',socket_read($socket,9));
	// заносим весь пакет в массив в виде десятичных чисел, а из массива в переменные
	$type = $packet['type'];
	$cause = $packet['cause'];
	$diag = $packet['diag'];
//---------/Определяем статус по коду ответа(десятичный)/-----------------
	switch ($type) {
		case '11': $p = "Call"; break;
		case '15': $p = "Call Accepted"; break;
		case '19': $p = "Clear"; break;
		case '23': $p = "Clear Confirmation"; break;
		case '35': $p = "Interrupt"; break;
		case '39': $p = "Interrupt Confirmation"; break;
		case '27': $p = "Reset"; break;
		case '31': $p = "Reset Confirmation"; break;
		case '251': $p = "Restart n"; break;
		case '255': $p = "Restart Confirmation"; break;
		case '243': $p = "Registration"; break;
		case '247': $p = "Registration Confirmation"; break;
		case '241': $p = "Diagnostic"; break;
		case '1': $p = "RR"; break;
		case '5': $p = "RNR"; break;
		case '9': $p = "REJ"; break;
		case '0': $p = "Data"; break;
		default: $p = "Unknown n";
	}
	echo "nPAD: ".$p." (".$type.")";
	fwrite($log,"rnPAD: $p.($type)"); // пишем в файл

	if ($type == '15' ) {
           	echo "nCOMn";   // Если вызов принят, *действия*
		fwrite($log,"rnCOMrn"); // пишем в файл
		$accepted = '1';
        } else {
	$accepted = '0';
	}
	if ($type == '19' ) {   // если получен Clear, то выводим причину
		switch ($cause) {
			case '0': $p = "DTE Originated"; break;
			case '1': $p = "Number Busy"; break;
			case '3': $p = "Invalid Facility Requested"; break;
			case '5': $p = "Network Congestion"; break;
			case '9': $p = "Out Of Order"; break;
			case '11': $p = "Access Barred"; break;
			case '13': $p = "Not Obtainable"; break;
			case '17': $p = "Remote Procedure Error"; break;
			case '19': $p = "Local Procedure Error"; break;
			case '21': $p = "RPOA Out Of Order"; break;
			case '25': $p = "Reverse Charging Acceptance Not Subscribed"; break;
			case '33': $p = "Incompatible Destination"; break;
			case '41': $p = "Fast Select Acceptance Not Subscribed"; break;
			case '57': $p = "Destination Absent"; break;
			default: 
			$p = "Unknown";
		}
		switch ($diag) {
			case '00': $d = "No additional information"; break;
			case '01': $d = "Invalid P(S)"; break;
			case '02': $d = "Invalid P(R)"; break;
			case '16': $d = "PACKET TYPE INVALID"; break;
			case '17': $d = "Packet type invalid for state R1"; break;
			case '18': $d = "Packet type invalid for state R2"; break;
			case '19': $d = "Packet type invalid for state R3"; break;
			case '20': $d = "Packet type invalid for state P1"; break;
			case '21': $d = "Packet type invalid for state P2"; break;
			case '22': $d = "Packet type invalid for state P3"; break;
			case '23': $d = "Packet type invalid for state P4"; break;
			case '24': $d = "Packet type invalid for state P5"; break;
			case '25': $d = "Packet type invalid for state P6"; break;
			case '26': $d = "Packet type invalid for state P7"; break;
			case '27': $d = "Packet type invalid for state D1"; break;
			case '28': $d = "Packet type invalid for state D2"; break;
			case '29': $d = "Packet type invalid for state D3"; break;
			case '32': $d = "PACKET NOT ALLOWED"; break;
			case '33': $d = "Unidentifiable packet"; break;
			case '34': $d = "Call on one-way logical channel"; break;
			case '35': $d = "Packet type invalid on a PVC"; break;
			case '36': $d = "Packet on an unassigned LCN"; break;
			case '37': $d = "Reject not subscribed to"; break;
			case '38': $d = "Packet too short"; break;
			case '39': $d = "Packet too long"; break;
			case '40': $d = "Invalid GFI"; break;
			case '41': $d = "Restart not on logical channel 0"; break;
			case '42': $d = "Packet type incompatible with fac"; break;
			case '43': $d = "Unauthorised Intrrupt Conf"; break;
			case '44': $d = "Unauthorised Intrrupt"; break;
			case '45': $d = "Unauthorised Reject"; break;
			case '48': $d = "TIMER EXPIRED"; break;
			case '49': $d = "Timer expired for Incoming Call"; break;
			case '50': $d = "Timer expired for Clear Indication"; break;
			case '51': $d = "Timer expired for Reset Indication"; break;
			case '52': $d = "Timer expired for Restart Ind."; break;
			case '64': $d = "CALL SETUP PROBLEM"; break;
			case '65': $d = "Facility code not allowed"; break;
			case '66': $d = "Facility parameter not alloowed"; break;
			case '67': $d = "Invalid called address"; break;
			case '68': $d = "Invalid callin address"; break;
			case '69': $d = "Invalid fac/registration length"; break;
			case '70': $d = "Incomming calls barred"; break;
			case '71': $d = "No logical channel available"; break;
			case '72': $d = "Call collision"; break;
			case '73': $d = "Duplicate facility reguested"; break;
			case '74': $d = "Non-zero address length"; break;
			case '75': $d = "Non-zero facility length"; break;
			case '76': $d = "Fac not provided when expected"; break;
			case '77': $d = "Invalid CCITT specified facility"; break;
			case '80': $d = "MISCELANEOUS"; break;
			case '81': $d = "Imroper cause code from DTE"; break;
			case '82': $d = "Not octet aligned packet"; break;
			case '83': $d = "Inconsistent Q-bit setting"; break;
			case '84': $d = "Invalid   NUI"; break;
			case '96': $d = "Int. call setup or clearing prbl"; break;
			case '97': $d = "Unknown calling DNIC"; break;
			case '98': $d = "TNIC mismatch"; break;
			case '99': $d = "CI mismatch"; break;
			case '100': $d = "Negotiation error in utility par"; break;
			case '101': $d = "Invalid  facility length"; break;
			case '102': $d = "Non-zero facility length"; break;
			case '103': $d = "M-bit violation"; break;
			case '112': $d = "International problem"; break;
			case '113': $d = "Remote network problem"; break;
			case '114': $d = " International protocol problem"; break;
			case '115': $d = "International link out of order"; break;
			case '116': $d = "International link busy"; break;
			case '117': $d = "Transit network  facility problem"; break;
			case '118': $d = "Remote network facility problem"; break;
			case '119': $d = "International routing problem"; break;
			case '120': $d = "Temporary routing problem"; break;
			case '121': $d = "Unknown called DNIC"; break;
			case '122': $d = "maintenance action"; break;
			case '128': $d = "Clear by PAD subscriber"; break;
			case '129': $d = "Line surveillance Time-out"; break;
			case '130': $d = "Restart packed or disconnection on internal link"; break;
			case '131': $d = "Lost incoming character"; break;
			case '132': $d = "Break by PAD subscriber"; break;
			case '133': $d = "Reset command by PAD subscriber"; break;
			case '134': $d = "Incompatible PAD parameters"; break;
			case '144': $d = "Out of memory for taxation"; break;
			case '145': $d = "Non adressable target point"; break;
			case '146': $d = "Not enough time left"; break;
			case '147': $d = "Network loop"; break;
			case '148': $d = "Out of order caused by transpac"; break;
			case '149': $d = "Subscriber reconfiguration"; break;
			case '150': $d = "Line not in service or in maintenance"; break;
			case '151': $d = "Remote modem out of servise or looped"; break;
			case '152': $d = "Call collision on srecial subscriber link"; break;
			case '153': $d = "Reset or disconnection on L2 for special subscriber"; break;
			case '154': $d = "Restart in progress"; break;
			case '155': $d = "PVC rupture for distant LCN busy"; break;
			case '156': $d = "DISC received in Information Tansfer Stete"; break;
			case '157': $d = "DM received in Information Tansfer Stete"; break;
			case '158': $d = "SABM received in Information Tansfer Stete"; break;
			case '159': $d = "CMDR/FRMR received in Information Tansfer Stete"; break;
			case '160': $d = "Lack of buffer space"; break;
			case '161': $d = "Invalid F-bit reseived"; break;
			case '162': $d = "Unknown command or command too long"; break;
			case '163': $d = "Unknown response or response too long"; break;
			case '164': $d = "No response after N2 SABM"; break;
			case '165': $d = "No response after N2 frames"; break;
			case '166': $d = "Outgoing link not connected for forced routing links"; break;
			case '167': $d = "N(S) already reseived in same window"; break;
			case '168': $d = "No response after N2 RAZ"; break;
			case '169': $d = "Too many errors on this line"; break;
			case '170': $d = "No more LCN's due to error"; break;
			case '171': $d = "Closing signal reseived"; break;
			case '172': $d = "Loop"; break;
			case '173': $d = "No frame reception within T3"; break;
			case '176': $d = "Unknown traffic generator service"; break;
			case '177': $d = "Out of sources"; break;
			case '178': $d = "More than maximum simultaneous allowed calls"; break;
			case '179': $d = "Access barred to traffic generator services"; break;
			case '192': $d = "Call coollision on internal link"; break;
			case '193': $d = "Clearing due to priority call"; break;
			case '194': $d = "Incoherent buffer received"; break;
			case '195': $d = "Clearing due to 'Y'-error"; break;
			case '196': $d = "Incorrect P(S) or P(R) received"; break;
			case '197': $d = "Too long data packet"; break;
			case '198': $d = "Unauthorized Packet in D1, D2, D3 state"; break;
			case '199': $d = "No packet expected"; break;
			case '200': $d = "Reset reefused"; break;
			case '201': $d = "Data packet receeiveed and data packet expected"; break;
			case '202': $d = "Emergency target point unknown"; break;
			case '203': $d = "Call transfer to mobile DTE or multiple subscriber"; break;
			case '204': $d = "Incoherent block state"; break;
			case '205': $d = "Empty block"; break;
			case '206': $d = "More than 17 addresses"; break;
			case '207': $d = "AI Inaccessible"; break;
			case '208': $d = "AI not free"; break;
			case '209': $d = "Max AI sessions reached"; break;
			default: 
			$d = "Unknown";
		}
		echo ", cause: $p($cause)nDiagnostics: $d($diag)n";
		fwrite($log,", cause: $p($cause), diagnostics: $d($diag)rn"); // пишем в файл
// -------/Пакет  подтвержения сброса(Clear Confirmation)/-----------
		$packet = '';
		$packet = pack('C7', 0x00, 0x00, // version
				    	 0x00, 0x03, // length packet
				    	 0x10, 0x01, // GFI
				   	 0x17);	  // Clear Confirmation
		if ((socket_write($socket, $packet, strlen($packet))) < 0) {  // отправляем пакет
            			echo "Send X.25 Clear Confirmation packet failed";
        		} 
        	} 
// ------------------------------------------------------------------------------------
	else if ($type == '0' ) {
		echo "Data: ".$cause;  // тут выводятся данные (experimental)
	}
// -----------/Пакет  сброса вызова(если NUA рабочий)/--------------
	if ($accepted == '1' ) {
		$packet = '';
		$packet = pack('C9', 0x00, 0x00, 0x00, 0x05, 0x10, 0x01, 0x13, 0x00, 0x00);
		if ((socket_write($socket, $packet, strlen($packet))) < 0) {  // отправляем пакет
            			echo "Send X.25 Call packet failed";
        		} 
	}
// ------------------------------------------------------------------
} // закрытие цикла сканирования nua
if (isset($socket)) {
        socket_close($socket); 
    }
    } catch (Exception $e) {
        echo "nError: ".$e->getMessage();
      }
fclose($log); 
echo "Congratulations! Scan completed...n";
?> 

Web proxy