Oh hell yeah fixed it, the problem was that i was creating a new socket to send a master serv request and some regex fails in getstatus/getchallenge, now its working:
PHP Code:
#!/usr/bin/perl
use strict;
use warnings;
use IO::Socket;
my $maxlen = 1024;
my $server_port = 28962;
my $emulate_server = "92.222.182.117";
my $emulate_port = 28960;
my $emulate_protocol = 117;
my $emulate_version = 1.2;
my $send_message = '';
my $msg = '';
my $socket = IO::Socket::INET->new(LocalPort => $server_port, Proto => 'udp') or die "socket: $@";
print "Starting server on port $server_port\n";
&send_master_heartbeat;
&get_ip_authorize;
my $master_time = time;
while (my $adr = recv($socket, $msg, $maxlen, 0)) {
my ($port, $ipaddr) = sockaddr_in($adr);
my $host = "undefined";
my $temphost = gethostbyaddr($ipaddr, AF_INET);
if (defined($temphost)) {
$host = $temphost;
}
my $ip = inet_ntoa($ipaddr);
print "client $ip ($host) said ''$msg''\n";
if (time > ($master_time + 60)) {
&send_master_heartbeat;
&get_ip_authorize;
$master_time = time;
}
if ($msg =~ /^\xFF\xFF\xFF\xFFgetstatus/i) {
$send_message = &get_server_status;
}
elsif ($msg =~ /^\xFF\xFF\xFF\xFFgetinfo/i) {
$send_message = &get_server_info;
}
elsif ($msg =~ /^\xFF\xFF\xFF\xFFgetchallenge/i) {
$send_message = ("\xFF\xFF\xFF\xFFchallengeResponse " . time);
}
elsif ($msg =~ /^\xFF\xFF\xFF\xFFconnect/i) {
$send_message = ("\xFF\xFF\xFF\xFFerror\r\nThis is a Test Fake Server.\nPlase connect to a original one.");
}
send($socket, $send_message, 0, $adr) == length($send_message) or &die("Socket error: $!");
}
close($socket);
sub get_server_status {
my $message = '';
my $read_timeout = 1;
my $got_response = 0;
my $status = ("\xFF\xFF\xFF\xFFgetstatus");
socket(SOCKET, AF_INET, SOCK_DGRAM, getprotobyname("udp")) or &die("Socket error: $!");
my $d_ip = inet_aton($emulate_server);
my $portaddr = sockaddr_in($emulate_port, $d_ip);
send(SOCKET, $status, 0, $portaddr) == length($status) or &die("Cannot send message");
$portaddr = recv(SOCKET, $message, $maxlen, 0) or &die("Socket error: recv: $!");
$message =~ s/protocol\\\d+/protocol\\$emulate_protocol/g;
$message =~ s/shortversion\\\d\.\d/shortversion\\$emulate_version/g;
# print "$status_message\n";
close(SOCKET);
return $message;
}
sub get_server_info {
my $message = '';
my $read_timeout = 1;
my $got_response = 0;
my $info = ("\xFF\xFF\xFF\xFFgetinfo");
socket(SOCKET, AF_INET, SOCK_DGRAM, getprotobyname("udp")) or &die("Socket error: $!");
my $d_ip = inet_aton($emulate_server);
my $portaddr = sockaddr_in($emulate_port, $d_ip);
send(SOCKET, $info, 0, $portaddr) == length($info) or &die("Cannot send message");
$portaddr = recv(SOCKET, $message, $maxlen, 0) or &die("Socket error: recv: $!");
$message =~ s/protocol\\\d+/protocol\\$emulate_protocol/g;
# print "$info_message\n";
close(SOCKET);
return $message;
}
sub send_master_heartbeat {
my $master = "cod2master.activision.com";
my $master_port = 20710;
my $master_message = ("\xFF\xFF\xFF\xFFheartbeat COD-2");
my $d_ip = gethostbyname($master);
my $portaddr = sockaddr_in($master_port, $d_ip);
print "Sending heartbeat to $master\n";
send($socket, $master_message, 0, $portaddr) == length($master_message) or &die("Cannot send message");
}
sub get_ip_authorize {
my $master = "cod2master.activision.com";
my $master_ip = inet_ntoa(inet_aton($master));
my $master_port = 20700;
my $master_message = ("\xFF\xFF\xFF\xFFgetIpAuthorize " . time . " " . $master_ip . " dr 0");
my $d_ip = gethostbyname($master);
my $portaddr = sockaddr_in($master_port, $d_ip);
print "sending getIpAuthorize for $master_ip:$master_port\n";
send($socket, $master_message, 0, $portaddr) == length($master_message) or &die("Cannot send message");
}