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