Сайтлок secureSWF сломали

Как я вроде знаю secureSWF самая мощная программа защиты флешки. По крайней мере везде где я читал/слышал исключительно рекомендуют ее. Это и в докладах по защите и в статьях, на хабре например.

Я ее купил соответственно, самую навороченную версию. Обфусцирует она скорее всего действительно на 5, вставляет мусор и гадости тоже. Но вот у нее есть несколько встроенных фич, например — сделать сайтлок, зашифровать строки, которые в явном виде. Так вот, если обфускация необратима полюбому, то сайтлок можно взломать. И дальше ломать остальные игры уже зная что и как.

Так вот хочу предупредить, скорее всего китайцы уже умеют ломать сайтлоки secureSWF на потоке. То-есть, старайтесь дополнительно ставить свой сайтлок, желательно хитрый (если каждый будет хитрить по своему — не будет стандартного способа у китайцев).

Почему я решил что они сломали сайтлок secureSWF. Судите сами. Моя игра уже 3 дня эксклюзива на сайте спонсора оттрубила. И вот в статистике появился 7k7k. Однако появлись только views, не plays. Cайтлок secureSWF не позволяет коду дойти даже до посылки view. А вот мой сайтлок уже не позволяет добраться до кнопки play чтобы поиграть, и соответственно успевает послать view но не может послать play.

Какие есть варианты? Либо китайцы следят за релизами, в том числе и на Баблбоксе и три дня ломали сайтлок secureSWF. Либо они только заметили игру и сразу уже отработанными методами сломали сайтлок secureSWF. И увидели что игра все равно не идет. Я не знаю продолжат ли они попытки доломать, думая что еще не доломали secureSWF или уже понимают что там еще один сайтлок.

Тем не менее, если появится сломанная версия на 7k7k, оттуда она может поехать по миру. Вот тебе и эксклюзив на неделю. Вот тебе и удар по деньгам от перфоманса.

Таким образом еще раз совет — мощные сайтлоки от клевых программ хорошо, но не очень. Второй сайтлок от себя самого — маст ду.
  • +11

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

0
еще secureSWF жестко ломает swf-ку, проверять надо всю игру, то с мувиклипами запорет то со звуком итд…
Так же самая наворочаная версия практически всегда не без проблем.
0
Это удивительно, но у меня без проблем самый аггрессивный вариант на игру ложится. Наверно зависит от стиля написания кода… Не, ну конечно я добавил исключения в таблицу, но для того в secureSWF отличнейшие способы затюнить все и есть!
0
… Одно радует — у secureSWF 100% гарантия возврата денег ;)
0
опа, я такого не читал, пойду найду
0
В течении 30 дней возврат просто по желанию. Я купил их год назад.
Я думал что если ты докажешь что их взломали, то они вернут деньги…
0
А… ну я не читал. Думал будет по человечески:) Хотя с другой стороны — что мешает написать письмо с жалобой на то что продукт не выполняет своих задач? И требовать компенсацию. Тоесть — этот головняк конечно никому не нужно:)
0
а че? уже собрался возвращать?
0
Да нет, игру же не доломали из-за моего личного сайтлока. Нечего тыкнуть в нос. Но на самом деле тулза хороша, им просто надо метод сайтлока менять часто, от версии к версии. Тогда не будет стандартного способа срезать их сайтлок. Ну и вообще — такое все равно сломают. Можно тыкнуть для того чтобы пошевелились и обновили свой сайтлок.
0
Сайт-лок SecureSWF легко ломается заменой вызова функции SecureSWF, которая проверяет домен, на конструкции nop.
Поэтому лучший сайт-лок — множественные собственные проверки в различных местах кода.
0
Странно что так просто. Все же secureSWF лучшие.
0
Может как-то сообразим все вместе еще очередную статью написать по типу пример-взлом и т.д. Думаю очень полезная будет.
0
Ну я конкретно не спец, сам вот не пытался ломать. Знаю только рекомендации и они пока не подвели ттт.
Палить метод сайтлока не стоит ни мне ни другим. Ибо их сила в индивидуальности и уникальности. Если метод распространится, то станет типовой и будут щелкать как тот-же secureSWF.
А рекомендации только — сделать так, чтобы найти место где расположен сайтлок было трудно. Чтобы в байткоде трудно напрямую было найти проверку, чтобы строка «sponsor.com» не лежала в открытом незашифрованном виде. Чтобы в случае незапуска — место незапуска было неочевидно. Ибо если вы покажете табличку «хрен вам хакеры», то можно найти место где табличка показывается, и оттуда отмотать до проверки сайтлока. Лучше всего гадить так, чтобы было непонятно что произошло.
0
Ну а базовые примеры взлома, начиная от взлома очков, манипуляций со скоростью игры и т.д. и взлом самых базовых, может устаревших обсфукаторов.
+5
Чтобы избежать явных проверок домена, можно в разных местах шифровать отдельные элементы ключом, который неявно получается из текущего урла, например генерировать ряд ключей какой-нибудь ГСП с начальным параметром текущий url. На других доменах расшифруется не верно и работать будет с ошибками.
+1
Чтобы непросто было сделать дамп уже расшифрованной флешки, нужно кроме размазывания по всему коду, неиспользуемые расшифрованные элементы выгружать из памяти, для этого больше подходят маленькие элементы которые можно быстро шифровать туда сюда, например элементы GUI. Также можно привязаться (неявно проверять, через битовые операции) к времени выполнения участков кода, если оно превышает какой-то разумный лимит, то элементы расшифруются не правильно, таким образом можно сильно затруднить пошаговую трассировку кода.
0
О! По времени это крутая идея, я до этого думал только о динамически случайных разных ветках кода, которые делают одно и то же.
0
Я в прелоадере запоминаю домен, в самой игре в 3х местах проверяю его явно и MD5, SHA224, SHA1 хэши на равенство с заранее полученными хэш-значениями нужного домена. Если сверху еще добавить сайтлок secureSWF и его же обфускацию, будет такой способ достаточно надежным?
0
Я имею в виду что можно ведь отследить все места получения домена (в моем случае в прелоадере) и подменить значение переменной хранящей домен на нужный.
+2
а я не парюсь что китайцы уведут игру… ну увели у меня Catch the Candy в течение недели, когда игра прикручена к сайту спронсора… взломали урл-лок и удалили все ссылки… поиграли на 7k7k и 4399 полтора миллиона человек… ну и чо спрашивается?

