Gamespy requesten...
-
Hey!
Ich möchte gerne eine Serverliste von gamespy bekommen. Dazu habe ich mir angesehen, was mein Spielclient sendet:
\gamename\vietcong\gamever\2\location\0\validate\jMDRCtCC\enctype\2\final\\queryid\1.1\ \list\cmp\gamename\vietcong\final\
Sind zwei Pakete. Ich bekomme als Antwort aber immer nur:
\basic\\secure\KVOXTF
Nun befürchte ich, dass es etwas mit "validate\jMDRCtCC" im ersten Request zu tun hat. Kann es sein, dass mein Spieleclient einen Validationscode erzeugt, ohne dem mir der gamespy-server keine Antwort gibt? Dieser Code ist jedenfalls bei jeder Serverlist-Aktualisierung verschieden.
Was kann ich tun? Kann ich in PHP einen Code-Generator bauen, wenn ich zB. 100 verschiedene Codes habe? Wie stelle ich das an?
Oder fällt euch etwas Anderes ein?Danke!
MfG
-
Ok ich bin grad draufgekommen, dass das mit dem Validationscode stimmt. Und ich habe sogar in den Weiten des Netzes einen Algo gefunden:
#include <stdio.h> unsigned char gsvalfunc(unsigned char reg) { if(reg < 0x1a) return(reg + 'A'); if(reg < 0x34) return(reg + 'G'); if(reg < 0x3e) return(reg - 4); if(reg == 0x3e) return('+'); if(reg == 0x3f) return('/'); return(0); } unsigned char *gsseckey(unsigned char *secure, unsigned char *key) { static unsigned char validate[9]; unsigned char secbuf[7], buff[256], *ptr, *ptrval, *sec, *k, tmp1, tmp2, ebx, i, ecx, edx, edi; i = 0; ptr = buff; do { *ptr++ = i++; } while(i); /* 256 times */ ptr = buff; k = memcpy(secbuf, key, 6); k[6] = edx = i = 0; do { /* 256 times */ if(!*k) k = secbuf; edx = *ptr + edx + *k; /* don't use the XOR exchange optimization!!! */ /* ptrval is used only for faster code */ ptrval = buff + edx; tmp1 = *ptr; *ptr = *ptrval; *ptrval = tmp1; ptr++; k++; i++; } while(i); sec = memcpy(secbuf, secure, 6); sec[6] = edi = ebx = 0; do { /* 6 times */ edi = edi + *sec + 1; ecx = ebx + buff[edi]; ebx = ecx; /* don't use the XOR exchange optimization!!! */ /* ptr and ptrval are used only for faster code */ ptr = buff + edi; ptrval = buff + ebx; tmp1 = *ptr; *ptr = *ptrval; *ptrval = tmp1; ecx = tmp1 + *ptr; *sec++ ^= buff[ecx]; } while(*sec); ptr = key; sec = secbuf; do { /* 6 times */ *sec++ ^= *ptr++; } while(*sec); sec = secbuf; ptrval = validate; for(i = 0; i < 2; i++) { tmp1 = *sec++; tmp2 = *sec++; *ptrval++ = gsvalfunc(tmp1 >> 2); *ptrval++ = gsvalfunc(((tmp1 & 3) << 4) + (tmp2 >> 4)); tmp1 = *sec++; *ptrval++ = gsvalfunc(((tmp2 & 0xf) << 2) + (tmp1 >> 6)); *ptrval++ = gsvalfunc(tmp1 & 0x3f); } *ptrval = 0x00; return(validate); } int main() { char validate_key[64]; // bq98mE ist ein statischer Code, bestimmt das jeweilige Spiel // JGVPXW ist der secure-code, aus dem der validationscode generiert wird strcpy(validate_key, gsseckey("JGVPXW", "bq98mE", 2)); printf("Validate String: %s\n", validate_key); }
Funktioniert auch.
Problem ist nur: Ich brauche das in PHP
Ist das möglich? Würde mir jemand dabei helfen?Danke!
MfG
-
Habe eine fast gleiche PHP Funktion gefunden. Aber leider fehlt ein kleiner Teil.
function __MakeValidate($SecureKey, $Handoff) { /* MakeValidate creates a Validate-Key for you :D $SecureKey: The Secure-Key received from the GS Master $Handoff: See GetServers() */ $Temp = array(0, 0, 0, 0, $Handoff); // Array for some temporary Variables $Table = array(); for($i = 0; $i <= 255; $i++) { $Table[$i] = $i; // Fill the buffer } // Check the Handoff-Length: if(strlen($Handoff) >= 13) { $Handoff = ""; // Invalid Handoff! -> Need 6-char Handoff for($i = 2; $i <= 13; $i += 2) { $Handoff .= $Temp[4]{$i}; } } // Add the length of the Keys to the array: $Length = array(strlen($Handoff), strlen($SecureKey)); for($i = 0; $i <= 255; $i++) { // Scramble the Table with the Handoff: $Temp[0] = ($Temp[0] + $Table[$i] + ord($Handoff{$i % $Length[0]})) & 255; $Temp[1] = $Table[$Temp[0]]; // Update the buffer: $Table[$Temp[0]] = $Table[$i]; $Table[$i] = $Temp[1]; } $Temp[0] = 0; $Key = array(); // Scramble the SecureKey with the Table: for($i = 0; $i < $Length[1]; $i++) { // Add the next char to the Array $Key[$i] = ord($SecureKey{$i}); $Temp[0] = ($Temp[0] + $Key[$i] + 1) & 255; $Temp[1] = $Table[$Temp[0]]; $Temp[2] = ($Temp[2] + $Temp[1]) & 255; $Temp[3] = $Table[$Temp[2]]; $Table[$Temp[2]] = $Temp[1]; $Table[$Temp[0]] = $Temp[3]; // XOR the Key with the Buffer: $Key[$i] ^= $Table[($Temp[1] + $Temp[3]) & 255]; } $Length[1] /= 3; $i = 0; $ValidateKey = ""; // Create the ValidateKey: while($Length[1]--) { $Temp[1] = $Key[$i++]; $Temp[3] = $Key[$i++]; $ValidateKey .= $this->__AddChar($Temp[1] >> 2); $ValidateKey .= $this->__AddChar((($Temp[1] & 3) << 4) | ($Temp[3] >> 4)); $Temp[1] = $Key[$i++]; $ValidateKey .= $this->__AddChar((($Temp[3] & 15) << 2) | ($Temp[1] >> 6)); $ValidateKey .= $this->__AddChar($Temp[1] & 63); } return $ValidateKey; } function __AddChar($Number) { // Return a new char if($Number < 26) { return chr($Number + 65); } elseif($Number < 52) { return chr($Number + 71); } elseif($Number < 62) { return chr($Number - 4); } elseif($Number == 62) { return "+"; } elseif($Number == 63) { return "/"; } }
Tja, und in der __MakeValidate-Funktion fehlt leider der Teil des C++-Codes:
// FOR VIETCONG ONLY: ptr = key; sec = secbuf; do { /* 6 times */ *sec++ ^= *ptr++; } while(*sec);
Würde sich das jemand ansehen? Ich weiß nicht, wie ich diesen C++- Code in die PHP-Funktion einbauen könnte. C++ und PHP-Code sind aber sehr ähnlich.
Danke!
MfG
-
Hab das gesamte Script in PHP gefunden
Doch leider funktioniert es komischerweise nur auf meinem lokalen apache Server, aber auf keinem von drei von mir getesteten webspaces...Woran könnte das liegen? Das Script verwendet eigentlich nur fsockopen() als besondere Funktion, und aktiviert sind sockets auf allen webspaces von mir.
http://rhonkar.kilu.de/gsquery.rar
Das Problem:
Die IP's und Ports stimmen nicht! Sind alle falsch, komplettes Wirrwarr.So könnt ihr erkennen, ob das Script richtig funktioniert:
Die Ports müssen alle 15425 sein, bei mir sind sie alle irgendwas anderes, siehe:http://rhonkar.kilu.de/test/index2.php
Was stimmt da nicht? Warum geht's nur auf meinem lokalen Server?
Danke schonmal!
MfG
-
Bei meinem Webspace ging es auch nicht, da Hetzner nur TCP Sockettraffic erlaubt, nicht aber UDP.
Mein Workaround besteht darin, auf dem Gameserver einen kleinen Dämon für TCP Requests lauschen zu lassen und dann bei Bedarf das Programm lokal zu "queryen".
Die Antwort geht dann über TCP raus.
-
Auf dem Gameserver?
Ich möchte aber alle Server abfragen, die gehören ja alle nicht mir...
Aber danke für den Tipp, liegt es ganz sicher an deaktiviertem UDP?MfG
-
ceplusplus@loggedoff schrieb:
Aber danke für den Tipp, liegt es ganz sicher an deaktiviertem UDP?
Das bekommst du mit Netcat raus, das auf einem Rechner läuft, auf den du zugriff hast.
Lass Netcat für eingehende UDP Verbindungen lauschen (Firewall öffnen, gell) und dann lass diesen Rechner von deinem Webspace aus queryen. Wenn UDP Daten ankommen, dann meldet dir das Netcat, egal, wie die Daten im einzelnen aussehen.
-
Jo, kanns ja dann mal lokal nen Logger laufen lassen, aber bei einem meiner webspaces, wo es nicht funktioniert steht:
Registered Stream Socket Transports: tcp, udp, unix, udg, ssl, sslv3, sslv2, tls
Oder heißt das nix? Ist eine Freischaltung für UDP im Grunde problemlos? Oder haben die Provider schon nen guten Grund, das deaktiviert zu haben?
Danke!
MfG
-
ceplusplus@loggedoff schrieb:
Registered Stream Socket Transports: tcp, udp, unix, udg, ssl, sslv3, sslv2, tls
Das steht bei mir auch. Aber deren Firewall lässt UDP nicht raus.
Ich habe die dann nicht weiter gelöchert, vermutlich wollen sie unbezahltes Videostreaming&co verhindern.
-
Ok hab geloggt aber es wird nur TCP verwendet...
... $sock = fsockopen('tcp://master.gamespy.com', 28900, $errno, $errstr, 30); ... fwrite($sock,$test.$vkey.$test1); ... while($a=fread($sock,50)){$buffer.=$a;} ...
Woran könnte es noch liegen? Die Daten kommen ja anscheinend an, sonst würde die Liste wohl leer sein:
http://rhonkar.kilu.de/test/index2.php
MfG
-
Wenn ich auf meinem lokalen Server "zend.ze1_compatibility_mode" auf "ON" stelle, dann kommt genauso ein Zahlenwirrwarr heraus, wie auf meinen Webspaces.
Problem ist nur, dass zend.ze1_compatibility_mode auf meinen Webspaces überall deaktiviert ist........ daran liegt es also anscheinend auch nicht, oder gibts da Unterschiede zwischen den PHP Versionen?
Ist die einzige Einstellung, die einen Effekt auf das Ergebnis hat...
MfG
-
Könnte es vielleicht daran liegen?:
Webhoster: PHP_VERSION=5.1.6 PHP_OS=Linux PHP_INT_MAX=9223372036854775807 PHP_INT_SIZE=8 +1 -> -9223372036854775808 - -> -9223372036854775807 -1 -> -9223372036854775808 L -> dcba N -> abcd V -> dcba Lokal: PHP_VERSION=5.2.5 PHP_OS=WINNT PHP_INT_MAX=2147483647 PHP_INT_SIZE=4 +1 -> -2147483648 - -> -2147483647 -1 -> -2147483648 L -> dcba N -> abcd V -> dcba
Könnte es sein, dass die Bitoperations-Funktionen im Script nur für 32Bit CPUs gedacht sind?
Ich habe das Script nun übersichtlicher gemacht (Selber Link). Vielleicht sieht es sich ja noch mal wer an?
Wäre es ohne großem Aufwand möglich, diese Bit-Funktionen so umzuschreiben, dass sie für 32- und 64bit funktionieren?http://rhonkar.kilu.de/gsquery.rar
http://rhonkar.kilu.de/test/index2.php (Falsche IP's und Ports, Ports sollten immer 15425 sein, manche 15426, 15427 aber nicht so ein Wirrwarr)Danke!
MfG
-
Ich bin mir ziemlich sicher, dass es an den Funktionen...
function lshiftright($var, x, x, x, x, x, $y)
...in SharedDecode.php liegt. Ist es großer Aufwand, die auf 64bit umzuschreiben? Könnten die dann auch noch mit 32bit funktionieren?
MfG