Cod sursa redirect PHP

Counter Strike 1.6 HLDS PHP fake , scris in anul 2012, proiectul nu a fost niciodata finalizat.

<?php
// fisierul 1
set_time_limit(0);


$ip = "93.115.249.200";
$port = "40000";

$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

socket_bind($socket,$ip,$port);

$from = '';
$port = 0;
$packet = "\xFF\xFF\xFF\xFFLcs.pgl.ro:27015";

do
{

socket_recvfrom($socket, $buf, 2046, 0, $from, $port);



echo "\nReceived $buf from remote address $from and remote port $port ".date("G:i:s")."\n";

switch(trim($buf[4]))
{
	case "T": //parse info server string
		//TODO - answertype 0
		//TODO - answertype 1

		$host_name = "redirectPHP";
		$map = "de_php";
		$hlversion = "1.1.2.6/Stdio";
		
		$primul_pachet = "0xFFFFFFFF";

		$de_trimis = "\xFF\xFF\xFF\xFF\x49\x30\x50\x47\x4C\x20\x50\x75\x62\x6C\x69\x63\x20\x53\x65\x72\x76\x65\x72\x20\x43\x53\x20\x31\x2E\x36\x00\x64\x65\x5F\x69\x6E\x66\x65\x72\x6E\x6F\x00\x63".
		"\x73\x74\x72\x69\x6B\x65\x00\x43\x6F\x75\x6E\x74\x65\x72\x2D\x53\x74\x72\x69\x6B\x65\x00\x0A\x00\x15\x16\x00\x64\x6C\x00\x01\x31\x2E\x31\x2E\x32\x2E\x36\x2F\x53\x74\x64\x69\x6F\x00\x91\x87".
		"\x69\x02\x2C\x26\x52\x37\x0B\x40\x01\x0A\x00\x00\x00\x00\x00\x00\x00";

		socket_sendto($socket, $de_trimis, strlen($de_trimis), 0, $from, $port);

		break; 
	case 'd': //parse info server string OLD STYLE
		//TODO - answertype 2
		break;
	
	case 'p': //parse players info OLD STYLE
	case 'U': //parse players info
		//TODO
		$de_trimis = "\xFF\xFF\xFF\xFF\x44\x15\x00\x53\x68\x61\x64\x6F\x77\x4B\x69\x6C\x6C\x65\x72\x00\x13\x00\x00\x00\x93\xF9\xAB\x45\x00\x49\x63\x53\x00\x0A\x00\x00\x00\x1F\x12\x90\x45\x00\x4E".
		"\x6F\x7A\x7A\x00\x0E\x00\x00\x00\xF7\x81\x03\x45\x00\x49\x4E\x53\x00\x18\x00\x00\x00\x8C\xFB\xD5\x44\x00\x50\x61\x63\x45\x73\x74\x69\x4D\x6F\x72\x74\x00\x01\x00\x00\x00\x13\x3B\xB2\x44\x00".
		"\x52\x6F\x4D\x61\x52\x69\x4F\x00\x23\x00\x00\x00\x99\x2E\xA7\x44\x00\x53\x75\x73\x68\x69\x00\x0A\x00\x00\x00\x5D\x16\x82\x44\x00\x67\x69\x67\x69\x68\x00\x0A\x00\x00\x00\x12\x03\x6A\x44\x00".
		"\x4D\x65\x74\x68\x61\x6E\x65\x00\x09\x00\x00\x00\xD1\xCB\x42\x44\x00\x66\x61\x76\x73\x00\x05\x00\x00\x00\xA8\x58\x23\x44\x00\x63\x72\x61\x70\x00\x05\x00\x00\x00\x7D\x86\xDF\x43\x00\x57\x65".
		"\x74\x20\x46\x69\x6E\x67\x65\x72\x73\x00\x05\x00\x00\x00\x0C\x75\xDF\x43\x00\x50\x52\x49\x4E\x43\x45\x24\x24\x3A\x3A\x3A\x3A\x00\x03\x00\x00\x00\x71\xD8\xD5\x43\x00\x6C\x6D\x66\x61\x6F\x00".
		"\x04\x00\x00\x00\xC5\x4E\xB2\x43\x00\x6C\x6F\x77\x00\x03\x00\x00\x00\x9F\x74\x8B\x43\x00\x7A\x75\x72\x4C\x69\x61\x00\x00\x00\x00\x00\xB9\x44\x05\x43\x00\x70\x49\x52\x49\x00\x01\x00\x00\x00".
		"\x50\xDF\xDA\x42\x00\x53\x6B\x79\x72\x69\x6D\x4D\x6D\x00\x00\x00\x00\x00\x6E\x37\xD3\x42\x00\x54\x75\x44\x79\x00\x00\x00\x00\x00\x85\xBB\xA5\x42\x00\x72\x69\x70\x63\x6C\x69\x63\x6B\x73\x74".
		"\x61\x6E\x67\x61\x00\x00\x00\x00\x00\x8D\x24\x9D\x42\x00\x76\x31\x73\x33\x7A\x5A\x00\x01\x00\x00\x00\xDB\xBA\x00\x42";

		socket_sendto($socket, $de_trimis, strlen($de_trimis), 0, $from, $port);

		break;
	case 'V': //parse rules
		//TODO
		break;
	case 'c':  //parse connect string 
		//TODO
		break;
	
	case 'g': //parse getchallenge buf
		//TODO
		break;

	default: 
		echo "aici a ajuns defapt";
		break;

}

}while($x=1);