на этих сайтах играют только китаёзы и ни один некитайский сайт игру у них не взял… бабла с китайцев всё равно нету ни при каких раскладах… так что чо париться то? ;)
+2
Повезло. У кого-то тут из камрадов было по другому. Версию со срезанным сайтлоком и беклинками увидел на китайском сайте кто-то из некитайских порталов и взял себе. У него кто-то взял дальше и пошло поехало. Итог — посередине эксклюзивной недели по миру пошла дистрибутиться версия, которая не приносит бабла. Потом ты уже со своей верной версией конечно потыркаешься для замены на некоторых порталах. Но поезд ушел.
+1
Я, кстати, тоже особо с защитой не заморачиваюсь, получается не целесообразно, потому что на разработку более менее хорошей защиты уйдет достаточно времени, в том числе и на подгонку архитектуры игры под защиту. Китайцы обычно же просто в ембед-коде лочат все линки разом, этот случай скорее стечение обстоятельств, в таких случаях нужно сразу подключать спонсора, т.к. он ни меньше заинтересован и крутые спонсоры имеют более тесные связи в цивилизованном сегменте. Если самоспонсирование, тут, да, можно сделать более серьезную сервер-базед защиту на эксклюзивный период, когда свой сайт руки развязаны в методиках.

P.S. Попробовал на 4399.com — ссылки работают, по крайней мере на Catch the Candy и Snail Bob 2
0
Конечно разумно надо подходить. Я не сильно заморачивался, один сайтлок от secureSWF, один мой, делался быстро, чуть дольше думал что сломать в игре.
0
Да перестаньте — ломать можно любую игру. Вопрос времени.
Срезать сайтлоки — как два пальца об асфальт. Даже не декомпилируя игру. Когда я очень хочу поиграть во что-то, а там работа только через инет — это ломается за 5 минут.
0
Вопрос времени. И чо? Именно об этом речь. Неделя эксклюзива при перфоманс сделке на будущие месяцы дистрибуции. Если за неделю не сломают — хорошо. Если сломают — риск обломить себе дистрибуцию. У fedoit-та сломали в течение недели. Но не утекла дальше — повезло. А вот кому-то из камрадов, не помню кому — не повезло.

А не расскажешь как ломаешь?
+5
Ломается легко. Ищешь as3 дизассемблеры с возможностью сборки кода обратно. К примеру RABCDAsm помогает в этом на все 100%
99.9% челов ставят защиту тупым String == 'site.ru': welcome()? fucku()

Более продвинутые пишут байткод с hex значением. К примеру 636F6C6F72736974652E727500 это colorsite.ru — мой сайт. Так вот, когда дизассемблишь код, ты имеешь возможность наглядно увидеть, как код будет виден хакерам. И самое главное теперь — попытаться запутать его еще при компиляции. Снова дизассемблить и т.д. пока не получится нужный результат.

