Инженер-программист
0,1
рейтинг
23 мая 2014 в 23:03

Разработка → Steam Protocol 2 и Steam Files — Введение

Steam Logo
Source Pirate Kit и все-все-все...

В далёком 2007-ом году автор одной замечательнейшей программы Source Pirate Kit (SPK) полностью утерял исходники своего проекта вместе с остальными документами — у него банально умер винчестер, где это всё хранилось. Назначение программы некоторым будет понятно из названия (кто-то даже сталкивался с ней) — создание Standalone-версий игр на движках Half-Life и Half-Life 2 (говоря проще — пираток). Всё в программе было хорошо, но с утерей исходников ушла в небытие и возможность хоть как-то подправлять алгоритм её работы — вся программа была монолитным EXE-файлом и все необходимые вспомогательные программы были подключены ресурсами и распаковывались при необходимости. Но — основной функционал был скрыт в самой программе…

Начало разработок

Увидев сию нерадостную новость я, любительски изучающий программирование всего-то 2 года, решил хотя бы попытаться выправить сложившуюся ситуацию. В тот период я работал не для публики — проект делал «для себя», нигде его не публикуя. Работая над ним я постепенно более глубоко изучал программирование — писал я в то время в среде Borland Delphi 7 (не кричите, что С++ идеал для подобных задач — на нём мне и сейчас тяжело «набросать» нормальный пользовательский интерфейс, даже с использованием QtCreator). Были разочарования, косяки и прочее, но проект постепенно рос, со временем приближаясь к тому состоянию, когда его можно было публиковать в сети…

Первая публикация и первоначальное развитие

И вот настал момент истины — во второй половине 2007-ого года я опубликовал первую версию программы на ресурсе, где в нашем регионе было самое активное Anti-Steam-движение — csmania.ru (в этом году ресурс перестал работать, видимо админы совсем его забросили). Я сразу же столкнулся с множеством косяков и багов — сам я в то время не особо беспокоился тестированием программ (не забываем, что я вообще учился программированию в тот период). Это придало мне дополнительный стимул в работе над проектом — ведь, если кто-то нашел баги, значит оно этому кому-то всё-таки надо! С тех пор работа над проектом шла полным ходом, постепенно охватывая новые области — сперва я изучил WinAPI, потом Assembler (x86), сетевое программирование, криптографию и много чего ещё, идущего в придачу к данным областям и не только… За всё время изначальный проект развился от простейшей программы без с кучей косяков до серьёзной программы с поддержкой простейших скриптов, мощной архитектурой и полной независимости от сторонних инструментов — весь функционал был реализован исключительно моим кодом. Так же было изменено название — вместо Source Pirate Kit было использовано Universal Pirate Kit, поскольку программа была весьма гибкой и могла работать с любыми играми — надо было только верно написать пару файлов для программы.

Дальнейшее развитие

Поскольку все игры основанные на Half-Life и Half-Life 2, распространялись через Steam, то на определённом этапе было решено посмотреть — а как же он работает?
Ещё на этапе разработки Universal Pirate Kit мною были изучены и разобраны «по косточкам» форматы, используемые Steam для хранения файлов игр — GCF (Grid Cache File, Game Cache File) и NCF (Not-Cache File). Дальнейшим развитием стала попытка создания подобных файлов «с нуля». Данный проект был реализован практически в полной мере — даже Steam принимал модернизированные и созданные файлы. Правда, формат не был разобран на 100% — в нём присутствует одна хитрая контрольная сумма, которую я так и не смог побороть. Из-за неё же Steam видел, что файл модернизирован и перекачивал его…
Следующим шагом стала попытка понять — «а как Steam загружает контент игр?». В ходе работы над данным вопросом я изучил стек протоколов TCP/IP, познакомился с программами Wireshark и IDA Pro… Ещё в начале работы я наткнулся на другой замечательный ресурс, коллектив которого так же работал над данной проблемой. Там я познакомился со множеством отличных людей, очень тесно общался с ними, и вместе мы смогли побороть все эти протоколы!

Новые проекты

В ходе изучения сетевых протоколов Steam'а у меня (и не только у меня) зародилась идея создать хотя бы свои сервера, аналогичные тем, с которыми связывается официальный клиент. Данная идея была очень даже тепло встречена в русском сообществе и я принялся за разработку (параллельно с изучение самих протоколов).
Где-то в середине процесса с протоколами возникла ещё одна бешеная идея — «а почему бы не написать и свой клиент, раз мы пишем собственный сервер? Всё равно ведь необходимо будет потом отдельно „ломать“ игру, что бы поиграть в неё...»
Так родился ещё один проект — SteamLite. Он стал вершиной моего творчества тех времён — в нём была реализована модульная структура (были написаны следующие модули — UI, FileFormats_{GCF,NCF}, GameConvertor, Network, Viewer). Можно было загружать файлы с официальных серверов (не все файлы, многие были защищены дополнительными защитами на стороне сервера), делать и применять патчи для них, просматривать и даже редактировать (!!!) содержимое файлов не распаковывая их, автоматический «кряк» игры при её запуске и многое другое… Всё было бы хорошо, но данный проект (как и разработка серверов) «загнулся» и так и не дошел до первого нормального релиза в связи с некоторыми причинами, описанными ниже.

Глобальный облом-с, господа...

За всё время работы над данными проектами (а это 2007-2011 года), VALVE не сидели, сложа руки, и придумывали гадость для нас — новым форматом файлов и новыми сетевыми протоколами. Параллельно незначительно менялась защита самих игр — основное «проседание» работ над полноценными пиратскими версиями игр был вызван выходом Half-Life 2: Episode 2 с её достижениями.
Итогом этого всего стало то, что с официальным релизом нового формата файлов и нового сетевого протокола (Steam 3) лично я забросил всё это дело — желания разбирать это всё с 0 отпало после первых же попыток — везде там использовался Protocol Buffers, что значительно затрудняло анализ сетевых пакетов. И я рад, что другие коллективы не забросили работы над новым протоколом «в чулан» — на текущий момент всё вроде как работает, но над собственными серверами/клиентами никто не сидит…

А в чём же, собственно суть, сударь?

На данный момент у меня имеются знания о инфраструктуре серверов Steam (по крайней мере для предыдущей версии протокола), самих протоколах взаимодействия сервер-клиент, форматах используемых файлов. Некоторые из форматов используются и сейчас — например, BLOB-файлы, ContentDescription Record (CDR), VDF.
Я имею желание опубликовать данные о работе над всем этим ворохом форматов и протоколов, поскольку на данный момент эти данные имеются и в широком доступе. Я просто хочу более подробно разобрать все особенности, а так же написать толковые статьи по данной тематике для русскоязычных пользователей.
Вот примерный список статей, которые будут публиковаться:
  • Steam Protocol v2 — структура, описание и разбор кода серверов;
  • Steam Files — разбор разнообразных форматов файлов. Будет разбито на несколько частей (GCF+NCF, BLOB+CDR+CDF).

Если данные статьи нужны сообществу — они будут опубликованы.

PS: Буду рад выслушать разумную критику по стилю изложения и содержанию — первая статья, никакого опыта в их написании.
Публиковать ли статьи данного цикла?

