PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mit php auf Battlefield 1942 über remote anmelden und Befehl ausführen.



zyrusthc
25-01-2006, 02:17
Hallo Leute war schon lange nicht mehr hier , aber ich hab mal nen Problem .
Und zwar folgendes : Ich möchte gerne in mein Webinterface eine BF1942 remoteconsole integrieren. Mit BF2 "md5" hab ich es bereits geschafft :), Zunächst möchte ich erst mal nur mich auf dem Server anmelden und einen Befehl ausführen , im Falle meines PHPScripts "admin.runNextLevel" , soll also den Server die nächste Map starten und mir Antwort geben! BF1942 nutzt aber soweit ich verstanden habe xor Verschlüsslung zum login!

Nun habe ich das hier (http://www.dontcamp.com/code/?file=bf1942_rcon_class.php) gefunden . Und habe mir damit mal folgendes PHPScript zusammengebaut :

<?php
//IP & Remote Port
$bf1942server = "192.168.10.1";
$bf1942serverport3 = "4712";

// Remote Logindaten
$bf1942rconuser = "admin";
$bf1942rconpass = "****";

// Commando ausführen
$command ="admin.runNextLevel";
// ///////////////////////////////////////////////////


function _xorcrypt($string, $key) {

for($i=0; $i<strlen($string); $i++) {
$string[$i] = $string[$i]^$key[$i];
}

return $string;
}

if (isset($bf1942server) && isset($bf1942serverport3) && isset($bf1942rconpass) && isset($bf1942rconuser) && isset($command)) {

if(!$fp = fsockopen($bf1942server, $bf1942serverport3, $errno, $errstr, 5))
{
echo "Kann nicht zum Server verbinden! (" . $errstr . ")";
}
else
{
echo "Mit Serversocket verbunden...<br>";
// Benutzername & Password xor verschlüsseln
$key = fread($fp, 10);
$username = _xorcrypt($bf1942rconuser, $key) . "\x00";
$password = _xorcrypt($bf1942rconpass, $key) . "\x00";

// schreibe Benutzername verschlüsellt in den socket
fwrite($fp, pack("L",strlen($username)));
fwrite($fp, $username);
// schreibe Password verschlüsselt in den socket
fwrite($fp, pack("L",strlen($password)));
fwrite($fp, $password);
// Antwort auf login in $return_data schreiben
$return_data = fread($fp,1);

// Sende REMOTE-Commando an den socket
$cmd = "admin.execremotecommand \"$command\"\n";
fwrite($fp, $cmd . chr(0));
// Antwort auf login in $return_data_command schreiben
$return_data_command = fread($fp,128);

// Verbindung schliessen
if(fclose ($fp)) {
echo "Verbindung wieder geschlossen!";
}

// Ausgaben anzeigen
echo "<br><br>$return_data_command<br><br>";
echo "<br>$return_data";
}
}
?>

Aber leider wird nicht wie erwüscht die nächste Map gestartet sodern der Server geht down ohne Meldung. In der Console erscheint dann "> Aborted"

und der Browser gibt mir :

Mit Serversocket verbunden...
Verbindung wieder geschlossen!



Er scheint ja schon mal eingeloggt zu sein... , den wenn ich das mit einem falschen pw versuche bleibt er online.

Hat jemand ne Ahnung was falsch ist ?!

gruss Oli

Turbohummel
25-01-2006, 07:22
Interessantes Projekt.

Hast dus mal ohne das Kommando-Absetzen versucht? Ob der Server dann online bleibt?

Ich könnte mir eventuell einen falschen Zeichensatz liegen.

zyrusthc
25-01-2006, 15:18
Hallo

Was meinst du den mit Kommando-Absetzen ?
Wenn ich

$cmd = "admin.execremotecommand \"$command\"\n";
fwrite($fp, $cmd . chr(0));
auskomentiere dann lädt die Seite ohne damit aufzuhören. Normalerweise sollte doch wenigstens der login ausgeführt werden und die Verbindung wieder geschlossen werden. hmmm

Hat jemand noch ne Idee ?

gruss Oli

zyrusthc
25-01-2006, 17:52
Problem ist gelöst :)
Hier mal für andere User :

<?php
// ----------------------------------------------------------- //
// Send rconcommand on BF1942 Server
// 25.01.2006
// Zyrusthc : zyrusthc.homeip.net
// -----------------------------------------------------------
// Thanks to :
// http://www.dontcamp.com/code/?file=bf1942_rcon_class.php
// http://www.bf1942.lightcubed.com/forum/viewtopic.php?p=11941
// ----------------------------------------------------------- //
$bf1942server = "192.168.10.1";
$bf1942serverport3 = "4712";
$bf1942rconuser = "admin";
$bf1942rconpass = "****";
$remotecommand = "game.listmaps";
// ----------------------------------------------------------- //


function _xorcrypt($string, $key) {
for($i=0; $i<strlen($string); $i++) {
$string[$i] = $string[$i]^$key[$i];
}
return $string;
}

function xbyte_to_int($stri_conv) {
$val_finale = 0;
$len_stri = strlen($stri_conv);
for ($x = 0; $x < $len_stri; $x++) {
$val_finale = $val_finale + (ord(substr($stri_conv, $x, 1)) * pow(256, $x));
}
return $val_finale;
}


function int_to_4byte($numero_conv) {
$final_stri = "";
for ($x = 1; $x <= 3; $x++) {
$n_val = intval(floor($numero_conv/256));
$n_rest = intval($numero_conv % 256);
$final_stri .= chr($n_rest);
$numero_conv = $n_val;
}
$final_stri .= chr($n_val);
return $final_stri;
}

$command ="$remotecommand\n";

if(!$fp = fsockopen($bf1942server, $bf1942serverport3, $errno, $errstr, 5))
{
echo "Kann nicht zum Server verbinden! (" . $errstr . ")";
}
else
{
$key = fread($fp, 10);
$username = _xorcrypt($bf1942rconuser, $key) . "\x00";
$password = _xorcrypt($bf1942rconpass, $key) . "\x00";
fwrite($fp, pack("L",strlen($username)));
fwrite($fp, $username);
fwrite($fp, pack("L",strlen($password)));
fwrite($fp, $password);
$result = fread($fp,1);
$response = xbyte_to_int($result);

if ($response == 1)
$acstatus = "OK";
else
$acstatus = "ERR";

if ($acstatus== "OK") {
$comm_tmp = int_to_4byte(2);
fwrite($fp, $comm_tmp);
$comm_tmp = "ConsoleMessage 0";
$len = strlen($comm_tmp) + 1;
fwrite($fp, int_to_4byte($len));
fwrite($fp, $comm_tmp . chr(0));
$len = strlen($command) + 1;
fwrite($fp, int_to_4byte($len));
fwrite($fp, $command . chr(0));
$result = fread($fp,4);
$response = xbyte_to_int($result);
if ($response == 1) {
$result = fread($fp,4);
$len = xbyte_to_int($result);
$response_len = $len;
if ($len > 1) {
$result = fread($fp,$len);
}
else $result = "N/A";
$final_result = $result;
}
}
else {
$response_len = "N/A";
$final_result = "N/A";
}

$return = array('authentication' => $acstatus,
'response_len' => $response_len,
'response' => $final_result);

$login = $return['authentication'];
$antwortlaenge = $return['response_len'];
$antwort = nl2br($return['response']);

fclose ($fp);
}

echo "Login: $login<br>";
echo "Antwortlaenge: $antwortlaenge<br>";
echo "Antwort: $antwort";
?>

gruss Oli