Не так дав­но фанатов The Sims 4 перепо­лоши­ла новость о появ­лении опас­ных вирусов в их любимой игре. Гро­мад­ный скан­дал при­вел к появ­лению нес­коль­ких спе­циали­зиро­ван­ных анти­виру­сов и ужес­точению пра­вил модера­ции для всех новых модифи­каций. Сегод­ня мы узна­ем, работа­ют ли эти меры безопас­ности на самом деле.
 

Формат модификаций

Ска­чав нес­коль­ко модов, я обна­ружил два фор­мата дан­ных: фай­лы с рас­ширени­ем ts4script и package. Пер­вым делом я поп­робовал открыть их через 7-Zip, и ts4script ока­зал­ся обыч­ным ZIP-архи­вом, содер­жащим ском­пилиро­ван­ные фай­лы Python с рас­ширени­ем .pyc. Файл package тоже ока­зал­ся архи­вом, но проп­риетар­ным. Открыв его в Hex-редак­торе, видим пер­вые четыре бай­та DBPF — оче­вид­ная сиг­натура. Я загуг­лил «dbpf file format» и нашел под­робное опи­сание его внут­ренне­го устрой­ства.

Есть нес­коль­ко инс­тру­мен­тов для рас­паков­ки package, но про­ще все­го ока­залось работать с ним в Sims 4 Studio. Откры­ваем пакет как новый про­ект и видим спи­сок лежащих в архи­ве ресур­сов. Он вклю­чает в себя тек­сту­ры, меши, ани­мации, фай­лы локали­заций и про­чие ассе­ты. В основном содер­жит нас­трой­ки в фор­мате XML. Исполня­емо­го кода здесь нет.

Пакет с крутой тачкой для твоих кукол
Па­кет с кру­той тач­кой для тво­их кукол

Код сос­редото­чен в фай­лах ts4script. Мал­варь рас­простра­няет­ся через них, поэто­му под­дер­жку скрип­тов на свой страх и риск надо вклю­чать в нас­трой­ках игры. Одна­ко у боль­шинс­тва игро­ков скрип­ты вклю­чены по умол­чанию, так как ими поль­зуют­ся все слож­ные модифи­кации. При этом я не счи­таю отклю­чение скрип­тов стоп­роцен­тной защитой от вирусов. Пар­серы лежащих в package фай­лов тоже могут содер­жать ошиб­ки, как я это показы­вал в недав­ней статье про GTA Vice City, а зна­чит, могут при­вес­ти к исполне­нию про­изволь­ного кода.

 

Создание скриптовых модов

Что­бы понять огра­ниче­ния вир­туаль­ной машины, надо соз­дать собс­твен­ный ts4script. Бла­го для это­го есть фа­нат­ский SDK, пре­дос­тавля­ющий все инс­тру­мен­ты для сбор­ки. Сна­чала пос­тавим Python 3.7. Имен­но эта вер­сия исполь­зует­ся в самой игре. Далее откры­ваем пап­ку из SDK в PyCharm. Исправ­ляем путь до игры и пап­ки модифи­каций в settings.py. И запус­каем скрипт decompile_all.py, который деком­пилиру­ет исполь­зуемые игрой Python скрип­ты в пап­ку EA. Изме­няем на свое усмотре­ние файл example_mod.py и запус­каем скрипт compile.py. В пап­ке для модифи­каций появит­ся новый мод. При запус­ке игры он отоб­разит­ся в спис­ке активных модифи­каций.

Но для удоб­ной отладки есть спо­соб про­ще. Соз­даем исходный скрипт в пап­ке для модифи­каций, нап­ример по пути Mods\test\Scripts\test_mod.py. При заг­рузке скрип­та игра ском­пилиру­ет его самос­тоятель­но. Это удоб­но тем, что мож­но уста­новить script_reloader и вби­вать в кон­соль игры reload test_mod. Это при­ведет к горячей перезаг­рузке скрип­та, дру­гими сло­вами, мож­но менять и пересо­бирать скрипт без перезаг­рузки самой игры. Игра заг­ружа­ется дол­го, так что это весь­ма полез­но.

import sims4.commands
@sims4.commands.Command('mfs', command_type=sims4.commands.CommandType.Live)
def myfirstscript(_connection=None):
output = sims4.commands.CheatOutput(_connection)
output("This is my first script mod !!!")
for i in range(100):
output(f"Sleep {i}")
time.sleep(1)

