Немного определений
CEG (Custom Executable Generation, рус. Генерация Уникального Исполняемого Файла) — средство защиты от пиратства (как бы парадоксально это не звучало), разработанная великой и ужасной компанией Valve в 2009 году. Изначально планировалось, что новое средство защиты будет использоваться чуть ли не на каждой игре, выпущенной в Steam. Однако, пересмотрев свои приоритеты, компания Valve поняла, что если потенциальный разработчик захочет использовать такое 'счастье' в новоиспеченной игре, то желательно было бы платить и отнюдь не дешевую цену. Поэтому, исторически сложилось, что CEG используется лишь крупными компаниями, которые в состоянии себе это позволить.
Сама суть этой защиты заключается в следующем: как только подходит к концу закачка игры из сервиса цифровой дистрибуции Steam, на персональный компьютер клиента загружается «голый», еще не подписанный исполняемый файл. Затем, на тот же клиентский компьютер, загружается цифровой сертификат и с помощью специальной библиотеки SteamServices.dll (загрузка которой, к слову, производится в TEMP) и специального ключа с AES шифрованием (данный ключ с идентификатором cegpublickey является уникальным на стороне серверов Valve, он создается при публикации игры в самом сервисе при помощи Steam CEG SDK, доступ к которому, к слову, имеет ограниченное количество лиц) подписывается выше упомянутый исполняемый файл.
Собственно, быстрый смотр защиты
«А какова же тогда практическая ценность такой 'защиты', если она только и делает, что просто подписывает исполняемый файл ?» — спросите Вы. И тут я отвечу — не все так просто как кажется на первый взгляд. Дело в том, что при нанесении цифровой подписи на файл, собирается информация о папках и файлах, которые присутствуют на клиентской системе, а так же некотором железе. В последствии, собранная информация, так же находит свое место в исполняемом файле. И эта информация будет действительно уникальной, так как учитываются следующие составляющие: временной штамп файлов и папок в стиле unix (дата создания, дата последнего изменения), уникальные ключи реестра (а так же проверка, установлен ли клиент Steam на ПК, посредством того же православного реестра), количество файлов в заданной директории, ID процессора, серийный номер жесткого диска. Следует отметить, что последние два — используются лишь в новейших версиях CEG (например, такие игры как: XCOM: Enemy Within, Grid Autosport, DiRT Rally).
Подводные камни
Итак, что же мы имеем — эдакую привязку 'уникального' исполняемого файла к железу и файлам клиентского ПК. Хорошо это или плохо? В общем и целом — хорошая идея и реализация. Минус в этом всем, если, допустим, Вы поехали на дачу к друзьям и прихватили с собой полный бэкап любимой игры с этим самым CEG, сбросив его на переносной носитель и надеясь, что сможете спокойно поиграть. Но тут случилось непредвиденное — у друга не работает Интернет! Зато на ноутбуке установлен Steam. Не беда, Вы делаете восстановление бэкапа вышей игры в оффлайновом режиме Steam, нажимаете кнопку «Играть», но ничего не происходит! А все потому, что железо и прочие составляющие, о которых писалось выше, не совпадают с железом Вашего друга. И без доступа в глобальную сеть, у Вас просто никак не получится запустить игру, так как по понятным причинам сгенерировать новый исполняемый файл невозможно. Или запустить исполняемый файл все таки возможно?
В следующей части статьи пойдет речь о том, возможно ли полностью отучить от CEG исполняемый файл, имея под рукой отладчик.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Комментарии (35)
vit9696
09.01.2016 21:35+3на персональный компьютер клиента загружается «голый», еще не подписанный исполняемый файл.
У меня одного после прочтения этой строчки сложилось мнение о CEG как о каком-то убожестве, наносящем вред исключительно легальным пользователям?6opoDuJIo
10.01.2016 00:26+1Не одного. После прочтения строчек «сначала скачивается неподписанный бинарник» я сразу заподозрил лажу.
cs0ip
09.01.2016 21:38+1На счет защиты в стиме, давно интересует вопрос, почему встраивают фактически неработающую защиту вместо такой схемы:
1) В исполняемый файл на стороне сервера перед загрузкой встраиваем id клиента. Причем для каждой игры можно встраивать уникальный id и в уникальное место, чтобы было труднее вычислить, где его искать. Это не очень дорогая операция и сервера её потянут.
2) Через некоторое время взломанную игру выкладывают в виде торрентов.
3) Правообладатель качает игру и выясняет кто же её слил.
4) Аккаунт слившего со всеми играми блокируется.
На мой взгляд, со временем это сделает невозможным выкладку игр в самых популярных для этого местах, а в непопулярных по определению будет совсем немного народа. Плюс ко всему, если сравнивать с тем же гугл-плей, где можно купить левый аккаунт, чтобы на нем потом отработать потраченное, здесь с заработком сложнее и мотивации соответственно меньше.
В общем, не то чтобы мне хотелось, чтобы такая схема начала работать, но мне очень интересно почему она уже не работает. Наверное о ней уже подумали и почему-то отказались?AllexIn
09.01.2016 21:42+2— diff покажет куда смотреть.
— будут воровать у обычных игроков exeшники и выкладывать их. страдать буду игроки.
— совершенно не защищает от подхода: зарегал аккаунт, купил на него игру, выложил, аккаунт забанили, повторил с первого пункта
Это все работает на сложных программных комплексах, которые стоят больших денег и продаются по контракту. С играми не прокатит.vit9696
09.01.2016 21:53-2— хорошо он показывает для IDA и ей подобных продуктов =)
— это решаемо;
— достаточно сделать фейс-контроль при регистрации аккаунта с привязкой к персональным данным.AllexIn
09.01.2016 22:02+5Ну да, и регистрацию по паспорту.
и сказать досвидания клиентам. Которые радостно сбегут в origin, uplay, и теперь еще Epic Games Laumcher.
Вы еще предложите продавать игры с хардварным ключом, чтобы уж наверняка. Это я так намекаю, что защита не будет успешной, если она делается в ущерб удобству пользователю. Стим стал крут, потому что был дружелюбен к пользователям. Даже дружелюбнее чем торренты. Пара неверных движений и стима не будет, а торренты останутся.SerDIDG
10.01.2016 08:08-3В Южной Корее и Китае как-то же играют люди во всякие подделки nexon, предоставляя свой физический id. А читеров бы как поубавилось :)
cs0ip
09.01.2016 21:56— Вообще конечно да, имея два купленных экземпляра можно найти примитивно встроенный id. Но уже это отсекает некоторое количество тех, кто не хочет всё покупать в двух экземплярах. Но как мне кажется, есть способы встраивания id такие, что дифы будут показывать всегда на часть функционального кода, без которого собственно программа работать не будет.
— Как раз от подхода с новым аккаунтом по идее может защищать, т.к. речь идет о постоянной потере денег и на эту потерю должна быть мотивация. Кроме того можно вести какой-нибудь черный список кредиток, а их уже сложнее менять.
— А вот с воровством чужих бинарников действительно сложнее. Опять же, ломать кого-то только ради игры кажется странным. Хотя всякое бывает и не хотелось бы в один момент обнаружить, что тебя заблокировали ни за что.AllexIn
09.01.2016 22:061) То что внедряется в автоматическом режиме, также в автоматическом режиме и убирается.
2) Стим кроме кредиток имеет еще несколько способов оплаты. Не говоря уж о том, что завести новую кредитку стоит 300 рублей.
Вы так рассуждаете, как будто взлом игр и выкладывание их на торренты — это альтруизм. Это бизнес. И выгода от выложенный популярной игры(тем более эксклюзива) в разы перекрывает стоимость нескольких копий игры для анализа и заказ новой кредитки.cs0ip
09.01.2016 22:14Вот если это бизнес, то мой способ точно не работает, т.к. потери ощутимы только для частного лица. Но в чем он может заключатся? Я вижу только внедрение каких-нибудь зловредов на клиентские компьютеры. Однако раздачи с популярными таблетками в таком не замечены. Поэтому мне не совсем понятно, что это может быть.
RESTORATiON
09.01.2016 22:08Дело в том, что если даже удалить исполняемый файл с одной системы, посредством проверки кэша, сгенерируется новый исполняемый файл, который будет разительно отличаться, чуть менее, чем полностью. В следующей статье я покажу на примере простенькой игры, как в принципе можно обойти эту магию.
cs0ip
09.01.2016 22:11В подразумеваемом мной способе файлы у одного клиента получаются идентичными.
RESTORATiON
09.01.2016 22:17Я Вас понял, но с CEG такое не прокатит. Подобную вещь пробовал сделать около года назад, но увы — бинарники будут разными (при чем если сгенерировать несколько раз, очевидные различия будут в совершенно иных местах), даже если они сгенерированы с одного ПК и с того же аккаунта.
cs0ip
09.01.2016 22:25С CEG понятно, что не прокатит. Я тут просто отошел от темы поста и начал рассуждать о том, как можно было бы организовать альтернативную защиту.
А про CEG, конечно же пишите ещё. Оно хоть пока и не решает свою задачу, но я до этого вообще не знал, что в valve подобная «защита» есть.RESTORATiON
09.01.2016 22:31Есть конечно, еще с 2009 года, и одной из первых «ласточек», стала как раз игра, детище самой Valve — Left 4 Dead 2. Хотя тот, древний CEG, был ну очень примитивным. Сделав пару патчей в client.dll, можно было полностью отвязать его от сей защиты.
icoz
10.01.2016 01:41+3Можно поподробнее про саму технологию? Что в какой момент чем подписывается? Каким ключом? Ключом стима или разработчика игры? Короче, про саму систему ничего не понял — опишите протокол взаимодействия.
RESTORATiON
10.01.2016 11:43Спасибо за замечание, немного дополнил в подзаголовке "Немного определений". Вообще более детально о том, как работает сама защита на примере игры, я хотел написать в следующей статье, т.к. данная статья была, по сути, лишь абстрактным введением.
Mingun
10.01.2016 11:27Что-то я не очень понял, в чем именно заключается «защита»? Если закачивается голый бинарник, что мешает его не подписывать? Для чего вообще эта подпись нужна, кем она проверяться-то будет? Судя по окончанию статьи, стим позволяет играть без подключения к инету (что означает, что даже если подпись и проверяется, то как минимум, это не обязательно делается на сервере).
RESTORATiON
10.01.2016 11:46Не подписанный файл работать не будет, так как в нем не будет жизненно важных участков кода, которые и содержатся в этой самой цифровой подписи.
Mingun
10.01.2016 16:39+2Что за бред. Подпись максимум будет данными, но никак не инструкциями (т.к. подпись фактически случайный набор байт и она не может быть преобразована в неслучайный набор инструкций). А если при добавлении подписи дописываются какие-то инструкции, то значит, бинарник не качается полностью.
Haoose
10.01.2016 14:09+1На примере Dirt Rally: в неподписанный EXE надо еще добавить 2-3 участка кода, который будет отличаться в зависимости от используемого процессора на компьютере, с которого вы хотите играть.
Haoose
10.01.2016 14:15+1А, нет, ошибся. Не подписанный отличается от обычного на несколько килобайт. То есть мало того что в нем не хватает некоторого кода, так еще и некоторые его уастки зависят от процессора и EXE просто не будет работать на другом компьютере.
dordzhiev
10.01.2016 12:44Вы поехали на дачу к друзьям и прихватили с собой полный бэкап любимой игры с этим самым CEG, сбросив его на переносной носитель и надеясь, что сможете спокойно поиграть. Но тут случилось непредвиденное — у друга не работает Интернет! Зато на ноутбуке установлен Steam. Не беда, Вы делаете восстановление бэкапа вышей игры в оффлайновом режиме Steam, нажимаете кнопку «Играть», но ничего не происходит! А все потому, что железо и прочие составляющие, о которых писалось выше, не совпадают с железом Вашего друга. И без доступа в глобальную сеть, у Вас просто никак не получится запустить игру, так как по понятным причинам сгенерировать новый исполняемый файл невозможно.
Как это связано с CEG? Информация о железе хранилась (до недавнего времени) в ClientRegistry.blob, при запуске стима в оффлайне она проверяется на соответствие текущей. Запустить игру в оффлайне на другом компьютере и так не получится.RESTORATiON
10.01.2016 13:36Вникните в статью, ведь я написал, что информация о железе в данном случае будет храниться в исполняемом файле и только. ClientRegistry.blob к этому не имеет никакого отношения.
dordzhiev
10.01.2016 22:25Да, я в курсе, и поэтому и спрашиваю вас. Ладно, видимо придется переформулировать это в более простой форме.
У стима и стимовских игр была привязка к железу еще задолго до появления CEG. Что представляет собой CEG: замена оригинальному способу привязки или дополнение к уже существующему, усложняющее реверсинг бинарника? Как вообще цифровая подпись может защитить бинарник от реверсинга?
Более того быстрый гуглеж показал, что CEG делает привязку к аккаунту, а не к железу. К тому же, в других источниках утверждается, что CEG при запуске игры каждый раз докачивает части бинарника из интернета. Кому верить? Что у вас, что в других источниках, никакой информации о CEG нет, а та что есть — очень противоречива.RESTORATiON
10.01.2016 22:34Я видел своими глазами, что из себя представляет из себя Steam CEG SDK, по сему, я имею представление о том, как это работает. Вообще, я решил сделать эту статью для базового понимания, что же такое CEG, так как в интернете, вы вряд ли найдете много информации по этой теме. Естественно, если описывать процесс еще более детальным образом, на это уйдет намного больше времени и статей. И насчет привязки к аккаунту, это чушь, привязка идет к железу, папкам и файлам.
AllexIn
У меня ощущение, что «это» должно взламываться влет.
Достаточно подкинуть стиму некоторую шаблонную информацию о системе вместо реальной и просто пиратскую копию поставлять вместе с шаблоном. То есть эмулировать окружение. И я не вижу ни одного способа противостоять этому со стороны стима.
RESTORATiON
Steam и правда пытается, изо всех сил. Valve выпускают все новые версии CEG, улучшают/оптимизируют защиту, но все тщетно, все равно происходит взлом игр за считанные часы, а иногда за минуты.
AllexIn
Кстати, я думаю, что CEG не стал общедоступным не потому, что Valve хочет на нем заработать, а потому что боится неконтролируемо раздавать SDK, т.к. полагают что это упростит взлом защищенных игр.
NeoTheFox
Это скоро может измениться, Just Cause 3 как первый звоночек.
navion
Это ерунда:
lurkmore.to/SecuROM/DENUVO