Недавно столкнулся с защитой, когда при изменении флешки хотя бы на один байт — она уже не запускается. Как узнать её точный размер в байтах? Казалось бы — просто. Один раз собрал — глянул. Собрал еще раз — с указанием размера и вуаля ) Но не тут-то было. Флеш каждый раз дает разные размеры в среднем на 10 байт. Что существенно будет. Так вот там размер флешки сначала вшили как 999, а потом уже после сборки вшили через дизассемблер нормальный. Но легко решилось таким же образом )

Сейчас я работаю в одной службе одной софтверной компании по тестированию ломаний их 3Д движка. Ломаю всё. Кроме одного — они придумали свой формат упаковывания файлов. К примеру в сети полным пол-но исходников ZIP архиватора на С++ и классов для чтения данных. Достаточно видоизменить архиватор, заменить байты и уже он не будет ZIP ом. Флешом декодируем и все. Что мы имеем? какие-то кривые файлы, вшиты в саму флешку. Ну вытащил я их — что дальше? Как считать данные из них это еще пол беды. Как их туда поместить? Вот это загадка :) По-крайней мере разгадка займет не один месяц :) Достаточно чтоб собрать сливки с игры, не так ли?
0
Спасибо за ответ! Я как раз хотел позырить все изнутри. Вот время только выбрать. Наметил сначала www.yogda.com/ но теперь еще и RABCDAsm гляну.

У меня вопрос еще есть. Вот я слыхал есть возможность ремоутного дебаггинга флешки. Ну типа запустил я игру прямо на сайте и подцепился и дебажу. Хотя бы лог сливаю как выполнялось. Потом запустил локально и аналогично. Логи можно сравнить и понять где началось расхождение. Это реально? Какая тулза где взять?
0
Если честно — передо мной не ставились задачи ремоутного дебаггинга, т.к. задача хакера не всегда сделать так, чтоб у героя не кончались патроны :) Злых хакеров задача украисть игру, чтоб она на компе работала локально, потом на домене нужном или на любом. Ну и на последок получения sources для перетравки на свой лад. Добрый хакеров задача — найти дыры в защите. Не обязательно их править. Просто указать на них клиенту. Это оффтоп.

По теме, включая оффтоп — какой смысл что-либо ловить на сервере, если игру ломать надо локально? :) Вот в чем вопрос.
0
Я про сайтлок жеж. На сайте спонсора — работает. Локально/на другом сайте не работает. Смотрим лог работы на сервере и локально. Видим где расхождение. Там и есть проверка или уже отсечка. От которой можно найти где проверка.
0
Да не, вряд ли такое сработает :) Более того — вот к примеру стоит сайт-лок на gamedevblogs.ru и зачем искать расхождения, если обычно делается проверка на локальность запуска в том числе :) Локально позволяют 99.9% играть :) Это мне везет, что в мои игры любимые тяжко локально играть.

диззассемблером ищем

pushstring «gamedevblogs.ru»

вбиваем свой адрес и размещаем у себя игру. Если функция не несет в себе ничего после — просто пишем так

returnvoid
pushstring «gamedevblogs.ru»

if (!gamedevblogs.ru){
fuckyou();
}

и всё :) игра даже не дойдет до момента pushstring «gamedevblogs.ru», т.к. наш returnvoid просто закончил функцию :)

Мне было бы интересно поковырять чьи-то тут игры :)
0
А если не найдешь ни строку в явном виде, ни hex. Как дальше будешь действовать?
0
1)
Если уперся в стену и в течении Х времени не перелез через неё — ищет новую жертву.
2) найду :)
3) если не найду 1)

Кстати — описанный ниже пост про BitmapData явно поможет защититься от больше половины хакеров. Но опять-же ничего не мешает сделать returnvoid в дизассемблере :)

Но ведь можно поступить умно — в одной функции по защите описать и важные рабочие моменты самой флешки )

К примеру если это игра где управление с клавы — хакер вставивший выход из функции умертвит обработку кнопок. Конечно, можно банально вырезать код — но до этого надо догадаться.
0
Ну значит первая рекомендация — шифруйте строку с доменом своим самописным методом и никому об этом не говорите :)

Кстати, я думал что можно в байткоде искать код, который доставляет текущий домен. Это второй шаг.
0
Первая рекомендация — создать свой универсальный упаковщик, который упакует к примеру графику в один файл и потом [Embed… этот файл в байт код и потом декодировать.

Вторая рекомендация — если уже банальная строка с адресом — то делать пару проверок в ходе игры на:
— длину сайта откуда загрузили и сравнить её с длинной, какая должна быть. Длину хранить не в виде var SecureLock:int = 8; а где-то хитро. К примеру найти в логотипе цвет, состоящий из 0x25282, берем пиксель, вырезаем второй символ с конца и знаем что к чему ;)

