Создано: 20 декабря 2015 11:41 New! Цитата · Личное сообщение · #1
Доброго времени суток! Ковыряю игрушку Exmortis 3 Используется свой плеер и дополнительные флэшевые "обёртки", причём всё это намертво интегрировано с самой игрой - разделить вряд ли получится. Реверснул алгоритм шифрования флэшки (чтобы можно было реплейсить флэшку в плеере), вытащил, разбираю активацию.
this.dispatchEvent(new Event(Event.CHANGE)); // вот пока этот вызов не сработает, "MsgVerificationWait" продолжит висеть
}
Чтобы много не парить мозги, я пошёл в com.fizzy.net.remoting.FizzyServices и в функциях checkActivation и checkRefund вместо запросов вставил код this.dispatcher.dispatchEvent(new Event(Event.COMPLETE)); По идее, это должно вызвать обработчик с нужным кодом сообщения, и все будут счастливы.
Но это почему-то не работает... При попытке активировать любым кодом игра просто висит с сообщением "MsgVerificationWait". Где я ошибся?
Создано: 20 декабря 2015 16:33 · Поправил: 20 декабря 2015 16:34 4kusNick New! Цитата · Личное сообщение · #2
Если оно в итоге через Flash Player проигрывается, я бы поставил \ подсунул отладочную версию и смотрел в логи трейсов - не падает ли оно где-то из-за патча.
Затем я бы в методе checkActivationResult оставил бы код
Code:
this._activated =true;
this.generateDemoCodes(); // это надо бы ещё проверить что там внутри, надо ли оно вообще или нет
log("Activated: "+this._activated);
this.saveActivation();
this.dispatchEvent(new Event(Event.CHANGE));
log("Event sent"); // либо trace("Event sent")
Чтобы выполнились все действия как при обычной активации. И в конце добавил бы log или trace чтобы удостовериться что код выполнился до конца без ошибок. Если они используют для проигрывания не Flash Player а что-то своё и там нет трейсов - то я бы посмотрел куда сбрасывает данные их log() и при необходимости включил бы его, если он отключен, чтобы можно было оставлять для себя логи.
Создано: 21 декабря 2015 00:24 · Поправил: 21 декабря 2015 00:49 JohnyDoe New! Цитата · Личное сообщение · #3
Мне кажется не надо париться с активациями. Достаточно будет _activated проинициализировать и в соответствии с логикой потереть код, который отвечает за всяческие проверки. Там обфускации нет - все не так уж и сложно должно быть.
Вариант от 4kusNick вполне годится, если не охота тереть лишний код. Можно еще весь этот код перенести прямо в метод activate и не запускать активацию вообще.
Создано: 21 декабря 2015 01:32 New! Цитата · Личное сообщение · #4
Ну я понимаю, что проще поменять код везде где только можно, но хочется красивого и аккуратного решения.
Основной вопрос был не сколько о том, как именно её взломать, а больше о том, почему я не наблюдаю ожидаемого эффекта. С этой ошибкой я уже разобрался - глупо, но я абсолютно не обратил внимание на проверку this.remoteService.result в обработчиках событий. Выяснить удалось только после того как функцию log перенаправил на wrapperLog - сброс лога в отдельный файл.
Таким образом, финальный патч для com.fizzy.net.remoting.FizzyServices::checkActivation и checkRefund стал таким:
Code:
this._result =true;
this.dispatchEvent(new Event(Event.COMPLETE));
В результате активация проходит, но в процессе до сих пор нарушается очередь событий. Судя по всему, обработчик Event.COMPLETE вызывается раньше, чем происходит возврат из вызова applicationData.activate (нет задержки интернет-соединения). Из-за этого, экран с сообщением об удачной регистрации оказывается перекрыт всё тем же окном "MsgVerificationWait". Плюнул и перенёс вызов, вешающий окно, на одну строчку выше
Создано: 21 декабря 2015 12:15 New! Цитата · Личное сообщение · #5
С логами всегда проще. Если не идет процесс, то надо искать как бы посмотреть лог.
Окно "MsgVerificationWait" выводит в конце какой-то результат или просто закрывается? А то его можно было бы вообще не выводить. С другой стороны, будет не понятно произошло ли что-то вообще после нажатия на кнопку активации.
Создано: 21 декабря 2015 13:25 New! Цитата · Личное сообщение · #6
JohnyDoe пишет: Окно "MsgVerificationWait" выводит в конце какой-то результат или просто закрывается нет, это просто информационное окно - типа, подождите. Но тут судя по всему просто баг, который никто не поймал - неправильный порядок выполнения, может нормально работать только за счёт задержки интернета.
Добавил еще строки с серийником и номером активации в инициализацию ApplicationData - большше не нужно ничего вводить, игра изначально считает себя зарегистрированной. Кажется, всё...
Создано: 21 декабря 2015 14:07 New! Цитата · Личное сообщение · #7
Возможно будет интересно. Самый простой путь из всех - взять флешку с сайта(та что демо), изменить basepath, положить файлы из инсталлятора рядом в директорию assets и поиграться с методом isDemo. В итоге получаем полную версию игры с возможностью запуска через стандартный flash player. Теперь можно считать, что вопрос рассмотрен всесторонне
Создано: 21 декабря 2015 14:59 · Поправил: 21 декабря 2015 15:17 -=AkaBOSS=- New! Цитата · Личное сообщение · #8
С эксмортисом вопрос можно считать решённым.. Полную флэш версию возможно рассмотрю чуть позднее, пока и так работает)
Возился недавно еще с одной игрой - simian.interface, но так до конца и не довёл. Цель исследования - сделать полную оффлайновую версию. Игра в процессе выполнения подгружает семь музыкальных треков и одно изображение - я пытаюсь их вшить внутрь, чтобы ничего лишнего не болталось.
C изображением проще всего - подключил как ByteArray, а в конструкторе game.levels.GlitchmapBackground вместо loadImage
Создано: 21 декабря 2015 17:28 · Поправил: 22 декабря 2015 03:13 -=AkaBOSS=- New! Цитата · Личное сообщение · #10
Переделал функцию loadMusic - теперь в качестве первого аргумента она принимает Class, и передаёт его первым же аргументом в playMusic. Ну и соответствующим образом изменил вызовы - вместо строк с названиями передаются классы SoundAsset. Всё отлично, но поначалу не играло из-за выключенного звука в опциях.
JohnyDoe пишет: GlitchmapBackground_ImgGradientGreen это какой-то класс? ну я посмотрел как в других местах сделано, пошаманил с rabcdasmом и получилось такое:
Code:
package game.levels {
import mx.core.ByteArrayAsset;
public class GlitchmapBackground_ImgGradientGreen extends ByteArrayAsset {
public function GlitchmapBackground_ImgGradientGreen() {
super();
}
}
}
Плюс внёс соответствующие изменения в SymbolClass и ExportAssets, и добавил нужное изображение как binaryData.
создаю объект так:
Code:
this.glitchmap.bytesSource =new GlitchmapBackground_ImgGradientGreen() as ByteArray;
в момент использования (после 6го уровня) отладочный плеер выдаёт ошибку: ReferenceError: Error #1069: Property ::glitchmap not found on game.levels.GlitchmapBackground and there is no default value. at game.levels::GlitchmapBackground()
Последний глюк оказался вызван тем, что rabcdasm не очень хорошо понимает неймспейсы, скопированные из ffdec. Вместо строчки getproperty QName(PrivateNamespace(null,"30"),"glitchmap") вставил getproperty QName(PrivateNamespace(null, "game.levels:GlitchmapBackground/instance"), "glitchmap")
теперь всё работает) если кому-то интересно глянуть на результат - залил