Robolander, 25 days later. Защита, борьба с китайцами.

Я использовал несколько уровней защиты. Для защиты кода я использовал самописный обфускатор. Для контроля за блокированием ссылок – обработку исключений и скрипт на пхп. Основная флешка была закриптована и внедрена embed-ом в загрузчик. Загрузчик дополнительно был написан на простенькой рукописной виртуальной машине. В результате на написание загрузчика потратилось достаточно прилично времени – около двух дней.

Если кратко, то наиболее эффективной защитой оказалась обфускация. Защита от блокировки ссылок больше доставляла, чем была полезной.

Внедрение и криптование бесполезны потому, что хакаются автоматом, хоть как криптуй и путай код алгоритма. Я много слышал про тулзу, которая вырезает флешки из памяти. Найти ее, к сожалению, не удалось, но следы ее действия были зафиксированы. Контроль за блоком ссылок показал на известный сайт 7k7k. При этом показов рекламы с него не было. Плейтомик также показал, что с 7k7k идут просмотры. Файл с 7k7k я решил скачать и исследовать. Оказалось, что это почти оригинальная исходная флешка, декриптованная и вырезанная из загрузчика, который и показывал рекламные блоки. Почему почти. А потому, что размеры и бинарный код от моего исходника отличались. Очевидно, что код виртуальной машины не распутывался, чтобы определить алгоритм дешифрации и внедренный ресурс не вытягивался из загрузчика и не дешифровался. Второй явный факт, указывающий на то, что использовалась автоматическая или полуавтоматическая утилита, это то, что если они такие крутые хакеры, достаточно быстро разломавшие и ВМ и обфускацию загрузчика, то почему они не ломанули почти явный, только немного обфусцированный код основной флешки, который не дает ей работать из-за блокирования ссылок. Тем более, теоретически, выкусить кусок памяти можно отладчиком, при отладке процесса флешплейера. Так что криптование и внедрение основной флешки в загрузчик бесполезно.

Какие могут быть рабочие варианты с внедрением: разбивка на несколько частей, когда загрузчик загружает не одну основную флешку, а несколько с разными кусками кода и ресурсами. Загрузка их локально из внедренных ресурсов или с удаленного хоста особого значения не имеет. Однако, это чревато усложненной отладкой – надо будет собирать минимум два проекта: измененную часть и загрузчик.

Как я сделал защиту от блокировки ссылок. Я ловлю исключение при ошибке попытки перехода по ссылке. В обработчике флешка сообщает серверу, что ее лочат и домен, где это произошло. Сервер заносит этот домен в чОрный пречОрный список, который запрашивается флешкой при старте. Чтоб не грузить сервак, я оптимизирую работу с помощью записей шаредобжект. Т.е. первый раз, когда флешка запускается, она запрашивает сервер. Если домен в черном списке, то в шаред делается соответствующая запись. Потом просто проверяется эта запись. Также в шаред ставится флаг при возникновении исключения на неудачной попытке перехода по ссылке. Защиту можно обойти, просто поправив шаред и не кликая больше по ссылкам. Но абсолютных защит нет, поэтому я выбрал такой вариант снижения нагрузки на сервер. Так-же есть встроенный список плохих доменом, известный по предыдущим инцидентам. Эта защита вполне пригодна к использованию, но у нее есть пара недостатков. Один в том плане, что помимо китайцев так мало кто извращается с блокированием ссылок, а китайский траф достаточно бесполезен для гугловой рекламы. Если отбивается на какой-то другой, подскажите. Второй недостаток в том, что иногда исключения фейлят и срабатывают на вполне нормальных сайтах. Это повлекло потери в дистрибуции и пришлось переделывать скриптик. Теперь домены заносятся сначала в предварительный список, а потом, после ручной проверки я уже ручками заношу или не заношу домены в проверенный список плохишей. Почему и на чем бывают ложные срабатывания, установить не удалось.

Ну и пара слов о самописной утилите попускации. Написано на Делфи, есть поддержка проектов, где можно задать исходную флешку и список имен, которые надо переименовывать и как. Работает с АС3 и с файлами скомпилированными флексом. На файлах от ИДЕ не проверял, но там, скорее всего, не будет поддерживаться код в кадрах. Потому что я не делал его поддержки :)

Немного забавных фактов около темы: После того как 7k7k пообломался с пирачиванием игры, мне ломанули сайтик на вордпрессе. Точно установить, кто это сделал мне не удалось, но последовательность событий вызывает подозрения. Взломан он был коварно. Дефейснут. На страницы были внедрены «плохие» слова и ссылки, которые не понравились гуглу и он выкинул меня из поиска. А это у меня 15% трафика. Однако все завершилось удачно. Были поставлены последние обновления, сменены явки и пароли, написано оправдательное письмо гуглю, который где-то через неделю вернул меня в поисковой индекс.
Еще начитавшись про успехи на китайском флеш-рынке через юювин, я загорелся желанием перевести и отдать игру им. Но они отказывают мне в авторизации запроса на аккаунт. Это становится забавным, если у 7k7k и юювин один хозяин, как поговаривают. Хотя может юювин просто не любит мочи, рекламу которого я использовал.