Для прикола — отгадай какой адрес сайта тут зашит. Сделал легко, по-этому опиши как ты отгадал
0
Идею понял. Графика упакована так, что задолбаешься обратно инжектить исправленную. А в графике скрыта инфа.

Но я о другом спрашивал. Тяжело найти в байткоде вот этот вызов root.loaderInfo.loaderURL? Ведь именно тут узнают текущий домен. А уж потом где-то сравнивают на длину или еще что. Если найти где этот код — легко заменить на тупо просто строку с урлом сайтлока. Пусть себе проверяют потом.

Про картинку — colorsite.ru, у меня фотошоп есть. Каждый цвет пипеткой взял и посмотрел цвет — там сразу в hex дают. Забрал в far все четыре цвета, ну и потом перевел в десятичный каждую пару цифр. Дальше зажимаешь alt и набраешь эти цифры :)
+2
Все верно понял ты, про «А в графике скрыта инфа» )))

На счет как найти в байткоде не знаю — дизассемблер показывает вот такое дело на код:

package {
    import flash.display.MovieClip;

    public class MainClass extends MovieClip {

        public var lock:MovieClip;

        public function MainClass(){
            if (this.loaderInfo.loaderURL != "colorsite.ru"){
                this.removeChild(this.lock);
            };
        }
    }


refid "MainClass"
instance QName(PackageNamespace(""), "MainClass")
 extends QName(PackageNamespace("flash.display"), "MovieClip")
 flag SEALED
 flag PROTECTEDNS
 protectedns ProtectedNamespace("MainClass")
 iinit
  refid "MainClass/iinit"
  body
   maxstack 2
   localcount 1
   initscopedepth 10
   maxscopedepth 11
   code
    getlocal0
    pushscope

    getlocal0
    constructsuper      0

    getlocal0
    getproperty         QName(PackageNamespace(""), "loaderInfo")
    getproperty         QName(PackageNamespace(""), "loaderURL")
    pushstring          "colorsite.ru"
    ifeq                L13

    getlocal0
    getlocal0
    getproperty         QName(PackageNamespace(""), "lock")
    callpropvoid        QName(PackageNamespace(""), "removeChild"), 1

L13:
    returnvoid
   end ; code
  end ; body
 end ; method
 trait slot QName(PackageNamespace(""), "lock") type QName(PackageNamespace("flash.display"), "MovieClip") end
end ; instance
cinit
 refid "MainClass/cinit"
 body
  maxstack 1
  localcount 1
  initscopedepth 9
  maxscopedepth 10
  code
   getlocal0
   pushscope

   returnvoid
  end ; code
 end ; body
end ; method


Могу сказать лишь то, что если флешку запихнуть в свой упаковщик и потом её embed и декодировать — то найти при дизассемблинге getproperty QName(PackageNamespace(""), «loaderURL») будет невозможно :) Однако решить всё равно проблему можно будет. Но время потраченное на это будет большое. А доход от взлома мизерный (если вообще будет)
0
Просто свой упаковщик не сильно изменит ситуации как и тот же мочи-крипт, там даже и не нужно знать алгоритм, можно просто найти вызов Loader.loadBytes, через который после распаковки будет грузится флешка, и выдернуть байтаррей с уже распакованной флешкой — без проблем.
0
Нужно делать итерационный упаковщик, чтобы в любой момент времени распаковывалось только нужная информация, ключом вычисляемым не явно из метаданных, чтобы в любую единицу времени вся флешка в распакованном виде не была доступна.
+1
Не совсем так :) www.flare3d.com/games/AlmaxRace/content/pack.zip вот файл — внутри запакованы все данные по игре. Внутри зипа свой формат архиватора. Ломануть можно — у меня ушло на это полтора месяца. Оплачиваемых полтора месяца. Поменяли степень защиты в новых версиях.

А если loadBytes будет не тупо лежать в корне, а будет один упакованный файл хранящий в себе всё данные. Это упакованный файл будет в себе и саму swf игру хранить. А внешний swf только прелодадер и не более ) Как такой поворот?

Хакер ломанет первый swf и обрадуется. Когда дойдет до второго — смутится — он его не разберет. Когда взломает третий — самый ценный, то уже и не важно — сливки с игра сняты )
0
Это итерационная упаковка, я ниже про нее писал. Если будет простая «матрешка», то время взлома ненамного увеличится, в каждой последующей делается тот же самое, что и в предыдущем этапе. Во флеше это все усугубляется еще тем что в любое место можно инжектить сколько угодно своего кода, который и залогирует структуру, и выдернет когда нужно, и сохранит и etc
0
какие-то кривые файлы, вшиты в саму флешку