// fisierul 2

set_time_limit(0);

function bintohex($str) {
    $hex = "";
    $i = 0;
    do {
        $hex .= "\x".strtoupper(bin2hex($str[$i]));
        $i++;
    } while ($i < strlen($str));
    return $hex;
}

function GetChallenge ($port,$buf,$len) {
	$cbuf = '';
	$ctype = 0;
	if($len < 16) return;
	if(strncmp(substr($buf,4,12), "getchallenge", 12)) return;
	$buf[$len] = 0;
		if(!strcmp(substr($buf,17,5), "valve")) {
			$ctype = 2;
		}elseif (!strcmp(substr($buf,17,5), "steam")) {
			$ctype = 3;
		}else return;
			$cbuf.= "\xFF\xFF\xFF\xFFA 00000000 ".(rand() | (rand() << 16) & 0x7FFFFFFF)." $ctype";
		
		switch($ctype){
				case 2:
					$cbuf.= "\n";
					break;
				case 3:
					$cbuf.= "1m 30819d300d06092a864886f70d010101050003818b0030818702818100b5a614e896036cc9f9bd6d13f2f5c79fbb5f925e8dbb50f0b9ee9a5499f535978fe60c188e4f8872160d86b76b80f1ba82333d586b".
					"32692ffa31e1dd59a603dc6370004566afa54830898d4ff210c738deb059e0a94a87dd85be28668793681a4ecf647fa1b5294a73927f23ffba0c6a9140922d27002012fed2b4a898aa7811020111";
					break;					
			}
			return $cbuf;
}

function ParseConnect($buf,$len)
{

	/*
	char* buf, int len, int port, SOCKET name_sock,sockaddr_in server_addr) {
	char* cbuf = buf + 4;
	char SBuf[1500];
	in_addr ina;
	int res;
	if (len < 11) return;
	if (strncmp(cbuf, "connect", 7)) return;
	cbuf = SBuf;
	res = sprintf(cbuf, "%c%c%c%c%c %d \"%s:%d\" %d", 0xFF, 0xFF, 0xFF, 0xFF, 'B', 1, inet_ntoa(server_addr.sin_addr), port, 0);
	cbuf += res;

	res = cbuf - SBuf;
	sendto(name_sock,(const char *)SBuf, res, 0,(sockaddr  *)  &server_addr, sizeof(server_addr));

	cbuf = SBuf;
	res = sprintf(cbuf, "%c%c%c%c%c%c%c%c", 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0);
	cbuf += res;
	res = sprintf(cbuf, "%cecho \"* www.csservers.ro \";echo;echo;echo \"* ok \"; %s\n", 0x9, "Connect cs.pgl.ro:27015");
	cbuf += res + 1;

	res = cbuf - SBuf;
	while (res % 4) {
		SBuf[res++] = 1;
	}
	Munge2((int*)(SBuf+8), res-8, 0);
	//SendData(SBuf, res, ip, port);
	sendto(name_sock,(const char *)SBuf, res, 0,(sockaddr  *)  &server_addr, sizeof(server_addr));
*/
	$cbuf = '';
	if($len<11) return;
		$cbuf.=sprintf("%c%c%c%c%c%c%c%c%cecho \"* www.csservers.ro \";echo;echo;echo \"* ok\"; %s\n", 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x9, "Connect cs.pgl.ro:27015");
			var_dump($cbuf);
	return;	
		
}

function BuildMSInfo($challenge)
{
	return "0\n\\protocol\\47\\challenge\\$challenge\\players\\22\\max\\32\\bots\\0\\gamedir\\cstrike\\map\\de_dust2\\type\\d\\password\\0\\os\\l\\secure\\0\\lan\\0\\version\\%s\\region\\255\\product\\valve\n";
}

