Каков наилучший способ остановить людей, взламывающих таблицу рекордов на основе PHP во Flash-игре? - PullRequest
212 голосов
/ 16 сентября 2008

Я говорю об экшн-игре без верхнего предела очков и без возможности проверить счет на сервере, воспроизводя ходы и т. Д.

Что мне действительно нужно, так это самое сильное шифрование, возможное во Flash / PHP, и способ запретить людям вызывать страницу PHP иначе, чем через мой файл Flash. В прошлом я пробовал несколько простых методов: сделать несколько вызовов для одного счета, завершить последовательность контрольных сумм / фибоначчи и т. Д., А также запутать SWF с помощью Amayeta SWF Encrypt, но в конечном итоге все они были взломаны.

Благодаря ответам StackOverflow я нашел больше информации от Adobe - http://www.adobe.com/devnet/flashplayer/articles/secure_swf_apps_12.html и https://github.com/mikechambers/as3corelib - которую, я думаю, я могу использовать для шифрования. Не уверен, что это поможет мне освоить CheatEngine.

Мне нужно знать лучшие решения для AS2 и AS3, если они разные.

Основными проблемами, по-видимому, являются такие вещи, как заголовки TamperData и LiveHTTP, но я понимаю, что есть и более продвинутые хакерские инструменты - такие как CheatEngine (спасибо Mark Webster)

Ответы [ 18 ]

2 голосов
/ 18 января 2012

Я думаю, что самым простым способом было бы вызывать такую ​​функцию, как RegisterScore (оценка), каждый раз, когда игра регистрирует добавляемый счет, а затем кодирует его, упаковывает и отправляет в скрипт php в виде строки. PHP-скрипт знает, как правильно его декодировать. Это остановит любые вызовы прямо в скрипт php, так как любая попытка форсировать счет приведет к ошибке распаковки.

2 голосов
/ 05 января 2010

Способ, которым пользуется новый популярный аркадный мод, заключается в том, что он отправляет данные из флэш-памяти в php, обратно во флэш-память (или перезагружает их), а затем обратно в php. Это позволяет вам делать все, что вы хотите, чтобы сравнить данные, а также обходить пост-данные / дешифрование и т.п. Один из способов сделать это - назначить 2 рандомизированных значения из php во флэш-память (которую вы не можете получить или увидеть, даже если вы запускаете флэш-захват в реальном времени), используя математическую формулу для сложения оценки со случайными значениями, а затем проверяя ее та же самая формула, чтобы обратить это, чтобы видеть, соответствует ли счет этому, когда это наконец идет к php в конце. Эти случайные значения никогда не видны, также как и время транзакции, и если она длится более пары секунд, она также помечает ее как мошенничество, потому что предполагает, что вы остановили отправку, чтобы попытаться выяснить случайные значения или выполнить числа через некоторый тип шифра для возврата возможных случайных значений для сравнения со значением оценки.

Это кажется довольно хорошим решением, если вы спросите меня, кто-нибудь видит какие-либо проблемы с использованием этого метода? Или возможные способы обойти это?

2 голосов
/ 16 сентября 2008

Вы говорите о том, что называется проблемой доверия клиентов. Поскольку клиент (за эти деньги SWF работает в браузере) делает то, для чего он предназначен. Сохранить высокий балл.

Проблема заключается в том, что вы хотите убедиться, что запросы «сохранить счет» исходят из вашего флэш-фильма, а не какой-то произвольный HTTP-запрос. Возможным решением для этого является кодирование токена, сгенерированного сервером, в SWF-файл во время запроса (с использованием flasm ), который должен сопровождать запрос для сохранения высокой оценки. Когда сервер сохраняет этот счет, срок действия токена истекает и он больше не может использоваться для запросов.

Недостатком этого является то, что пользователь сможет отправить только один высокий балл за загрузку флэш-фильма - вы должны заставить его обновить / перезагрузить SWF, прежде чем они смогут снова играть для нового счета.

2 голосов
/ 16 сентября 2008

Невозможно сделать его полностью не взломанным, поскольку легко декомпилировать SWF-файлы, и опытный хакер-разработчик сможет затем проследить ваш код и выяснить, как обойти любую зашифрованную систему, которую вы можете использовать.

Если вы просто хотите прекратить обманывать детей с помощью простых инструментов, таких как TamperData, вы можете сгенерировать ключ шифрования, который вы передадите SWF при запуске. Затем используйте что-то вроде http://code.google.com/p/as3crypto/, чтобы зашифровать рекорд, прежде чем передавать его обратно в код PHP. Затем расшифруйте его на стороне сервера перед сохранением в базе данных.

2 голосов
/ 16 сентября 2008

Всякий раз, когда ваша система рекордов основана на том факте, что приложение Flash отправляет незашифрованные / неподписанные данные рекордов через сеть, которые могут быть перехвачены и обработаны / воспроизведены. Ответ следует из этого: зашифровать (прилично!) Или криптографически подписать рекордные данные. Это, по крайней мере, затрудняет взломать вашу систему рекордов, потому что им нужно будет извлечь секретный ключ из вашего SWF-файла. Многие люди, вероятно, сдадутся прямо там. С другой стороны, все, что нужно, это один человек, который извлечет ключ и отправит его куда-нибудь.

Реальные решения предполагают более тесную связь между приложением Flash и базой данных рекордов, так что последние могут проверить, является ли данная оценка несколько реалистичной. Это, вероятно, сложно в зависимости от того, какая у вас игра.

2 голосов
/ 05 января 2009

Обычно я включаю «данные о призраках» игрового сеанса в запись рекорда. Поэтому, если я делаю гоночную игру, я включаю данные воспроизведения. У вас часто есть данные для воспроизведения уже для функции воспроизведения или для функции призрачных гонок (игра против вашей последней расы или игра против призрака парня № 14 в таблице лидеров).

Проверка их является очень ручным трудом, но если цель состоит в том, чтобы проверить, являются ли первые 10 записей в конкурсе законными, это может быть полезным дополнением к арсеналу мер безопасности, на которые уже указывали другие.

Если цель состоит в том, чтобы держать список рекордов онлайн до конца времени, чтобы никто не смотрел на них, это не принесет вам много пользы.

1 голос
/ 14 мая 2014

Может быть хорошей идеей для связи с бэкэндом через AMFPHP . Это должно препятствовать, по крайней мере, ленивым пытаться протолкнуть результаты через консоль браузера.

1 голос
/ 16 сентября 2008

На самом деле невозможно достичь того, чего вы хотите. Внутренние части приложения Flash всегда частично доступны, особенно если вы знаете, как использовать такие вещи, как CheatEngine , то есть независимо от того, насколько безопасны соединения вашего веб-сайта и браузера <-> сервера, оно все равно будет сравнительно легко преодолеть.

...