Из памяти выкусить когда уже расшифрованы.
+1
Не совсем так легко выкусить из памяти. Я использую серьёзные приложения для отмычки софта на С++ — там аналогично всё. Я конечно не профи, по-этому много не знаю. Но методом тыка что я мог получить? Лишь бинарник файла, который embed во флеш. Только смысл в этом, если мне бинарник, включенный во флеш легко отдает и Buracks ASV 6 за один клик.

Я повторюсь — надо опасаться не тех, кто сможет разобрать флешку, а тех — кто может её собрать обратно :) Пока это у меня не получилось с самописным пакером ) Как действует хакер флеш игр? Если уперся в стену и в течении Х времени не перелез через неё — ищет новую жертву. Это наш вариант. Надо зставить хакера искать другую жертву :)
0
Нещадно плюсую за ссылку на RABCDAsm. Давно искал подобное.
+1
TheRabbit, напишите пожалуйста статейку в блогах как-нибудь! По защите-взлому.
Очень хотелось бы почитать =)
+1
Еще очень умный способ защиты — берем нашу любимую картинку логотипа спонсора и обязательно туда лепим графическую надпись адреса сайта :)

через bitmapdata считываем картинку и заранее зная где МОЖНО запускать — проверяем откуда стартанула флешка. Создаем динамически надпись с адресов откуда запустили и сравниваем с тем, что под логотипом нарисовано :) Главное подобрать шрифты и т.д. )

Хакера охиреют разрешать её запускать везде :) Никто не запрещает делать так для каждой встроенной картинки :)
0
стеганографических способов много, взломать можно 99%. Нужно?
А вот интересно почитать про взлом больших игр. дьюти типа или асасины, которые реально много бабоса в защиту вбахивают.
0
:) Не знаю про эти игры :) Но есть одна любимая игра Мегаполис на однок*лас? никах :) Так вот я себе лично красиво начисляю бабки в игре простым способом. Поставил Charlies, хаваю траффик и в момент скачки файла с сервака я подмениваю файлы локальным — уже ломанным :) Он вообще ничем не защищен. Объекты, которые стоят по 2-3 мегабакса я покупаю по -3 мегабакса :) Почему минус 3 — думаю математику не надо объяснять ))))
+1
взломай страничку плз плз плз плз
Если честно это странно. Разраб ведь, приличный человек, а занимаешься мелочевкой. Статью не планируешь написать? Было бы очень круто.
0
Разработчики тоже люди :) Или у тебя Photoshop CS5 стоит лицензионный ;)

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

Кстати — можно ссылку на игры "дьюти типа или асасины" — очень интересно :)
0
habrahabr.ru/blogs/subconsciousness/86335/ ну типа.

Просто было бы очень интересно почитать статью типа взлом-защита.
Внес бы свою лепту с удовольствием, за что сейчас и возьмусь.
0
Тю :) Это же не флеш игра — там другой подход нужен вовсе. Если ты можешь swf файл прогнать через дизассемблер и собрать обратно без проблем, то обычные игры имеют минимально навесную защиту. Самая первая и базовая составляющая — запрет работы дебаггера и клонирования адресов вызова.