Для начала про­верим мак­сималь­ное вре­мя работы скрип­та. Откро­ем кон­соль игры (через сочета­ние кла­виш Ctrl-Shift-C) и вызовем соз­данную нами коман­ду mfs — мы уви­дим, что скрипт живет по край­ней мере 100 секунд. Покопав­шись в исходни­ках из пап­ки EA, я сооб­разил, как соз­дать MessageBox:

import sims4.commands
from ui.ui_dialog import UiDialogOk
from sims4.localization import LocalizationHelperTuning
def dlg_text(text):
return lambda **_: LocalizationHelperTuning.get_raw_text(text)
def message_box(title_str=None, text_str=None):
dial = UiDialogOk.TunableFactory().default(None, title=dlg_text(title_str), text=dlg_text(text_str))
dial.show_dialog()
@sims4.commands.Command('dlg', command_type=sims4.commands.CommandType.Live)
def dlg(_connection=None):
try:
message_box("Пора спать!")
except BaseException as e:
for v in e.args:
output(v)

Так как это жур­нал «Хакер», а не «Стра­на игр», мы не будем углублять­ся в соз­дание модифи­каций. Глав­ное, что нас инте­ресу­ет, — про­вер­ка огра­ниче­ний вир­туаль­ной машины Python. И, судя по моим тес­там, их нет вооб­ще. Скрипт может выпол­нять прак­тичес­ки любой код!

 

История атаки

В теме The Sims 4 на «Рут­рекере» висит сооб­щение:

ВНИ­МАНИЕ! Вре­донос­ное ПО в некото­рых модах для The Sims 4!⠀

На популяр­ных сай­тах заг­рузок ста­ли появ­лять­ся некото­рые моды, содер­жащие хакер­ские прог­раммы в фай­ле сце­нария (.ts4script). Если вы запус­каете игру, уста­новив такой мод, файл .exe запус­кает­ся без вашего ведома. Как толь­ко это про­изой­дет, будет укра­ден боль­шой объ­ем дан­ных из вашего интернет‑бра­узе­ра (Chrome, Edge, Opera, Firefox и дру­гих), при­ложе­ний Discord, Steam, Telegram и некото­рых крип­токошель­ков.

Об­наружи­лись такие моды на извес­тных сай­тах: MTS, TSR, Curseforge, Loverslab. Они были заг­ружены либо через учет­ные записи, очень похожие на извес­тных мод­деров, либо через взло­ман­ные учет­ные записи.

Я решил поис­кать нашумев­шие моды. Говорят, интернет пом­нит всё. Но не в нашем слу­чае. Хеши были извес­тны, и нес­коль­ко анти­виру­сов сде­лали свою работу — моды вычище­ны вез­де, где толь­ко мож­но. Я пос­пра­шивал нес­коль­ких учас­тни­ков событий, но у них тоже не ока­залось сем­плов. Поэто­му перес­кажу, что делал код, с чужих слов. В любом слу­чае метод нападе­ния уже понятен — вре­донос­ный скрипт на Python внут­ри фай­ла ts4script.

Ком­мента­рий с «Ред­дита» утвер­жда­ет, что заражен­ный мод соз­дает про­цесс Updater.exe, который обща­ется с управля­ющим сер­вером, рас­положен­ным на взло­ман­ном WordPress. Мал­варь, веро­ятно, называ­ется Akira и пред­став­ляет собой сти­лер, написан­ный на Python. Под­робный раз­бор сем­пла мож­но почитать на cyfirma.com.

 

SimsVirusCleaner

Пер­вой реак­цией сооб­щес­тва на новость об ата­ке было сроч­ное соз­дание спе­циали­зиро­ван­ных анти­виру­сов, уби­рающих вре­донос­ные фай­лы из сис­темы. Одним из таких инс­тру­мен­тов с откры­тым исходным кодом был SimsVirusCleaner. Он занима­ется детек­тирова­нием кон­крет­ного сем­пла, поэто­му про­веря­ет его хеши SHA-256:

std::string updater_hash_ = "8c8558dc150de295f4b1d557243b5d978f09cfcec94145cd1ddb5315b3a0d92a";
std::string main_hash_ = "c98f0f5b89c6dac1482286faa2e33a84230c26ea38da4e013665582c9a04213b";

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии