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: Буду рад выслушать разумную критику по стилю изложения и содержанию — первая статья, никакого опыта в их написании.
    Публиковать ли статьи данного цикла?

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

    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 44
    • +2
      Может, такое лучше выкладывать на wiki?
      • +5
        Можно и туда, но сперва необходимо структурировать информацию. А её очень много. Так что лучше я сперва опубликую статьи здесь и «дошлифую» их изложение.
        • +1
          Публикуйте весь ворох на страницу «неструктурированное», а затем оттуда уже растаскивать по целевым страницам и делать красивое.
          • +4
            Так, любопытства ради: у вас на рабочем столе или в корне диска есть папка «Разобрать»?
            • НЛО прилетело и опубликовало эту надпись здесь
              • +2
                Есть. Она пуста.
                • +3
                  В KDE нельзя класть файлы на рабочий стол) только плазмиды.
          • НЛО прилетело и опубликовало эту надпись здесь
            • +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 в процессе написания — материала там очень много. И его ещё нужно частично печатать «из кода» и оформить человеческим языком :)
                                  Думаю, к вечеру статья будет, а завтра напишу про оставшиеся форматы…
                                • +1
                                  Был бы безмерно благодарен за описание протокола общения клиент — сервер. Хотя бы первый этап — приветствие клиента.
                                  • +2
                                    Это будет описано после описания форматов файлов — на них многое завязано.
                                    И да — описываться будет старый протокол, вроде бы как уже и не используемый в данное время.
                                    • +1
                                      Отличные новости, спасибо!
                                      На сколько мне известно, по крайней мере HLDS на серверах обновляется очень редко и неохотно, так как непременно начинаются проблемы совместимости с софтом и железом.

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