Если флеш научится запрещать дебажить сам себя причем на низкоуровненом коде — думаю это произведет революцию в защите игрушек на флеш. Но такую хрень делать никому не надо — они MoleHill никак не доделают… А это равносильно хавать нажатие правой клавиши мышки
0
Те кто ломают флеш игры не сломают обычные и на оборот. Если ты водишь авто — не факт, что ты сядешь и поедешь в болиде F1
0
понял, спасибо. Сам попробую хранить домены в звуках из игры.
0
Ну Шумахер отлично водит городской седан ;)
0
Зато в гран туризмо не выступает и в лемане тоже:)
0
Не ) ну я про:
Те кто ломают флеш игры не сломают обычные и наоборот.
0
Нет, ясное дело рано или поздно это произойдет. Но цена уже на ломанный продукт будет равна нулю.
У меня есть знакомый, толковый хакер. Ломает исключительно С++ софт. Я ему дал флеш игру — он долго её крутил и сказал, что надо «переучиться», т.к. стандартные приемы просто не срабатывают.
0
А вот интересно почитать про взлом больших игр. дьюти типа или асасины, которые реально много бабоса в защиту вбахивают.
Все новомодные сервер-базед защиты особо то и ломать не нужно, просто делается эмуляция сервера, единственное нужно собрать полный дамп трафика с сервером, для этого нужно несколько раз пройти лиц.игру и заснифферить все пары ответ-запрос, и потом это повторить на эмуляторе, а остальные локальные примочки снимаются старыми методами. Но думаю эти защиты ждет такая же участь, как и старфорс, страдают добропорядочные игроки и соответственно их потребительские права. С флешками примерно тоже самое, можно конечно намутить очень серьезную защиту с сильной криптографией, но это значительно повлияет на скорость загрузки, и часть игроков попросту, не дождавшись, свалят играть в соседнюю игру, тем более скорость работы алгоритмов еще усугубляется спящим режимом плеера в неактивной вкладке — так что особо не разгуляешься, и это еще один камень в огород целесообразности разработки серьезных механизмов защиты.
0
тогда почему убисофтовцы были тык уверены в неломаемости? Пиар акция?
0
Ну само собой все не так просто как я написал «в двух словах» )) Серверные системы защиты достаточно стойкие к анализу, потому что структура серверной части закрыта. Но ее и не крэкнули в этом смысле, т.е. нет алгоритма который запустит любую нелиценз. копию. Для одной лицензионной копии сдампили и сэмулировали сервер, ее перепаковали и распространяют. Но обычно жесткие DRM снимают сами разработчики в первом патче, после потока жалоб потребителей. Но в принципе всякие онлайн-аккаунты и прочие серверные штуки, направлены ни столько на противодействие пиратству, сколько противодействие вторичному рынку дисков — если человек пользуется пираткой, то он вряд ли купил бы лицензионную копию, а те кто покупают б\у или берут в прокат (на западе довольно распространено) это потенциальные покупатели, которые упущены. Так что пиар, наверное, тоже присутствует.
+1
Все хочу спросить — а почему не хранить адреса в MD5 с каким-то доп. ключиком? Разбить этот закодированный адрес на 2-3 куска, чтобы не так явно хэш валялся в 32-символьной строке или 16-битном байтмассиве. Интересно на эту тему услышать.
0
Метод хранения адреса не играет роли, потому что легко найти вызов получения текущего адреса, например, получение свойства loaderInfo.loaderURL и заменить на pushstring "_http://www.bored.com". Тут только очень хорошее размазывание по коду и вынос проверки в серверную часть может охладить пыл юнатов.
+2
Самый идеальный вариант — хранение данных на сервере и по мере надобности выдавать их порциями с учетом всех кодировок. Но это не наш случай, т.к. спонсор не захочет ради одной игры писать РНР часть или её же устанавливать на свой сервер, если её автор игры даст.
Все хочу спросить — а почему не хранить адреса в MD5 с каким-то доп. ключиком? Разбить этот закодированный адрес на 2-3 куска, чтобы не так явно хэш валялся в 32-символьной строке или 16-битном байтмассиве. Интересно на эту тему услышать.

А что мешает создать свой MD5 хеш и через дизассмеблер вставить для подмены? Те же яйца только в профиль.

Claymore ) Могу тебя озадачить — если ты хранишь в swf даже в обфусцированном виде — ты легко найдешь QName(PackageNamespace(""), «loaderInfo») и просто влепишь returnvoid чтоб она вообще не выполнялась, проверка эта.

Другое дело если ты создашь свой архиватор данных и его через loadBytes запульнешь во флеш. Даже если ты его вытащишь и сможешь глянуть — ты ничего не сделаешь. Дизассемблер просто не выполнит свою работу и ты не сможешь взломать ничегошеньки :)

http://www.flare3d.com/games/AlmaxRace/content/pack.zip напомню, что тут закодированные данные лежат. Но вызываются они не по мере обращения к ним, а сразу. Да, ты можешь конечно сделать дамп памяти софтом разным. К примеру мне нравится LordPE. Но это тебе не поможет. Прикол в том, что когда у тебя флешка с самописным или чьим-то но измененным пакером сделана — она у тебя банально будет иметь вид абра-кадабры :)

Я рекомендую зашивать ссылки в картинках. К примеру есть в игре есть кучу картинок — надо создать для каждой картинки доп.функцию, которая будет искать нужные пиксели в нужных местах (по цветам). Секрет в том, что если даже кто-то вытащит картинки — вохпервый, он не вопрет что именно там искать. А во-вторых, если и вопрет — он не сделает ничего, т.к. при экспорте картинок они пережимаются и добавляется meta тэги. Другими словами они разные. Разница в цвете пикселя в один бит уже радость для защиты автора :)

Статью уже мечтаю написать с авторским видео. Но никак времени не найду. Постараюсь в этом месяце сделать видос. Только вот думаю как преподать это, если я фактически покажу как ломать 99% игр :)

Кстати — с помощью дизассемблера можно вырезать перепрыгивания кода, что и является по-сути защитой от декомпиля )
+1
Я рекомендую зашивать ссылки в картинках
Какая разница где их хранить и куда их зашивать, хоть в самую темную задницу засунуть, я уже чуть выше писал, все равно при проверке (даже неявной) для сайт-лока, нужно будет получить текущий адрес, текущий адрес получается с помощью стандартных функций, которые можно легко заменить на нужную строку — pushstring «фейковый адрес» — и все.

