В этом руководстве я расскажу как можно изменять код swf игры.
Статья расчитана не на всех, в основном для профи, которые хоть немного, но знакомы с программированием и с самим Flash'ом и ActionScript'ом. Способ не нова, вобще возможность изменять байт-код flash файла давно известна, но ограниченному кругу людей. Я расширю этот круг и дам некоторое описание данного способа редактирования кода.
Программы, нужные нам для работы: [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ]
Предисловие
Sothink SWF Decompiler позволяет нам декомпилировать flash файлы, просматривать код и другие объекты(картинки, MovieClip'ы, звуки и т.д.). Нам он нужен будет только для изучения кода игры.
Минусы: иногда дает сбой при декомпилировании *.as файла и просто вылетает, тогда остается изучать и редактировать код через Flash Scalpel; платный, хотя найти ключ вроде не такая проблема.
Flash Scalpel позволяет редактировать байт-код flash файла. Через него мы будет редактировать код для взлома. Эту программу написал Admin сайта forum333.com на основе RABCDASM и добавил к нему редактор для просмотра и редактирования кода, аналогия MiDIDE.
Минусы: не нашел пока что.
ASDec позволяет просматривать код в AS2/3, а так же редактировать байт-код flash файла. Т.е. можно сказать так ASDec = Sothink SWF Decompiler + Flash Scalpel.
Минусы: так же как и Sothink SWF Decompiler может дать сбой при декомпиляции кода, и тогда вы не сможете просмотреть и отредактировать код, и останется только Flash Scalpel.
AVM2(ActionScript Virtual Machine 2) - виртуальная машина Flash Player'а, которая выполняет байт-код swf файла.
Разбирать будем мою flash игру, которую я делал на конкурс нашего одного института, и на это есть весомые причины:
1) Я очень зол на то, что мы заняли 3-е место, нас обогнали 2 игры: "Крестики-нолики" 2-е место, "Жизнь студента" 1-ое место. Не знаю по каким критериям оценивали игры, может даже по количеству человек работавших над игрой. Над нашей работал я и 2 моих одноклассники, над "К.-н." и "Ж. с." работало по 1-му человеку.
2) Раз уж я делал(я писал код, а друзья работали над дизайном) эту игру, то и мне лучше знать все слабые для взлома места в коде.
Пока что нам понадобятся: Sothink SWF Decompiler и Flash Scalpel.
Изучаем "пациента"
Прежде чем ринуться ломать игру, нужно ее как-то изучить. Изучение игры один из сложных задач перед взломо, нужно определить слабые места приложения. Ну, а если приложения представляет из себя целый проект связанных между собой swf файлов, то это задача усложниться.
Сейчас ничего сложного не будет, потому что объяснять уязвимости своей игры буду я.
Ссылка на мою игру: [Ссылки могут видеть только зарегистрированные пользователи. ]
Начнем с разбора класса player.as. Откройте мою игру через Sothink SWF Decompiler. Раскройте директорию Actions в верхнем-правом углу и выберите файл player.
[Ссылки могут видеть только зарегистрированные пользователи. ]
Код:
public var delayConst:uint = 50; // число максимальной задержки между выстрелами
public var delayAt:uint = 50; // текущие число задержки для выстрела, когда delayAt==delayConst можно стрелять
public var typeLaser:uint = 1; // тип лазера, максимум у меня 6
public var speedLaser:uint = 5; // скорость полета лазера
public var strength:int = 50; // текущая прочность
public var strengthMax:uint = 50; // максимальная прочность
public var speedX:int = 10; // скорость полета вперед-назад(по экрану влево и вправо)
public var speedY:int = 0; // текущая скорость полете в боковые стороны(по экрану вверх и вниз)
public var speedYCon:uint = 30; // максимальная скорость в боковые стороны
Если изменить значение:
- delayConst и delayAt на меньшее число, можно добиться хорошей скорострельности лазером;
- typeLaser на 6, можно будет использовать максимальный лазер в игре(урон будет равен typeLaser*10);
- speedLaser на 8(к примеру), то лазер будет лететь быстрее, но советую слишком большое значение не ставить, иначе лазер пролетит сквозь врага;
- strength и strengthMax на любое большое значение(но не превосходящие максимального значение Integer), можно будет иметь хорошу прочность корабля;
- speedX и speedYCon на любое значение(но не слишком большое, чтобы не улететь за экран), то корабль будет лететь с такой скоростью с какой вы зададите.
Следующим на очереди будет класс enemies(врагов).
Код:
public var score:uint = 0; // Значения всех переменных
public var speed:uint = 3; // изменять бесполезно
public var strength:int = 10; // при создание каждого врага
public var typeLaser:uint = 1; // я их корректирую
public var delayAtack:uint = 100;
public var delayAtCon:uint = 100;
В игре есть враги, которые летят на игрока и стреляют лазером в его сторону. Для них действует код внутри if(exat){..}, позволяющий по тригонометрической формуле поворачиваться в сторону другого объекта.
Команды типа:
e.target.rotation = e.target.rotation +/- 0.3;
позволяют плавно поворачивать врага к кораблю игрока. Если их изменить на:
e.target.rotation = e.target.rotation;
или вобще удалить, то эти "особые" враги будут лететь вперед как и все остальные.
Класс upgrade, который содержит логику для апгрейда частей корабля.
this.buy = [..] - массив, который содержит число ресурсов и денег требуемых для апгрейда, а так же число на которое нужно повысить. Разбирать его и этот класс не будем, поэтому оставляю это удовольствие вам.
Ну и на последок разберем класс border_dead, в нем нас будет интересовать подсчет очков для рекордов.
В total записываются очки за убийства, деньги и ресурсы, а так же вычетаются промахи:
[Ссылки могут видеть только зарегистрированные пользователи. ]
Выберите строчку с названием "000" и нажмите кнопку "dissasembler", после у вас заполнится список файлами *.class.asasm и *.script.asasm.
[Ссылки могут видеть только зарегистрированные пользователи. ]
Найдите в списке файл player.class.asasm и нажмите кнопку "Edit File".
[Ссылки могут видеть только зарегистрированные пользователи. ]
Находим там такие строчки кода:
Код:
trait slot QName(PackageNamespace(""), "delayConst") type QName(PackageNamespace(""), "uint") value Integer(50) end
trait slot QName(PackageNamespace(""), "delayAt") type QName(PackageNamespace(""), "uint") value Integer(50) end
trait slot QName(PackageNamespace(""), "typeLaser") type QName(PackageNamespace(""), "uint") value Integer(1) end
trait slot QName(PackageNamespace(""), "speedLaser") type QName(PackageNamespace(""), "uint") value Integer(5) end
trait slot QName(PackageNamespace(""), "strength") type QName(PackageNamespace(""), "int") value Integer(50) end
trait slot QName(PackageNamespace(""), "strengthMax") type QName(PackageNamespace(""), "uint") value Integer(50) end
trait slot QName(PackageNamespace(""), "speedX") type QName(PackageNamespace(""), "int") value Integer(10) end
trait slot QName(PackageNamespace(""), "speedY") type QName(PackageNamespace(""), "int") value Integer(0) end
trait slot QName(PackageNamespace(""), "speedYCon") type QName(PackageNamespace(""), "uint") value Integer(30) end
Так на языке ассемблера(код выше) выглядит, вот этот код в декомпиляторе:
Код:
public var delayConst:uint = 50;
public var delayAt:uint = 50;
public var typeLaser:uint = 1;
public var speedLaser:uint = 5;
public var strength:int = 50;
public var strengthMax:uint = 50;
public var speedX:int = 10;
public var speedY:int = 0;
public var speedYCon:uint = 30;
Отредактируем значения по-умолчанию и получим примерно такой код:
Код:
trait slot QName(PackageNamespace(""), "delayConst") type QName(PackageNamespace(""), "uint") value Integer(10) end
trait slot QName(PackageNamespace(""), "delayAt") type QName(PackageNamespace(""), "uint") value Integer(10) end
trait slot QName(PackageNamespace(""), "typeLaser") type QName(PackageNamespace(""), "uint") value Integer(6) end
trait slot QName(PackageNamespace(""), "speedLaser") type QName(PackageNamespace(""), "uint") value Integer(8) end
trait slot QName(PackageNamespace(""), "strength") type QName(PackageNamespace(""), "int") value Integer(5000) end
trait slot QName(PackageNamespace(""), "strengthMax") type QName(PackageNamespace(""), "uint") value Integer(5000) end
trait slot QName(PackageNamespace(""), "speedX") type QName(PackageNamespace(""), "int") value Integer(20) end
trait slot QName(PackageNamespace(""), "speedY") type QName(PackageNamespace(""), "int") value Integer(0) end
trait slot QName(PackageNamespace(""), "speedYCon") type QName(PackageNamespace(""), "uint") value Integer(40) end
Сохраним файл(Ctrl+S) и закроем окно "asasm Editor".
Найдем теперь в списке файл player.class.asasm и откроем его для редактирования. Быстро пробегаемся по строчкам кода и... ненаходим структуру команд для поворота врага в сторону нашего корабля.
Нас интересует это - newfunction "enemies/iinit/inline_method", а точнее адрес до описания тела функции. Пришла пора увидеться кучу файлов кода, рядом с файлом игры(там, где вы ее распаковали) должна появится папочка "abc_0". В ней у нас хранятся файлы *.class.asasm и *.script.asasm. Бывает так, что все файлы не помещаются в список, поэтому их можно найти и здесь.
Откройте эту папку "abc_0".
[Ссылки могут видеть только зарегистрированные пользователи. ]
Продолжаем поиск функции поворота врага: открываем директорию "enemies/iinit", там должен быть один файл "inline_method.method.asasm".
[Ссылки могут видеть только зарегистрированные пользователи. ]
Вернитесь к "asasm Editor" и откройте этот файл "inline_method.method.asasm" File -> Open File.
Находим в этом коде целых 6 команд:
Код:
pushdouble 0.3
И меняем их все на:
Код:
pushdouble 0.0
Все, можно сохранять этот файл и закрывать "asasm Editor".
На последок открываем border_dead.class.asasm. Нужно найти такие строки в коде:
pushbyte 3 // ложим число 3
multiply // умножаем на него
add // и прибавляем
pushbyte 2 // ложим число 2
multiply // умножаем на него
subtract // и вычетаем
Давайте сделаем, чтобы у нас очки за промахи не вычитались, а наооборот прибавлялись - меняем команду subtract на add.
Кстати, вы можете прочитать справку про многие команды ассемблера, для этого достаточно выделить нужную команду и нажать F1. К примеру так выглядит пояснение к команде subtract.
[Ссылки могут видеть только зарегистрированные пользователи. ]
Сохраняем файл так же, как это делали уже несколько раз. "asasm Editor" тоже можете закрыть.
Теперь надо бы все собрать весь код и упаковать в один файл *.swf.
Нажимаем кнопку "assembler" и смотрим в лог.
[Ссылки могут видеть только зарегистрированные пользователи. ]
Если у вас будет написано "Assembler abc_0: Ok", значит вы не допустили ни одной грубой ошибки и компилятор успешно все скомпоновал. Теперь сохраните файл File -> Save swf.
Если решили использовать только ASDec, то вам для редактирования байт-кода нужно будет кликать в область декомпилированного кода, редактировать байт-код и нажать кнопку "Save trait". Дизассемблированный код выглядит в этой программе немного по-другому. Вот пример для изменения значения переменной:
[Ссылки могут видеть только зарегистрированные пользователи. ]
Сохраняем swf файл File -> Save.
Практика и еще раз практика
Есть еще один хороший способ изучения байт-кода AVM2. Пишем, к примеру на FlashDevelop, простой код на AS3 и компилируем свою flash'ку. А дальше открываем через дизассемблер и изучаем код, можно и попробывать его немного отредактировать.
Дополнительная литература:
[Ссылки могут видеть только зарегистрированные пользователи. ]
[Ссылки могут видеть только зарегистрированные пользователи. ] (это то, что во Flash scalpel -> Help)
[Ссылки могут видеть только зарегистрированные пользователи. ]
[Ссылки могут видеть только зарегистрированные пользователи. ]
А что дальше?
Нужно подменить оригинальный *.swf файл на наш измененный. К примеру для этого подойдут такие программы:
- Charles (через Map local)
- HandyCache (просто заменить файл в папке с кешем и выставить галочку в трее "Использовать кеш")
Спасибо за внимание, надеюсь урок был полезен.
(#): [Ссылки могут видеть только зарегистрированные пользователи. ]
[Ссылки могут видеть только зарегистрированные пользователи. ]
Последний раз редактировалось Ilya112; 09.02.2013 в 06:51.
Значит можно ломануть вот эту игру [Ссылки могут видеть только зарегистрированные пользователи. ] Там как раз SWF пакеты. А ну хацкеры попробуйте взломать.
Значит можно ломануть вот эту игру [Ссылки могут видеть только зарегистрированные пользователи. ] Там как раз SWF пакеты. А ну хацкеры попробуйте взломать.
есел разобраца в акшенскрипте то очень даже можно, но есть шанс что игра построенна не на акшен скрипте, вот тут плохо
________________
Помог, жми на спасибо!
Неможеш, на плюсик около авки!
Неполучается, ну что поделать
Всё читать не стал,но глазами пробежался, от сюда вопрос - зачем?) Я конечно понимаю, что всё будет круто если мы в исходниках поменяем всё "как надо", а дальше что?) Мы то меняем код приложение на компе, а не то, что висит вк и залить мы его не сможем.
Толи я что-то важное в тексте пропустил, толи тема и правда бесполезна)
________________ На жуке не сижу, в л2 не играю, приложения не взламываю, софт больше не пишу.. Работаю
Всё читать не стал,но глазами пробежался, от сюда вопрос - зачем?) Я конечно понимаю, что всё будет круто если мы в исходниках поменяем всё "как надо", а дальше что?) Мы то меняем код приложение на компе, а не то, что висит вк и залить мы его не сможем.
Толи я что-то важное в тексте пропустил, толи тема и правда бесполезна)
Когда приложения(игры) построены на экшн, можно с успехом ее ломануть, но сейчас мало кто такие игры делает.Например ДО или ТО взломать ты не сможешь, так как движок у игры другой.И да, если холд. сервак - тогда тоже.
Всё читать не стал,но глазами пробежался, от сюда вопрос - зачем?) Я конечно понимаю, что всё будет круто если мы в исходниках поменяем всё "как надо", а дальше что?) Мы то меняем код приложение на компе, а не то, что висит вк и залить мы его не сможем.
Толи я что-то важное в тексте пропустил, толи тема и правда бесполезна)
Если хватит терпения и умения можно любую игру сделать, что бы она работала локально или на крайняк на своём хостинге. Под словом локально подразумевается, что флеш будет стартовать из самодельной html`ки, но все запросы будут идти к игровому серверу.
Можно из флешки игры сделать бота, опять же если хватит терпения))
Всё читать не стал,но глазами пробежался, от сюда вопрос - зачем?) Я конечно понимаю, что всё будет круто если мы в исходниках поменяем всё "как надо", а дальше что?) Мы то меняем код приложение на компе, а не то, что висит вк и залить мы его не сможем.
Толи я что-то важное в тексте пропустил, толи тема и правда бесполезна)
А подменить через Charles или через HandyCache не судьба, я так для Танков Онлайн делал?
UPD: ну раз про это никто не знает, добавил в уроке.
Последний раз редактировалось Ilya112; 07.04.2012 в 18:00.
Ломаните эту игру хацкири [Ссылки могут видеть только зарегистрированные пользователи. ]
Только что утром ломал, во время вылазки против зомби можно поймать пакет [Ссылки могут видеть только зарегистрированные пользователи. ], там будут деньги и опыт за убийство зомби. Ставим сколько хотим, во время игры можно будет шмотку купить и одеть, действует пока вы в миссии, на сервере не сохраняется.
Прохождение осуществляется через запросы к серверу с подписями, так что можно было бы и бота написать.
________________
[Ссылки могут видеть только зарегистрированные пользователи. ]