function getInfo($ip,$port)
{
	$fp	= fsockopen("udp://$ip",$port,$errno,$errstr,1);
	stream_set_timeout($fp,1);
	fwrite($fp,"\xFF\xFF\xFF\xFFTSource Engine Query\x00"); 
	$getinfo = fread($fp,65536);
	fclose($fp);
	return $getinfo;
	unset($getinfo); 
}
	function getPlayers($ip,$port)
{
	$q_player = "\xFF\xFF\xFF\xFF\x55"; 
	$fp	= fsockopen("udp://$ip",$port,$errno,$errstr,1);
	stream_set_timeout($fp,1);
	fwrite($fp,"\xFF\xFF\xFF\xFF\x55\xFF\xFF\xFF\xFF");
	$getinfo = substr(fread($fp,65536),5,4);
	fwrite($fp,$q_player.$getinfo);
	$players = fread($fp,2046);
	fclose($fp);
	return $players;
	unset($players);
}
function getRules($ip,$port)
{
	$q_rules  = "\xFF\xFF\xFF\xFF\x56"; 
	$fp	= fsockopen("udp://$ip",$port,$errno,$errstr,1);
	stream_set_timeout($fp,1);
	fwrite($fp,"\xFF\xFF\xFF\xFF\x55\xFF\xFF\xFF\xFF");
	$getinfo = substr(fread($fp,65536),5,4);
	fwrite($fp,$q_rules.$getinfo);
	$rules= fread($fp,2046);
	fclose($fp);
	return $rules;
	unset($rules); 
}


/* random 32 players times ) */
		$t_32 = array(
			rand(0.0,1000.5), rand(0.0,900.5), rand(0.0,800.5), rand(0.0,900.5),
			rand(0.0,900.5),  rand(0.0,900.5), rand(0.0,900.5), rand(0.0,200.5),
			rand(0.0,900.5),  rand(0.0,600.5), rand(0.0,400.5), rand(0.0,100.5),
			rand(0.0,900.5),  rand(0.0,900.5), rand(0.0,300.5), rand(0.0,200.5),
			rand(0.0,400.5),  rand(0.0,550.5), rand(0.0,600.5), rand(0.0,400.5),
			rand(0.0,1200.5), rand(0.0,900.5), rand(0.0,800.5), rand(0.0,800.5),
			rand(0.0,300.5),  rand(0.0,900.5), rand(0.0,700.5), rand(0.0,900.5),
			rand(0.0,400.5),  rand(0.0,100.5), rand(0.0,500.5), rand(0.0,900.5)
		);
		$t_32_0 = array(
			rand(0.0,12.5), rand(0.0,21.5), rand(0.0,11.5), rand(0.0,9.5),
			rand(0.0,2.5),  rand(0.0,4.5),  rand(0.0,21.5), rand(0.0,7.5),
			rand(0.0,3.5),  rand(0.0,5.5),  rand(0.0,6.5),  rand(0.0,9.5),
			rand(0.0,1.5),  rand(0.0,4.5),  rand(0.0,2.5),  rand(0.0,8.5),
			rand(0.0,2.5),  rand(0.0,5.5),  rand(0.0,3.5),  rand(0.0,7.5),
			rand(0.0,13.5), rand(0.0,1.5),  rand(0.0,2.5),  rand(0.0,5.5),
			rand(0.0,6.5),  rand(0.0,3.5),  rand(0.0,15.5), rand(0.0,20.5),
			rand(0.0,10.5), rand(0.0,2.5),  rand(0.0,15.5), rand(0.0,6.5)
		);




		$ms_ip = array(
			"188.40.40.201",  "188.40.40.201", "46.4.71.67",  "46.4.71.67",    "68.142.72.250", "69.28.158.131",       
			"69.28.158.131",  "hl2master.steampowered.com", "hl1master.steampowered.com",       "176.9.50.16", 
			"176.9.50.16",    "176.9.50.16",   "games.vipeburg.info", "188.40.40.201", "46.4.71.67", 
			"css.setti.info", "css.setti.info", "87.224.171.208",     "208.64.200.65", "css.setti.info", "46.4.14.146",
			"68.177.101.62",  "68.177.101.62", "188.40.40.201",       "188.40.40.201", "188.40.40.201",  "188.40.40.201", "188.40.40.201"
		);
		
		$ms_port = array (
		27010, 27011, 27010, 27011, 27012, 27012, 27011, 27011, 27011, 27010, 27011 ,27012,27010, 27012, 27012, 27011, 27010, 27010, 27015, 27012, 27010, 27011, 27010, 47015, 47016, 47017, 47035, 27010, 27010
		);


function BuildPlayers($timp_rnd,$t_start,$t_32,$t_32_0,$sdsad)