Claymore ) Могу тебя озадачить — если ты хранишь в swf даже в обфусцированном виде — ты легко найдешь QName(PackageNamespace(""), «loaderInfo») и просто влепишь www.kongregate.com чтоб она вообще не выполнялась, проверка эта.
Узко мыслишь, рекомендую читать предыдущие комментарии перед тем как писать. Проверку можно делать не явно, а например, зашифровать флешку ключом-строкой «bored.com», а при запуски уже расшифровывать текущим адресом домена, тогда returnvoid абсолютно ничего не даст, как это обходится уже писал выше.
+2
)) Ты не думай прямолинейно. Ясное дело выход из функции я написал как пример. В конечном итоге где-то будет функция, которая сделает сайт-лок и проверяет. Ты это сможешь выследить. К примеру среди кучи функций ищешь в текстовом редакторе (уже в диззассембленном коде) повторения и колдуешь. И снимаешь защиту.

Давай для теста любую игру у которой sitelock есть от кого угодно — уверен sitelock даже в том виде, как ты думаешь — не проживет и 5ти минут.

Какая разница где их хранить и куда их зашивать
разница есть. И большая, поверь :) Ты получаешь адрес во флешке, которая лежит в архиве. Это для тебя архив, т.к. его автор и знаешь как декодировать. А для хакера это просто бинарный файл, который хз что он из себя представляет. Дизассемблер просто не выполнит свою работу, т.к. методы работы сильно отличаются от тех, что к примеру для С++ приложений сделаны.

У тебя банально не будет возможности узнать код и найти вообще вызов функции. Тебе дизассмемблер просто скажет «corrupted file».
Я тебе именно об этом хочу сказать. Представь, что ты вор-новичок и ты первым делом лезешь за ковер глянуть нет ли там сейфа. Нашел сейф, обрадовался. Но если ты не профи — ты его не откроешь. К примеру у тебя уровень +1 и ты вскрыл сейф. Открыл сейф, а там лежат какие-то бумажки, а не деньги. Иными словами corrupted file. И есть только один человек, который сможешь обменять эти бумажки на деньги — некий агент, который знает им цену (автор игры).

Объясню еще проще — самый базовый уровень это искать строку с удресом сайта, куда залочено. Там тупой returnvoid сработает. Но мне это даже не интересно — ломается за 1 минуту. Куда интереснее, как ты говоришь — зашифрованные строки. Которые очень хорошо заныканы. Ясное дело там returnvoid не сработает, т.к. там в этом необходимость ) Но поверь — это тоже легко лечится.

Можно даже не снимать sitelock, а найти одну функцию, которая возвращает true/false и удалить из неё всё и оставить всегда true и всё. Ты не ломая сайт-лок просто его выключаешь.

Понимаешь о чем я или нет? Я же не пишу тебя, что взлом ограничивается выключением одной функции. Задача автора не защитить от взлома, т.к. это и так ясное дело бесполезно. Настоящая задача — сделать так, чтоб хакер сказал «та ну его в сраку, пойду другую игру ломать» :)
0
Это для тебя архив, т.к. его автор и знаешь как декодировать. А для хакера это просто бинарный файл, который хз что он из себя представляет.
Я в этом не особо волоку, но ведь этот бинарник рано или поздно флэшка распакует, и все это ляжет в память, откуда его можно снять как уже распакованный код.
0
Я не буду ничего декодировать, потому что программа рано или поздно сама все это сделает останется только это извлечь.
Представь, что ты вор-новичок и ты первым делом лезешь за ковер глянуть нет ли там сейфа. Нашел сейф, обрадовался.
В случае флешки — это сейф рядом с которым на столе лежит бумажка с шифром, просто нужно знать где искать.
Понимаешь о чем я или нет?
Я то понимаю, вот ты похоже половину того что я выше написал не понимаешь или просто не читаешь, на этом комменте я заканчиваю бесполезную болтавню с тобой.
Давай для теста любую игру у которой sitelock есть от кого угодно — уверен sitelock даже в том виде, как ты думаешь — не проживет и 5ти минут
Я и сам очень хорошо знаю что все очень легко ломается, поэтому вообще особо не парюсь с защитой, так, киндисофтом иногда пройдусь, остальное не сильно целесообразно для обычной портальной флешки.
+4
var s1:String = 'loaderInfo';
var s2:String = 'loaderURL';
var o:Object = this[s1];
var s:String = o[s2];
Интересно, а такой способ получения URL легко отловить?
Разумеется, вместо прямого присвоения строк — делать долгие и сложные вычисления.
0
Неплохой способ, думаю если разнести это все по коду с предварительным шифрованием строк s1,s2. Еще, для усложнения жизни юным натуралистам, можно всем переменным поставить тип *, и сразу после использования строки-url затирать ее.
0
мощно придумано! Резко захотелось протестировать пример и лишний раз подивиться флешу, увидев в trace(s) адрес флешки :)

