Очень давно поставил себе игру "World Of Tanks", и благополучно о ней забыл.
Недавно меня попросили сыграть за компанию и я вспомнил, что у меня был аккаунт, но пароль от него я не помнил, но он был сохранен в файле настроек игры. Пароль естественно зашифрован и я начал искать пути его расшифровки.
Нашел в сети ресурс с примером реализации дешифратора на Perl-е, но PHP наше все и я решил исправить это недоразумение и переписать скрипт на PHP.
Вот что получилось из этого:
<?php
/**
* @author Ray Icemont
* @copyright 2012
* @site http://mobi.geowap.mobi
* @icq 225-88-35
*/
/**
* Наш класс для расшифровки
*/
class wot_pass
{
protected $key;
protected $pass;
private $pass_len;
public $result;
public function __construct($pass = '')
{
$this->pass = $pass;
$this->pass = base64_decode($this->pass);
$this->pass = substr($this->pass, 11, strlen($this->pass) - 1);
$this->key = array();
$this->pass_len = strlen($this->pass);
$max_index = ceil($this->pass_len / 8);
for ($a = 0; $a < $max_index; $a++)
{
$this->key = array_merge($this->key, array(65, 108, 52, 102, 103, 69, 120, 107));
}
}
public function decode()
{
for ($x = 0; $x < $this->pass_len; $x++)
{
$char_pass = substr($this->pass, $x, 1);
$this->result .= chr(ord($char_pass) ^ $this->key[$x]);
}
echo $this->result;
}
}
/**
* Пример использования
*/
# Создаем новый объект и задаем base64 строку c паролем
$mypass = new wot_pass('I29iZnVzY2F0ZTpwXQVXVnRJWnBdBVdWdEk=');
# Расшифровываем и выводим пароль
$mypass->decode();
?>
Сам файл с настройками "preferences.xml" лежит в папке "Application Data" текущего пользователя. Например, если имя пользователя Vasya, то файл будет лежать по следующему пути для Windows XP:
C:\Documents and Settings\Vasya\Application Data\wargaming.net\WorldOfTanks\
А сам пароль в файле в разделе <loginInfo>, например:
<password> I29iZnVzY2F0ZTpwXQVXVnRJWnBdBVdWdEk= </password>