
Сайтлок secureSWF сломали
Как я вроде знаю secureSWF самая мощная программа защиты флешки. По крайней мере везде где я читал/слышал исключительно рекомендуют ее. Это и в докладах по защите и в статьях, на хабре например.
Я ее купил соответственно, самую навороченную версию. Обфусцирует она скорее всего действительно на 5, вставляет мусор и гадости тоже. Но вот у нее есть несколько встроенных фич, например — сделать сайтлок, зашифровать строки, которые в явном виде. Так вот, если обфускация необратима полюбому, то сайтлок можно взломать. И дальше ломать остальные игры уже зная что и как.
Так вот хочу предупредить, скорее всего китайцы уже умеют ломать сайтлоки secureSWF на потоке. То-есть, старайтесь дополнительно ставить свой сайтлок, желательно хитрый (если каждый будет хитрить по своему — не будет стандартного способа у китайцев).
Почему я решил что они сломали сайтлок secureSWF. Судите сами. Моя игра уже 3 дня эксклюзива на сайте спонсора оттрубила. И вот в статистике появился 7k7k. Однако появлись только views, не plays. Cайтлок secureSWF не позволяет коду дойти даже до посылки view. А вот мой сайтлок уже не позволяет добраться до кнопки play чтобы поиграть, и соответственно успевает послать view но не может послать play.
Какие есть варианты? Либо китайцы следят за релизами, в том числе и на Баблбоксе и три дня ломали сайтлок secureSWF. Либо они только заметили игру и сразу уже отработанными методами сломали сайтлок secureSWF. И увидели что игра все равно не идет. Я не знаю продолжат ли они попытки доломать, думая что еще не доломали secureSWF или уже понимают что там еще один сайтлок.
Тем не менее, если появится сломанная версия на 7k7k, оттуда она может поехать по миру. Вот тебе и эксклюзив на неделю. Вот тебе и удар по деньгам от перфоманса.
Таким образом еще раз совет — мощные сайтлоки от клевых программ хорошо, но не очень. Второй сайтлок от себя самого — маст ду.
Я ее купил соответственно, самую навороченную версию. Обфусцирует она скорее всего действительно на 5, вставляет мусор и гадости тоже. Но вот у нее есть несколько встроенных фич, например — сделать сайтлок, зашифровать строки, которые в явном виде. Так вот, если обфускация необратима полюбому, то сайтлок можно взломать. И дальше ломать остальные игры уже зная что и как.
Так вот хочу предупредить, скорее всего китайцы уже умеют ломать сайтлоки secureSWF на потоке. То-есть, старайтесь дополнительно ставить свой сайтлок, желательно хитрый (если каждый будет хитрить по своему — не будет стандартного способа у китайцев).
Почему я решил что они сломали сайтлок secureSWF. Судите сами. Моя игра уже 3 дня эксклюзива на сайте спонсора оттрубила. И вот в статистике появился 7k7k. Однако появлись только views, не plays. Cайтлок secureSWF не позволяет коду дойти даже до посылки view. А вот мой сайтлок уже не позволяет добраться до кнопки play чтобы поиграть, и соответственно успевает послать view но не может послать play.
Какие есть варианты? Либо китайцы следят за релизами, в том числе и на Баблбоксе и три дня ломали сайтлок secureSWF. Либо они только заметили игру и сразу уже отработанными методами сломали сайтлок secureSWF. И увидели что игра все равно не идет. Я не знаю продолжат ли они попытки доломать, думая что еще не доломали secureSWF или уже понимают что там еще один сайтлок.
Тем не менее, если появится сломанная версия на 7k7k, оттуда она может поехать по миру. Вот тебе и эксклюзив на неделю. Вот тебе и удар по деньгам от перфоманса.
Таким образом еще раз совет — мощные сайтлоки от клевых программ хорошо, но не очень. Второй сайтлок от себя самого — маст ду.
- +11
- scmorr
Комментарии (81)
Так же самая наворочаная версия практически всегда не без проблем.
Я думал что если ты докажешь что их взломали, то они вернут деньги…
Поэтому лучший сайт-лок — множественные собственные проверки в различных местах кода.
Палить метод сайтлока не стоит ни мне ни другим. Ибо их сила в индивидуальности и уникальности. Если метод распространится, то станет типовой и будут щелкать как тот-же secureSWF.
А рекомендации только — сделать так, чтобы найти место где расположен сайтлок было трудно. Чтобы в байткоде трудно напрямую было найти проверку, чтобы строка «sponsor.com» не лежала в открытом незашифрованном виде. Чтобы в случае незапуска — место незапуска было неочевидно. Ибо если вы покажете табличку «хрен вам хакеры», то можно найти место где табличка показывается, и оттуда отмотать до проверки сайтлока. Лучше всего гадить так, чтобы было непонятно что произошло.
на этих сайтах играют только китаёзы и ни один некитайский сайт игру у них не взял… бабла с китайцев всё равно нету ни при каких раскладах… так что чо париться то? ;)
P.S. Попробовал на 4399.com — ссылки работают, по крайней мере на Catch the Candy и Snail Bob 2
Срезать сайтлоки — как два пальца об асфальт. Даже не декомпилируя игру. Когда я очень хочу поиграть во что-то, а там работа только через инет — это ломается за 5 минут.
А не расскажешь как ломаешь?
99.9% челов ставят защиту тупым String == 'site.ru': welcome()? fucku()
Более продвинутые пишут байткод с hex значением. К примеру 636F6C6F72736974652E727500 это colorsite.ru — мой сайт. Так вот, когда дизассемблишь код, ты имеешь возможность наглядно увидеть, как код будет виден хакерам. И самое главное теперь — попытаться запутать его еще при компиляции. Снова дизассемблить и т.д. пока не получится нужный результат.
Недавно столкнулся с защитой, когда при изменении флешки хотя бы на один байт — она уже не запускается. Как узнать её точный размер в байтах? Казалось бы — просто. Один раз собрал — глянул. Собрал еще раз — с указанием размера и вуаля ) Но не тут-то было. Флеш каждый раз дает разные размеры в среднем на 10 байт. Что существенно будет. Так вот там размер флешки сначала вшили как 999, а потом уже после сборки вшили через дизассемблер нормальный. Но легко решилось таким же образом )
Сейчас я работаю в одной службе одной софтверной компании по тестированию ломаний их 3Д движка. Ломаю всё. Кроме одного — они придумали свой формат упаковывания файлов. К примеру в сети полным пол-но исходников ZIP архиватора на С++ и классов для чтения данных. Достаточно видоизменить архиватор, заменить байты и уже он не будет ZIP ом. Флешом декодируем и все. Что мы имеем? какие-то кривые файлы, вшиты в саму флешку. Ну вытащил я их — что дальше? Как считать данные из них это еще пол беды. Как их туда поместить? Вот это загадка :) По-крайней мере разгадка займет не один месяц :) Достаточно чтоб собрать сливки с игры, не так ли?
У меня вопрос еще есть. Вот я слыхал есть возможность ремоутного дебаггинга флешки. Ну типа запустил я игру прямо на сайте и подцепился и дебажу. Хотя бы лог сливаю как выполнялось. Потом запустил локально и аналогично. Логи можно сравнить и понять где началось расхождение. Это реально? Какая тулза где взять?
По теме, включая оффтоп — какой смысл что-либо ловить на сервере, если игру ломать надо локально? :) Вот в чем вопрос.
диззассемблером ищем
pushstring «gamedevblogs.ru»
вбиваем свой адрес и размещаем у себя игру. Если функция не несет в себе ничего после — просто пишем так
returnvoid
pushstring «gamedevblogs.ru»
…
if (!gamedevblogs.ru){
fuckyou();
}
и всё :) игра даже не дойдет до момента pushstring «gamedevblogs.ru», т.к. наш returnvoid просто закончил функцию :)
Мне было бы интересно поковырять чьи-то тут игры :)
3) если не найду 1)
Кстати — описанный ниже пост про BitmapData явно поможет защититься от больше половины хакеров. Но опять-же ничего не мешает сделать returnvoid в дизассемблере :)
Но ведь можно поступить умно — в одной функции по защите описать и важные рабочие моменты самой флешки )
К примеру если это игра где управление с клавы — хакер вставивший выход из функции умертвит обработку кнопок. Конечно, можно банально вырезать код — но до этого надо догадаться.
Кстати, я думал что можно в байткоде искать код, который доставляет текущий домен. Это второй шаг.
Вторая рекомендация — если уже банальная строка с адресом — то делать пару проверок в ходе игры на:
— длину сайта откуда загрузили и сравнить её с длинной, какая должна быть. Длину хранить не в виде var SecureLock:int = 8; а где-то хитро. К примеру найти в логотипе цвет, состоящий из 0x25282, берем пиксель, вырезаем второй символ с конца и знаем что к чему ;)
Для прикола — отгадай какой адрес сайта тут зашит. Сделал легко, по-этому опиши как ты отгадал
Но я о другом спрашивал. Тяжело найти в байткоде вот этот вызов root.loaderInfo.loaderURL? Ведь именно тут узнают текущий домен. А уж потом где-то сравнивают на длину или еще что. Если найти где этот код — легко заменить на тупо просто строку с урлом сайтлока. Пусть себе проверяют потом.
Про картинку — colorsite.ru, у меня фотошоп есть. Каждый цвет пипеткой взял и посмотрел цвет — там сразу в hex дают. Забрал в far все четыре цвета, ну и потом перевел в десятичный каждую пару цифр. Дальше зажимаешь alt и набраешь эти цифры :)
На счет как найти в байткоде не знаю — дизассемблер показывает вот такое дело на код:
Могу сказать лишь то, что если флешку запихнуть в свой упаковщик и потом её embed и декодировать — то найти при дизассемблинге getproperty QName(PackageNamespace(""), «loaderURL») будет невозможно :) Однако решить всё равно проблему можно будет. Но время потраченное на это будет большое. А доход от взлома мизерный (если вообще будет)
А если loadBytes будет не тупо лежать в корне, а будет один упакованный файл хранящий в себе всё данные. Это упакованный файл будет в себе и саму swf игру хранить. А внешний swf только прелодадер и не более ) Как такой поворот?
Хакер ломанет первый swf и обрадуется. Когда дойдет до второго — смутится — он его не разберет. Когда взломает третий — самый ценный, то уже и не важно — сливки с игра сняты )
Из памяти выкусить когда уже расшифрованы.
Я повторюсь — надо опасаться не тех, кто сможет разобрать флешку, а тех — кто может её собрать обратно :) Пока это у меня не получилось с самописным пакером ) Как действует хакер флеш игр? Если уперся в стену и в течении Х времени не перелез через неё — ищет новую жертву. Это наш вариант. Надо зставить хакера искать другую жертву :)
Очень хотелось бы почитать =)
через bitmapdata считываем картинку и заранее зная где МОЖНО запускать — проверяем откуда стартанула флешка. Создаем динамически надпись с адресов откуда запустили и сравниваем с тем, что под логотипом нарисовано :) Главное подобрать шрифты и т.д. )
Хакера охиреют разрешать её запускать везде :) Никто не запрещает делать так для каждой встроенной картинки :)
А вот интересно почитать про взлом больших игр. дьюти типа или асасины, которые реально много бабоса в защиту вбахивают.
Не понял кто написал взломай страничку плз плз плз плз — я не занимаюсь противозаконными вещами, а лишь помогают указать другим на недостатки в защите.
Кстати — можно ссылку на игры "дьюти типа или асасины" — очень интересно :)
Просто было бы очень интересно почитать статью типа взлом-защита.
Внес бы свою лепту с удовольствием, за что сейчас и возьмусь.
Если флеш научится запрещать дебажить сам себя причем на низкоуровненом коде — думаю это произведет революцию в защите игрушек на флеш. Но такую хрень делать никому не надо — они MoleHill никак не доделают… А это равносильно хавать нажатие правой клавиши мышки
У меня есть знакомый, толковый хакер. Ломает исключительно С++ софт. Я ему дал флеш игру — он долго её крутил и сказал, что надо «переучиться», т.к. стандартные приемы просто не срабатывают.
А что мешает создать свой MD5 хеш и через дизассмеблер вставить для подмены? Те же яйца только в профиль.
Claymore ) Могу тебя озадачить — если ты хранишь в swf даже в обфусцированном виде — ты легко найдешь QName(PackageNamespace(""), «loaderInfo») и просто влепишь returnvoid чтоб она вообще не выполнялась, проверка эта.
Другое дело если ты создашь свой архиватор данных и его через loadBytes запульнешь во флеш. Даже если ты его вытащишь и сможешь глянуть — ты ничего не сделаешь. Дизассемблер просто не выполнит свою работу и ты не сможешь взломать ничегошеньки :)
http://www.flare3d.com/games/AlmaxRace/content/pack.zip напомню, что тут закодированные данные лежат. Но вызываются они не по мере обращения к ним, а сразу. Да, ты можешь конечно сделать дамп памяти софтом разным. К примеру мне нравится LordPE. Но это тебе не поможет. Прикол в том, что когда у тебя флешка с самописным или чьим-то но измененным пакером сделана — она у тебя банально будет иметь вид абра-кадабры :)
Я рекомендую зашивать ссылки в картинках. К примеру есть в игре есть кучу картинок — надо создать для каждой картинки доп.функцию, которая будет искать нужные пиксели в нужных местах (по цветам). Секрет в том, что если даже кто-то вытащит картинки — вохпервый, он не вопрет что именно там искать. А во-вторых, если и вопрет — он не сделает ничего, т.к. при экспорте картинок они пережимаются и добавляется meta тэги. Другими словами они разные. Разница в цвете пикселя в один бит уже радость для защиты автора :)
Статью уже мечтаю написать с авторским видео. Но никак времени не найду. Постараюсь в этом месяце сделать видос. Только вот думаю как преподать это, если я фактически покажу как ломать 99% игр :)
Кстати — с помощью дизассемблера можно вырезать перепрыгивания кода, что и является по-сути защитой от декомпиля )
Узко мыслишь, рекомендую читать предыдущие комментарии перед тем как писать. Проверку можно делать не явно, а например, зашифровать флешку ключом-строкой «bored.com», а при запуски уже расшифровывать текущим адресом домена, тогда returnvoid абсолютно ничего не даст, как это обходится уже писал выше.
Давай для теста любую игру у которой sitelock есть от кого угодно — уверен sitelock даже в том виде, как ты думаешь — не проживет и 5ти минут.
разница есть. И большая, поверь :) Ты получаешь адрес во флешке, которая лежит в архиве. Это для тебя архив, т.к. его автор и знаешь как декодировать. А для хакера это просто бинарный файл, который хз что он из себя представляет. Дизассемблер просто не выполнит свою работу, т.к. методы работы сильно отличаются от тех, что к примеру для С++ приложений сделаны.
У тебя банально не будет возможности узнать код и найти вообще вызов функции. Тебе дизассмемблер просто скажет «corrupted file».
Я тебе именно об этом хочу сказать. Представь, что ты вор-новичок и ты первым делом лезешь за ковер глянуть нет ли там сейфа. Нашел сейф, обрадовался. Но если ты не профи — ты его не откроешь. К примеру у тебя уровень +1 и ты вскрыл сейф. Открыл сейф, а там лежат какие-то бумажки, а не деньги. Иными словами corrupted file. И есть только один человек, который сможешь обменять эти бумажки на деньги — некий агент, который знает им цену (автор игры).
Объясню еще проще — самый базовый уровень это искать строку с удресом сайта, куда залочено. Там тупой returnvoid сработает. Но мне это даже не интересно — ломается за 1 минуту. Куда интереснее, как ты говоришь — зашифрованные строки. Которые очень хорошо заныканы. Ясное дело там returnvoid не сработает, т.к. там в этом необходимость ) Но поверь — это тоже легко лечится.
Можно даже не снимать sitelock, а найти одну функцию, которая возвращает true/false и удалить из неё всё и оставить всегда true и всё. Ты не ломая сайт-лок просто его выключаешь.
Понимаешь о чем я или нет? Я же не пишу тебя, что взлом ограничивается выключением одной функции. Задача автора не защитить от взлома, т.к. это и так ясное дело бесполезно. Настоящая задача — сделать так, чтоб хакер сказал «та ну его в сраку, пойду другую игру ломать» :)
В случае флешки — это сейф рядом с которым на столе лежит бумажка с шифром, просто нужно знать где искать.
Я то понимаю, вот ты похоже половину того что я выше написал не понимаешь или просто не читаешь, на этом комменте я заканчиваю бесполезную болтавню с тобой.
Я и сам очень хорошо знаю что все очень легко ломается, поэтому вообще особо не парюсь с защитой, так, киндисофтом иногда пройдусь, остальное не сильно целесообразно для обычной портальной флешки.
Разумеется, вместо прямого присвоения строк — делать долгие и сложные вычисления.
в дизассембелере код выглядит так:
У меня есть идея, я уже как-то упоминал, ключевые моменты (защиту и какие-нибудь методы логики) написать на «брейнфаке» и заставить хацкера разбираться в синтаксисе «языка».
Пока будет разбираться — неделька сайтлока пройдет.
Разумеется, на «брейнфаке» писать никто не будет, поэтому нужно сделать «компилятор» из подмножества «нормального» языка (си, паскаль, яваскрипт, что угодно) в этот самый «брейнфак».
В результате — пишем несложный алгоритм на «паскале», компилируем в дикую мешанину символов и скармливаем хакеру. Хочет — пускай разбирает.
Заинтересовала тема взлома. Скачал Yogda. Попробовал взломать url-lock, в первой попавшейся игре.
Раньше думал, что это не так легко, а оказалось очень просто.
Если в игре используется «стандартная» функция, да та единственная, которую все используют для проверки домена, то сайтлок ломается простым преобразованием строки «domain.com» в "".
Так что даже если наставить кучу if-ов с проверками, все-равно это не поможет от такого варианта.
Следующее, можно просто в функции проверяющей соответствие домена, удалить все лишнее, а оставить только «return true;».
После, решил попробовать вытянуть ресурсы из своей игры, написана на Flex. Все ресурсы компилируются в swf файл, после чего эмбедятся в главный swf файл. Таким образом, декомпилятор не находит эти ресурсы, так я думал до сегодняшнего дня. Это дело, с помощью дизассемблера, вытаскивается тоже простыми телодвижениями. И это получилось у человека, который как пол-часа познакомился с flash дизассемблером. Представляю как работают настоящие хакеры :)
Так почему бы китайцам или прочим пиратам которые желают урвать игру в эксклюзивный период себе просто не создать страницу-пустышку с названием такой игры? Для гугла же пофигу есть ли там игра сама или нет — он кейворды нюхает.