{	
	$timp=0;
	$frags=0;

	$de_trimis="\xff\xff\xff\xff\x44";
	$p = $de_trimis;
	$maxplayers=6;
	$p.= chr($maxplayers);

	for($i = 0;$i < $maxplayers; $i++)
	{
		$timp = (float)($t_32[$i])+date("s",time($i));
		$frags = (8253729 * 5323 + 2396403)%43;
		if($t_start<time()+900){
			$timp=0;
			$frags=0;
			$timp=(float)($t_32_0[$i])+date("s",time($i));
			$frags=(8253729 * 5323 + 2396403)%43;
		}
			$players_list = array(
			"ok","drg","faNta","cccc","Ombladon","Freakadadisk","Parazitii","inefect");
		$p.= 0;
		$p.= $players_list[$i];
		$p.= @pack('N',$frags);
		$p.= @pack('x',0,0,0,0);
		$p.= @pack('f',$timp);
		$p.= @pack('x',0,0,0,0);
		}
	return $p;
}




$ip = "93.115.249.200";
$port_red = "40000";
$redirectioneaza_ip = "109.163.228.220"; //war.pgl.ro
$redirectioneaza_port =	27015 ;

$timp_rnd = rand(0.0,235.5);
$t_start=time(); // cand s-au deschis redirectele

$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($socket,$ip,$port_red);

$from = '';
$port = 0;
$de_trimis="q";
/* query ms */
/*
for($i=0;$i<sizeof($ms_ip);$i++){
socket_sendto($socket, $de_trimis, strlen($de_trimis), 0, $ms_ip[$i], $ms_port[$i]);
}
*/
/* end query ms */

while(1){

@socket_recvfrom($socket, $buf, 2046, 0, $from, $port);
	/*
if($t_start<time()+250) socket_sendto($socket, "q", 1, 0, $from, $port);*/

 //echo "\nReceived $buf from remote address $from and remote port $port ".date("G:i:s")."\n";

switch(trim($buf[4])){
	case "T": 
		//TODO - answertype 0
		//TODO - answertype 1
		$de_trimis = getInfo($redirectioneaza_ip,$redirectioneaza_port);
		socket_sendto($socket, $de_trimis, strlen($de_trimis), 0, $from, $port);
		unset($de_trimis);
	/*	$de_trimis = $x;//getPlayers($redirectioneaza_ip,$redirectioneaza_port);
		socket_sendto($socket, $de_trimis, strlen($de_trimis), 0, $from, $port);
		unset($de_trimis);
		$de_trimis =  getInfo($redirectioneaza_ip,$redirectioneaza_port);
		socket_sendto($socket, $de_trimis, strlen($de_trimis), 0, $from, $port);
		unset($de_trimis);
		*/
		break; 

	case "d": 
		//TODO - answertype 2
		break;
	
	case "p": 
	case "U": 
		$de_trimis = BuildPlayers(2,$timp_rnd,$t_start,$t_32,$t_32_0,0);
		socket_sendto($socket, $de_trimis, strlen($de_trimis), 0, $from, $port);
		unset($de_trimis);
		break;

	case "V": 
		$de_trimis = getRules($redirectioneaza_ip,$redirectioneaza_port);
		socket_sendto($socket, $de_trimis, strlen($de_trimis), 0, $from, $port);
		unset($de_trimis);
		break;

	case "c":   
		$de_trimis = ParseConnect($buf,strlen($buf));
		echo "\n[p$port_red][info] connect [$buf] from <$from:$port>\n";
			if(strncmp(substr($buf,4,7), "connect", 7)) return;
				$cbuf=sprintf("%c%c%c%c%c %d \"%s:%d\" %d", 0xFF, 0xFF, 0xFF, 0xFF, 'B', 1, $from, $port, 0);
		socket_sendto($socket, $cbuf, strlen($cbuf), 0, $from, $port);
		socket_sendto($socket, $de_trimis, strlen($de_trimis), 0, $from, $port);
		unset($de_trimis);
		break;
	
	case "g": 
		//TODO
		echo "\n[p$port_red][info] getchallenge [$buf] from <$from:$port>\n";
		$de_trimis = GetChallenge($port_red, $buf, strlen($buf));
		socket_sendto($socket, $de_trimis, strlen($de_trimis), 0, $from, $port);

		//socket_sendto($socket, "\xFF\xFF\xFF\xFFLcs.pgl.ro:27015\x00", strlen("\xFF\xFF\xFF\xFFLcs.pgl.ro:27015\x00"), 0, $from, $port); //redirect packet test
		
		unset($de_trimis);
		break;

	//masterserver
	case 's':
		$challenge=@unpack("I",substr($buf,5,4));
		$de_trimis = BuildMSInfo($challenge[1]);
		socket_sendto($socket, $de_trimis, strlen($de_trimis), 0, $from, $port);
		unset($challenge);
		unset($de_trimis);
		break;

	case 'O':
		//outd
		break;

	case 'l':
		//badcha
		break;

	}
}
?>