в дизассембелере код выглядит так:
function 0000 *():void
 {
 
    // Max stack        : 2
    // Local count      : 5
    // Scope depth      : 9
    // Max Scope depth  : 10
    // Exception Count  : 0
    // Trait Count      : 0
    // Code Length      : 31 bytes.
 
 
       0  getlocal0     
       1  pushscope     
       2  getlocal0     
       4  constructsuper        0
       6  pushstring    loaderInfo
       7  setlocal1     
       9  pushstring    loaderURL
       10  setlocal2    
       11  getlocal0    
       12  getlocal1    
       14  getproperty  multinameL
       16  coerce       Object
       17  setlocal3    
       18  getlocal3    
       19  getlocal2    
       21  getproperty  multinameL
       22  coerce_s     
       23  dup  
       25  setlocal     4
       29  iffalse      LOC_1:
LOC_1:
       30  returnvoid   
 }
0
Взлом: перед «setlocal 4» добавить последовательно «pop» и «pushstring bubblebox.com».
0
Я ошибаюсь, или речь у ryzed как раз идет о том, что в явном виде ты не найдешь строк 6 и 9?
0
Слишком легко ломается :) как не шифруй. Кому интересно посоревноваться — давайте придумаем кто будет ломать и кто писать защиту?
0
А ты можешь написать? Если можешь — почему бы не поделится идеей. Про архив я понял, а есть простой приёмчик защиты на недельку?)
0
а есть простой приёмчик защиты на недельку?)
Если он действительно простой, и его опубликовать — то он станет защитой на 5 минут, потому что для флеша львиная часть стойкости алгоритма, это сложность обнаружения расположения защитных механизмов. Поэтому простой прелоадер-упаковщик, вроде Мочиэдс/мочикрипт, снимается за несколько минут, т.к. место когда игра уже расшифрована находится простым поиском строчки loadBytes. Поэтому для более конкретных вещей лучше сделать закрытый раздел и там уже обсуждать вопросы защиты.
0
Нужен простой приемчик, созданный с учетом того, что алгоритм известен :)
У меня есть идея, я уже как-то упоминал, ключевые моменты (защиту и какие-нибудь методы логики) написать на «брейнфаке» и заставить хацкера разбираться в синтаксисе «языка».
Пока будет разбираться — неделька сайтлока пройдет.

Разумеется, на «брейнфаке» писать никто не будет, поэтому нужно сделать «компилятор» из подмножества «нормального» языка (си, паскаль, яваскрипт, что угодно) в этот самый «брейнфак».

В результате — пишем несложный алгоритм на «паскале», компилируем в дикую мешанину символов и скармливаем хакеру. Хочет — пускай разбирает.
+1
Смысл не в блокировании if, а в том чтобы сделать этот if одним из тысячи в игре. Ведь в нем не будет сравниваться строка полученная явно из loaderInfo.loaderUrl (который и ищут, если не нашли второю строку — адрес сайтлока)
0
вот-вот.
Заинтересовала тема взлома. Скачал Yogda. Попробовал взломать url-lock, в первой попавшейся игре.
Раньше думал, что это не так легко, а оказалось очень просто.
Если в игре используется «стандартная» функция, да та единственная, которую все используют для проверки домена, то сайтлок ломается простым преобразованием строки «domain.com» в "".
Так что даже если наставить кучу if-ов с проверками, все-равно это не поможет от такого варианта.
Следующее, можно просто в функции проверяющей соответствие домена, удалить все лишнее, а оставить только «return true;».
После, решил попробовать вытянуть ресурсы из своей игры, написана на Flex. Все ресурсы компилируются в swf файл, после чего эмбедятся в главный swf файл. Таким образом, декомпилятор не находит эти ресурсы, так я думал до сегодняшнего дня. Это дело, с помощью дизассемблера, вытаскивается тоже простыми телодвижениями. И это получилось у человека, который как пол-часа познакомился с flash дизассемблером. Представляю как работают настоящие хакеры :)
0
Люди, я нуб во всяких сайтлоках и потобных делах, но тут подумалось — одна из важностей спонсорской флешки в том что игра будет только на сайте спонсора определенное время и поисковики проиндексят название игры именно на этом сайте.

Так почему бы китайцам или прочим пиратам которые желают урвать игру в эксклюзивный период себе просто не создать страницу-пустышку с названием такой игры? Для гугла же пофигу есть ли там игра сама или нет — он кейворды нюхает.
+1
черный сео, было на форуме недавно.
0
Понятно, на досуге пороюсь в форуме.
+1
flashgamedev.ru/viewtopic.php?f=12&t=1642&hilit=Jewelanche&start=30
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.