· 5 months ago · Apr 21, 2025, 07:45 PM
1package Network::Send::ROla;
2use strict;
3use base qw(Network::Send::ServerType0);
4# use Globals qw($net);
5use Globals;
6
7use Log qw(debug);
8
9sub new {
10 my ($class) = @_;
11 my $self = $class->SUPER::new(@_);
12
13 my %packets = (
14 '0C26' => ['master_login', 'a4 Z50 x a32 a5', [qw(game_code username password_rijndael flag)]],
15 '0825' => ['token_login', 'v V C Z51 a17 a15 a*', [qw(len master_version version username mac_hyphen_separated ip login_token)]],
16 );
17
18 $self->{packet_list}{$_} = $packets{$_} for keys %packets;
19
20 my %handlers = qw(
21 master_login 0C26
22 token_login 0825
23 );
24
25 $self->{packet_lut}{$_} = $handlers{$_} for keys %handlers;
26
27 return $self;
28}
29
30sub reconstruct_master_login {
31 my ($self, $args) = @_;
32
33 my $master = $masterServers{$config{master}};
34 $net->serverDisconnect();
35 $net->serverConnect($master->{OTP_ip}, $master->{OTP_port});
36
37 if (exists $args->{password}) {
38 for (Digest::MD5->new) {
39 $_->add($args->{password});
40 $args->{password_md5} = $_->clone->digest;
41 $args->{password_md5_hex} = $_->hexdigest;
42 }
43
44 my $key = pack('C32', (0x06, 0xA9, 0x21, 0x40, 0x36, 0xB8, 0xA1, 0x5B, 0x51, 0x2E, 0x03, 0xD5, 0x34, 0x12, 0x00, 0x06, 0x06, 0xA9, 0x21, 0x40, 0x36, 0xB8, 0xA1, 0x5B, 0x51, 0x2E, 0x03, 0xD5, 0x34, 0x12, 0x00, 0x06));
45 my $chain = pack('C32', (0x3D, 0xAF, 0xBA, 0x42, 0x9D, 0x9E, 0xB4, 0x30, 0xB4, 0x22, 0xDA, 0x80, 0x2C, 0x9F, 0xAC, 0x41, 0x3D, 0xAF, 0xBA, 0x42, 0x9D, 0x9E, 0xB4, 0x30, 0xB4, 0x22, 0xDA, 0x80, 0x2C, 0x9F, 0xAC, 0x41));
46 my $in = pack('a32', $args->{password});
47 my $rijndael = Utils::Rijndael->new;
48 $rijndael->MakeKey($key, $chain, 32, 32);
49 $args->{password_rijndael} = $rijndael->Encrypt($in, undef, 32, 0);
50 }
51}
52
53sub sendTokenToServer {
54 my ($self, $username, $password, $master_version, $version, $token, $length, $otp_ip, $otp_port) = @_;
55 my $len = $length + 92;
56
57 my $master = $masterServers{$config{master}};
58 $net->serverDisconnect();
59 $net->serverConnect($master->{ip}, $master->{port});
60
61 my $ip = '192.168.0.2';
62 my $mac = $config{macAddress} || '111111111111'; # gibberish
63 my $mac_hyphen_separated = join '-', $mac =~ /(..)/g;
64
65 my $msg = $self->reconstruct({
66 switch => 'token_login',
67 len => $len,
68 version => $version || $self->version,
69 master_version => $master_version,
70 username => $username,
71 mac_hyphen_separated => $mac_hyphen_separated,
72 ip => pad_ip($ip),
73 login_token => $token,
74 });
75
76 $self->sendToServer($msg);
77
78 debug "Sent sendTokenLogin\n", "sendPacket", 2;
79}
80
81sub pad_ip {
82 my $ip = shift;
83 my $len = length($ip);
84 return $ip . ("\x00" x (14 - $len)) . "\x17" if $len < 15;
85 return $ip;
86}
87
881;