Кроме того, не только китайцы оказались злобными локерами ссылок. Я даже не про мофана. Отличились наши польские хм, не знаю как их называть … — китайцы с сайта giercownia.pl. Что вполне возможно – ведь не запрещено же китайцам регать польские домены. Так что все могет быть. Однако, если это не польские китайцы, то братский народ порочит свою шляхэтну репутацию.

Невероятно, но не все китайцы верны делу партии и допускают внешние ссылки. Собственно благодаря им я и делаю выводы об эффективности китайского трафика. Палить я их не буду – у партии длинные руки.

Ну и торжественно оглашаю список победителей:
4199.cn
4399.com
5068.com
7k7k.com
9191.cc
97.net
i6.com
5068.com
cheekugames.com
giercownia.pl
3839.com
4377.cn
mofunzone.com
playcow.com
6949.com
sillybull.com
y3.com

Про игру и ее создание
Заливка на НГ и конг. Есть ли антирейтинг группы?

Playtomic.
Дистрибуция.
Доходы.
Просто разные странности. Заключение.

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

0
На самом деле ломают то 7k7k, а потом уж все остальные китайские порталы разбирают хакнутую игру оттуда.
0
Тоже придерживаюсь мнения, что шифрование и манипуляции с алгоритмами шифрования во флэше это ни какая ни палка в колеса китайским хацкерам (может они и есть злополучная антирейтинг группа ;)
Была идея по «Разбивке на несколько частей» это неплохо применимо с шифрованием битмап, потому что их можно выгружать по ненадобности, т.е. в памяти никогда не будет находится всех битмап в расшифрованном виде. Можно усложнить и сделать чтобы «расшифровщик» и ключ для последующего блока хранились в предыдущем, а ключ завязывался на контрольную сумму текущего блока и после расшифровки выгружался — но тут есть минус — это скорость, т.к. чтобы получить сразу 20 блок, нужно расшифровать предыдущие, но тут есть выход избирательное шифрование…
В общем есть куда копать, но нет времени, мне кажется, если бы ты не заморачиваля с защитой, то время разработки сократилось бы на треть ;)
0
Не так много и ушло на защиту. Неделю на обфускатор и неделю я его дописывал в ходе работы.
Вот ВМ усложнило работу, т.к. пришлось писать считай на АСМе. Первый загрузчик я два дня писал. Дальше быстрее, но психологически напрягает, когда там например поменять пару строчек и все, а надо лазить и править циферки вместо понятных addEvent(...), прятать эти строки. Компилить опять-же два раза.
Кстати насчет защиты метр порталов Сергей Елисеев сказал, что смысла нет и подтвердил устно то-же самое, что я экспериментально проделал: с китайского трафика профита нет, лочат они ссылки — даже лучше — не гонял левый трафик на сайт.
0
Спасибо, много полезного!

«Защиту можно обойти, просто поправив шаред и не кликая больше по ссылкам. Но абсолютных защит нет, поэтому я выбрал такой вариант снижения нагрузки на сервер.»

Имхо, достаточно разумный баланс — не будут же они рассказывать каждому пользователю — поправьте шаред для запуска, да и отследить что дело в шареде надо.

«Загрузчик дополнительно был написан на простенькой рукописной виртуальной машине.»

Можно подробнее про загрузчик?
  • abyss
  • abyss
+1
Я так понял, интересует не сам загрузчик, а ВМ.
Все просто:
1) пишем свои функции-обертки библиотечным и простым действиям. Например: add(a:number, b:number):Number{ return a+b }
2) заносим эти функции в Object или массив. Из Object их можно вызывать и по мнемоникам (ADD_NUM), а не только по цифрам. Потом вызываем. BM[42](BM[0],BM[1]).
3) можно реализовать свой стек и регистры, также никто не запрещает хранить данные в том-же объекте-ВМ — это имо будет сильнее путать.
4) для запутывания используем косьвенные вызовы и динамическое изменение значений-опкодов ВМ. Например сначала заносим в ячейку 42 функцию сложения, потом функцию вычитания. Таким образом, не распутав весь код невозможно понять, что делает вызов опкода 42 в конкретной точке программы.
Еще сделать обфускацию, которая попортит изначально понятные имена функций-оберток и анализ кода еще усложнится.
Кратко — так.
0
Спасибо!

На досуге поколдую ;)
0
Попробовал, если доставать из памяти, то прелоадер, к сожалению, не имеет значения, хотя часть народа это отсеет.
То, что флешка обфусцирована внутри намного полезнее.

Как вариант, флешку надо предварительно шифровать, и распаковывать прелоадером, при условии того, что она запущена не локально.
0
Да. Я же про это и написал, что это оказалось лишним гимором! :)
Внедрение и криптование бесполезны потому, что хакаются автоматом, хоть как криптуй и путай код алгоритма.
А достаешь тулзой или дебагером?
0
Я ж не профессиональный хрякер игрушек ;) обычным дебагером, который может с памятью работать.

Немного поторопился, проверка запущена ли локально флешка ничего тоже не даст, можно из браузера вытащить будет.

Наверное, вариант только распаковывать частями, а когда не надо выгружать распакованное.
+1
ну вот: непрофессиональный хрякер, обычным дебаггером… :)
какая тут эффективность защиты? :)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.