Проголосовало 1096 человек. Воздержалось 247 человек.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Андрей @andreili
карма
45,2
рейтинг 0,1
Инженер-программист
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (44)

  • +2
    Может, такое лучше выкладывать на wiki?
    • +5
      Можно и туда, но сперва необходимо структурировать информацию. А её очень много. Так что лучше я сперва опубликую статьи здесь и «дошлифую» их изложение.
      • +1
        Публикуйте весь ворох на страницу «неструктурированное», а затем оттуда уже растаскивать по целевым страницам и делать красивое.
        • +4
          Так, любопытства ради: у вас на рабочем столе или в корне диска есть папка «Разобрать»?
          • НЛО прилетело и опубликовало эту надпись здесь
          • +2
            Есть. Она пуста.
          • +3
            В KDE нельзя класть файлы на рабочий стол) только плазмиды.
            • +4
              Прошу прощения. Т9. плазмоиды
            • +1
              можно.
    • НЛО прилетело и опубликовало эту надпись здесь
      • +1
        Какой энциклопедии?
        • +1
          Имелась в виду Википедия.
      • +2
        Особенно — для bitbucket wiki, или там для github wiki.
  • +2
    Я первый в нашей уютной городской локалке сделал hl2:dm благодаря SPK & csmania. Как сейчас помню получасовые распаковки gfc-файлов. Старшие классы, бессонные ночи, сборки nullsoft-инсталлятора, классное было время. Помоему без лимитного интернета тогда небыло еще.
    • +1
      Со мной та же история, только я создавал сборник всех эпизодов хл2 в одном удобном инсталяторе и без багов с отключающимся ai, которым грешили популярные пиратки. Свою коллекцию gcfок удалил буквально пару месяцев назад — ведь с текущими скоростями инета их выкачать не проблема, если захочется. Подозреваю что каждый второй любитель пиратской халфы 2 занимался созданием своей сборки и инстала:-) Хорошие были времена.
    • +2
      Вот с этими «получасовыми распаковками» я и боролся в первую очередь — оптимизировал всё, что только можно. В итоге библиотека, работающая с GCF/NCF, стала монструозной, но очень даже шустрой — разницы в работе с простыми файлами и находящимися в кеше практически не было.
  • +9
    Шутки-шутками, а все это надо структурировать, перевести и отправить вместе со своим резюме в Valve.
    • +2
      Они уже не запрещают реверс-инженирить их игры? =)
      • +1
        Насчет реверс-инжениринга их игр, как можно выкачать нужный depot без загрузки всей игры?
  • +4
    Однозначно, публикуй!
    Всем интересно :)
    А я, как бывший модератор раздела Steam World на форуме (раздел обсуждения не крякнутого Стима), могу даже запилить небольшую ретроспективу по жизни csmania.ru :)
  • +3
    Могу ошибаться, но разве с приходом protobuf не стало проще? С момента существования protobuf'а есть куча инструментов позволяющих восстановить схему данных. Единственная проблема с которой вы могли столкнуться — это отсутствие нормальной (до сих пор, емнип) паблик реализации protobuf'а в Delphi, а не сложность анализа. Хорошо вас помню, спасибо вам за работу и пишите дальше, даже не спрашивайте.

    PS. Если не ошибаюсь, то именно с оглядкой на ваши сырки реализовывал в свое время парсинг VDF, чтобы определять папку установки той или иной steam-игры и ряд параметров, типа автоматического обновления.
    • 0
      По поводу protobuf — основной косяк был в том, что тогда я в основном писал на Delphi, а все библиотеки для данного протокола были только на С++. И тогда я понял — либо изучать С++, либо писать очередной «велосипед» на Delphi — и я выбрал изучение С++. С тех пор я перевёл только серверы данного протокола на плюсы, а потом забросил всё это, поскольку куда больший коллектив к тому времени уже разобрал протокол.
      Да, вроде как было дело — давал кому-то исходники и консультировал :)
      • +1
        Так лучше, просто фраза «что значительно затрудняло анализ сетевых пакетов» дезинформирует читателя, а на деле оказывается проблема была в дельфовом коммунити, которое к тому моменту уже настолько развалилось, что было не в состоянии породить нормальную обертку для protobuf'а. Protobuf очень удобен как для девелоперов, так и для последующего RE, все оказались в плюсе и, как мне кажется, смирились с этим.

        А у вас сырки были закрытые, получается? Действительно, забыл, никто из русскоязычных пацанов, занимающихся в то время анализом Steam'а, не открывался на паблик целиком. От силы пара человек и небольшими порциями. На VDF формат поглядывал однозначно с паблик сырков, без консультаций / прошений. Возможно это был уже SteamRE (SteamKit) проект.
        • +2
          Нет, у меня изначально быь OpenSource-проект. Только выкладывался он на csmania.ru.
          • +1
            Супер! Просто фраза «давал кому-то исходники» смутила.
            • +2
              Просто не все исходники публиковались. Разбор VDF тогда был более чем сырым.
  • –3
    На csmania до сих пор одни фашисты сидят?
    • 0
      э?
      • +2
        При установке orange box в инсталлере была фотка не особо одетого impulse666)
        • +1
          Это же мелочь. Тем более по жизни он — человек вполне нормальный ;)
        • 0
          Ох, инсталлятор — тот еще кладезь угара импи.
        • +2
          Эээ, я не фашист! Мотороллер не мой! Я только заготовку инсталлятора сделал, а звук и фоны импи уже свои пихал :)
      • +2
        Снежинки в форме свастики :)
    • +4
      Ага, и младенцев едят.

      PS: andreili, никто ничего бросать не собирается :)
      • +1
        Ну, форум пока что признаков жизни не подаёт. А мне уже не охота со всем этим сидеть — я окончательно ушел в автоматизацию (контроллеры как на стороне железа, так и софта) и моделирование (пластиковое, а не компьютерное :) ).
        • +1
          Не ожидал увидеть вас на Хабре. =) Не хватает еще $t@t!c_V()1D
          Жалко форум временно помер. С серверами что-то? Надеюсь почините.
          А за статьи большое спасибо. Продолжай писать.
          • +2
            Его здесь я ещё не видел.
            А форум — админ говорит, что скоро будет работать. Там проблемы с ДЦ.
            • +1
              Никакие данные не потеряются? (я про форум)
              И еще, раз тебе «не охота со всем этим сидеть» — может откроешь нам исходники? Давно тебя просил — но тогда так и не получил к ним доступ, а было очень интересно. Доступа к svn у меня в не было =(
              • +2
                В конце статьи ссылка на гитхаб для кого? Я там уже выложил основное. То, что не выложено — это уже старые версии этих же прог, вспомогательные програмы и прочая мелочь.
  • +2
    Статья Steam FIles. Часть 1 — GCF/NCF в процессе написания — материала там очень много. И его ещё нужно частично печатать «из кода» и оформить человеческим языком :)
    Думаю, к вечеру статья будет, а завтра напишу про оставшиеся форматы…
    • +2
      Опубликовано.
  • +1
    Был бы безмерно благодарен за описание протокола общения клиент — сервер. Хотя бы первый этап — приветствие клиента.
    • +2
      Это будет описано после описания форматов файлов — на них многое завязано.
      И да — описываться будет старый протокол, вроде бы как уже и не используемый в данное время.
      • +1
        Отличные новости, спасибо!
        На сколько мне известно, по крайней мере HLDS на серверах обновляется очень редко и неохотно, так как непременно начинаются проблемы совместимости с софтом и железом.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.