
Обфускаторы: от бесплатного до ?1500
Перед каждым разработчиком flash игр, который доводит до релиза более-менее крупный проект, может встать вопрос защиты своей игры, частью которой может быть обфускация AS3 кода и/или swf. Здесь результаты моего недавнего небольшого поиска по этому поводу. Что-то типа небольшой таблицы для сравнения актуальных на момент решений:
Ну и ещё возможно кому-то будет интересно покопаться в открытом коде на уровне концепции или пары небольших скриптов. Вот пара ссылок на такого типа решения:
http://makc3d.wordpress.com/2010/02/09/open-source-swf-obfuscator
http://github.com/shapedbyregret/actionscript-3-obfuscator
Больше всего хороших отзывов встречается о SecureSWF, пара знакомых мне команд используется его Pro версию. Про Amayeta и SWF Protector встречались отрицательные отзывы в плане неустойчивости перед современными декомпиляторами. Irrfuscator впервые увидел и попробовал только сегодня и не смотрел пока результаты его работы декомпилятором. Интерфейс довольно удобен и прост и обфускация прошла без проблем.
Думаю, что здесь найдется немало людей с бОльшим опытом использования обфускаторов, так что комментарии are welcome ) Также интересен опыт других способов защиты кроме обфускации, типа использования embed, вложенных загрузчиков и т.д.
Про то, что абсолютной защиты быть не может, писать не обязательно, понимание этого есть. ;)
p.s. это немного дополненная версия статьи опубликованной также в моем блоге. кто знает, а вдруг полезные комментарии появятся и там.
- OBFU - 1500? — демо нет, лицензия получается на год по e-mail автору :)
- Amayeta SWF Encrypt Pro — $145 — демо на 10 компиляций с watermark
- SecureSWF — от 100$ до 400$ (Pro) — триал 30 дней, watermark, напоминание
- Irrfuscator — от 80? до 150? -- триал 7 дней, без watermark
- SWF Protector — от 40$ до 60$ — ?
- SOB — бесплатно, с открытым кодом -- из командной строки
Ну и ещё возможно кому-то будет интересно покопаться в открытом коде на уровне концепции или пары небольших скриптов. Вот пара ссылок на такого типа решения:
http://makc3d.wordpress.com/2010/02/09/open-source-swf-obfuscator
http://github.com/shapedbyregret/actionscript-3-obfuscator
Больше всего хороших отзывов встречается о SecureSWF, пара знакомых мне команд используется его Pro версию. Про Amayeta и SWF Protector встречались отрицательные отзывы в плане неустойчивости перед современными декомпиляторами. Irrfuscator впервые увидел и попробовал только сегодня и не смотрел пока результаты его работы декомпилятором. Интерфейс довольно удобен и прост и обфускация прошла без проблем.
Думаю, что здесь найдется немало людей с бОльшим опытом использования обфускаторов, так что комментарии are welcome ) Также интересен опыт других способов защиты кроме обфускации, типа использования embed, вложенных загрузчиков и т.д.
Про то, что абсолютной защиты быть не может, писать не обязательно, понимание этого есть. ;)
p.s. это немного дополненная версия статьи опубликованной также в моем блоге. кто знает, а вдруг полезные комментарии появятся и там.
- +10
- flashco
Комментарии (30)
В этом посте же говорится о другом, почти не связанном с описанным мною. Байткод флеша таков, что в общем случае его легко декомпилировать и получить сырцы почти в таком же виде как у тебя на компе. В итоге — любой мало-мальски знающий сможет пересобрать игру заново.
Какие от этого проблемы? Ломать очки и деньги таким образом не имеет смысла — их можно ломать просто прямо в памяти. А вот вырезать из твоей игры рекламу и засунуть свою, и распространять — запросто. Срезать сайтлок можно, и игра с эксклюзивным контентом для спонсора может появиться пересобранной без сайтлока.
Во всех этих случаях ты теряешь деньги, либо теряет спонсор, который с тобой возможно потом не захочет связываться. Прямые удары по перфоманс сделкам, по бонусам, по рекламным деньгам.
И наконец — масса народу с радостью декомпилирую твою игру, поменяют ассеты, может даже не все — и запустят с рекламой. Причем, не один такой рипофф/клон а кучку. Им по-барабану даже что игра не хит. Они же почти не потратили ничего — им бы хоть немного там немного сям.
Даже если сделают клон визуально прилично переделанный — разве тебе небудет неприятно что кто-то воспользовался твоим кодом и движком бесплатно? Не помешает ли клон твоей второй версии? Если не будет неприятно — почему-бы тебе сразу не выложить сырцы всем в открытый доступ — пользуйтесь наздоровье? А ведь выпуск незашифрованной игры — это по сути и есть такой шаг.
Ну и наконец — если ты выложишь игру на ФГЛ с собственным сайтлоком, но не зашифрованную — есть шанс что ее свиснут влегкую. Я думаю ты не порадуешься когда игра преждевременно на порталах появится.
Таким образом идет борьба. Придумываются методы, которые усложняют декомпиляцию. Как минимум есть «обфускатор» — тулза тупо заменяет твои названия классов, переменных итд — на невменяемый набор символов. Даже если эту какашку декомпилировать — программисту будет сложно разобраться что и как в твоем коде происходит, для чего тот или иной класс.
Кроме обфускации защищающие программы еще и стараются вставлять невредный но каличный байткод, который сводит с ума известные декомпиляторы.
Кроме того, защищающие программы умеют и оптимизировать код, дожимать его — делая меньше флешку.
Кроме того — могут делать за тебя сайтлоки, особо неприятным для взлома способом.
Итого — защитив хорошей программой, а я слышал не из одних рук что таковая сейчас практически одна — secureSWF — ты сильно усложнишь работу декомпиляторам, возможно заставив их бросить эту затею после дофигищща потраченного времени. Сбережешь себе деньги.
а насчет защиты от читеров это да, отдельная тема, с обфускацией не особо связанная. было бы интересно и её обсудить как нибудь.
1 — это a,h,t или b; 2 — q,p,o,g; 3 — l,s,d,x и т.д.
таким образом можно зашифровать число 322 — 64я способами (например sqp, s-3,q-2,p-2)
Алгоритм расшифровки: (для трехзначных чисел)
function decrypt (var num:string):int{
var ones = num.charAt(num.length-1)
var tens = num.charAt(num.length-2)
var thousands = num.charAt(num.length-3)
return (decryptOne(ones) + decryptOne(tens)*10 + decryptOne(thousands)*1000);
}
function decryptOne (var digit:string):int{
if (digit == a || h || t || b){
return (1);
} else if (digit == q || p || o || g){
return (2);
} else…
}
К примеру. :)
Дело в том, что все обфускаторы не только переименовывают названия классов, переменных, лейблов итд, но и переименовывают в спецсимволы, на которые компилятор будет ругаться. Избавиться от этого легко, в джаве, например декомпиляторы в этом случае просто переименовывают переменные и классы в произвольные имена типа cla1, cla2, a1, a2, a4. Это конечно не добавляет читаемости коду, но и не мучает компилятор.
Таким образом — если ваша игра просто обфусцирована — то пересобрать ее, вырезав вашу рекламу и вставив свою — точно так-же просто как и без обфускации. Итд итп, как я писал выше. Единственно что будет сложно делать — пользоваться вашим кодом как движком, ибо нифига непонятно будет что зачем. А вот сделать рипофф со сменяной чуток графикой — не проблема.
Поэтому, рассматривать надо только тулзы, которые в дополнение к обфускации еще и работают с байткодом. secureSWF, например так корежит байткод, что иногда может и поломать игру :) Хорошо что у них предусмотрен гибкий и многогранный способ быстро находить проблемы и их решать. Зато — известные на данный момент декомпиляторы просто валятся с ошибками в винду, пытаясь декомпилировать эту срань :)
Ну и дополнительные фичи — тоже хороши — доп. оптимизация байткода, дополнительное ужимание флешки итд.
и да, OBFU и его цену тоже привел здесь как некий курьёз, ну или как загадочное явление, суть которого мне пока не понятна. )
то что лидирует сейчас secureSWF, уже довольно очевидно, жаль только что их ценообразование версий построено так, что никакие другие версии кроме Pro покупать
не trueне интересно, т.к. оптимизация кода, шифрование строковых литералов, зашифрованный сайтлок и создание шифрованного загрузчика — уж слишком вкусные фичи, чтобы от них отказываться. а это 400$ — не такая уж и малая сумма для еще не раскрутившегося indi особенно.а вообще интересно, использует ли кто-нибудь другие способы защиты, кроме тех, что предоставляют те или иные тулзы, ну и стандартных сайтлоков конечно. понятно что в случае того же secureSWF многие возможные способы уже покрыты, но все же.
Это как сигнализация автомобилей — известные вскрываются. Точнее все. А можно капкан на педаль самому поставить :)
Но на самом деле, это все не нужно — главная задача усложнить максимально задачу хакеру минимальными усилиями. Чтобы было тупо нудно возиться. Ддя этого думаю secureSWF пока хватит.
А у меня да, есть двойная подляна жуткая, но я вот ее не встраиваю, ибо уже это мне самому гемор — надо обфускировать, потом тулзами разбирать, менять ручками, собирать обратно.
Отличная защита, но иногда как говорил scmorr ломает игру особенно при максимальных настройках, приходится каждый раз хорошенько тестировать.
надо завести привычку постить сюда новости о всяких таких акциях, а то иногда уйдешь с головой в проект (мы например зимой писали/релизили социалку и на FGL, я тогда даже и не был ни разу по моему) и пропустишь всё.
без злового умысла, просто мне интересно, как программируют другие!
И из нескольких игр, который я декомпилил, ни одной не встречал, где эти методы используют.
может мне так везло)
Если игра хитовая — она успевает собирает собрать максимум бабла и аудитории, которая будет советовать друзьям (поиграть на таком-то портале, купить).
Если защита держится дольше недели, то и вирусная версия (если таковая выпускается) разойдется по порталам тоже не ломанная.
Остальные обычно левые поделки, чаще всего от одних и тех же авторов.
Они мало того что защиты реальной не дают, так еще и чаще всего авторы на соседнем домене тут же продают «декриптор».
Где то читал в блогах, что человек специально делал «контрольную» закупку. Юр. лицо (LLC или PLC) в счетах фигурировало одно и тоже.
Это из той же оперы что и «антивирусы» за 20 баксов, которые вообще ничего не делают, только анимацию «лечения» показывают.
Просто менее агрессивные и даже что-то делающие :)
В принципе, если бы я защищал свою игру, я бы сделал следующим образом:
1. Зашить урлок в «глубину сибирских руд». В какой нибудь обработчик партиклов или в несколько. Как только понимаем, что версия ворованная — начинаем «портить» битмапы, переменные, выбрасывать сообщения и т.д.
2. Обфусцировать код. Кстати, задача сводится к парсингу исходников, что вполне можно сделать самому.
3. Сделать несколько уровней вложенности. Прелоадер загружает массив байтов, расшифровывает, превращает в «мувиклип», который загружает массив байтов и т.д.
Вот это я даже примерно не знаю, как реализовать. Именно превращение массива байтов в «мувиклип», но наверняка это возможно.
Также, чтобы не облегчать задачу взломщику, можно каждый уровень/экран сделать отдельным «мувиклипом», который расшифровывается при показе и содержит собственную проверку на урлок.
Вообще, можно наворотить страшную штуку :)
есть ещё мысли как-нибудь использовать возможности и особенности уже упомянутого выше haXe, как компилятора так и его специфических API, но это тоже пока больше теория, которая требует доп. времени на проверку.
Ну а на практике, судя и по комментариям здесь (спасиб всем, кстати) для серьезных проектов нужно брать SecureSWF и не париться.
… а для быстрого и дешевого осложнения понимания мелких проектов и каких-нибудь альфа-версий школотой наверное можно взять и бесплатный SOB и дополнить его парой мелких гадостей от себя.
оного, кстати, тоже по быстрому попробовал на паре swf. для одного подошла такая вот команда:
это по умолчанию — включены все флаги, так что он карежит все имена, что может и даже размер файла несколько уменьшает вследствии. в ignore.txt перечисляются исключения, в renames.txt он пишет все что поменял.
второй проект (посложнее) с ней запускаться не стал и выискивать все траблы в renames.txt мне было уже лень и так что пришлось включить только три из четырех флагов с помощью --obfuscate-mask:
но даже максимальная защита ломается. Вот такой он флешь… Обнаружил на одном из порталов хакнутую версию своей игры ,(
это блин сложно сделать и с исходным кодом под рукой ,))) фиг знает как они разобрались…
На каких настройках ты секуресвфом проходил игру? На агрессивных?