Advertisement
ovokore

Network::Send::ROla

Apr 21st, 2025 (edited)
441
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 2.65 KB | None | 0 0
  1. package Network::Send::ROla;
  2. use strict;
  3. use base qw(Network::Send::ServerType0);
  4. # use Globals qw($net);
  5. use Globals;
  6.  
  7. use Log qw(debug);
  8.  
  9. sub 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.  
  30. sub 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.  
  53. sub 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.  
  81. sub 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.  
  88. 1;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement