Jump to content

Немного об оптимизации / защите


Recommended Posts

Добрый день. Хочу задать несколько вопросов:

1) Каждый раз, когда я вызываю setElementData на стороне клиента, в дебаг вылезает ошибка из админ панели что-то про "Admin security mismatch". Я порылся в исходниках админки, но так и не допер, о чем вообще предупреждает данное сообщение и стоит ли в таком случае использовать функцию на стороне клиента? Если нет, зачем тогда вообще сделали эту функцию исполняемой на стороне клиента, если она вызывает какие-то несоответствия данных между клиентом и сервером? Кстати, некоторые ресурсы, например скрипт парашюта, так же заставляет появиться в дебаге сие сообщение.

1.1) Если по вопросу номер 1 нет нареканий, то тогда такой вопрос: разумно ли использовать setElementData внутри onClientRender для постоянного обновления данных игрока при включенной синхронизации этих данных с сервером (последний параметр функции) ? И еще, если скажем так, человек 50 будут постоянно обновлять свои данные, в каком размере получается нагрузка на сервер и стоит ли вообще идти тогда таким путем?

2) Это конечно хорошо, что МТА обретает популярность, но вот загвоздка: мне посчастливилось встретить двух человек, которые с помощью CheatEngine (вроде бы) смогли каким-то образом изменить свою скорость игры. Персонажи их носились как со спидхаком, а все таймеры на стороне клиента шли в 10 раз быстрее, ну а о последствиях не сложно догадаться. Означает ли это, что так можно вызвать практически любую клиентскую функцию? По сути, ни о какой защите в таком случае и речи быть не может, раз можно докапаться до внутренностей через представленный выше софт... ?

Пока вроде все.

Link to comment

1 - на стороне клиента эта функция очень полезна, когда не синхришь ее работу с сервом. Ну а в МТА же система прав доступа на всё. Тебе говорит, что это действие запрещено. Хотя скрины и фактические логи бы прояснили ситуацию куда лучше.

2 - не надо так делать, огромный провал в производительности и весь канал забьется

3 - ты всегда можешь проверить скорость игры клиента, если это нужно. И написать античит в МТА с такими проверками не составит труда. МТА сам умеет менять/узнавать скорость игры клиента.

Link to comment
3 - ты всегда можешь проверить скорость игры клиента, если это нужно. И написать античит в МТА с такими проверками не составит труда. МТА сам умеет менять/узнавать скорость игры клиента.

Ах да, одну вещь я забыл упомянуть. Способ с getGameSpeed я проверил сразу же, как только заметил, что кто-то балуется со скоростью, да только это ничего не дало: функция все время возвращала 1, то есть тут дело не в скорости игры, а, как бы сказать, в быстродействии что ли...

Link to comment

Могу только сказать, что если у тебя есть такая программа, которая может вытворять такое в МТА, можешь поделиться ей с разработчиками, которые могут придумать решение этой проблемы. Хотя бы lil Toady покажи.

Также можно проверить скорость движения игрока при скорости 1x игры. Если у игрока скорость игры 1x, а он перемещается без джета или тачки с большой скоростью, это возможно чит (хотя игрок может просто стоять на транспорте или объекте, который двигается, хотя это все тоже мона проверить). Проверки скорости движения тачки тоже могут показать, что игрок жульничает. Проверки нажатых кнопок тоже могут сказать многое.

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

Тут важнее любым способ выловить факт, что игрок как-то химичил - и затем забанить его.

Link to comment

К сожалению, программы у меня нет, но достаточно вбить в гугл cheat engine, а там уже дело за малым.

Также можно проверить скорость движения игрока при скорости 1x игры. Если у игрока скорость игры 1x, а он перемещается без джета или тачки с большой скоростью, это возможно чит (хотя игрок может просто стоять на транспорте или объекте, который двигается, хотя это все тоже мона проверить). Проверки скорости движения тачки тоже могут показать, что игрок жульничает. Проверки нажатых кнопок тоже могут сказать многое.

Это мне до боли все известно.

Link to comment

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

Link to comment

Не надейтесь на встроенные античиты и защиты МТА... всегда проверяйте входящие данные с клиента на сервер.

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

Если таймер вызывает серверную функцию, то проверяй интервал вызываемой функции.

Способ с getGameSpeed я проверил сразу же, как только заметил, что кто-то балуется со скоростью, да только это ничего не дало: функция все время возвращала 1, то есть тут дело не в скорости игры, а, как бы сказать, в быстродействии что ли...

Ты сам себе выше ответил как определить скорость игры. Таймеры работают в несколько раз быстрее, т.к. метод ускорения игры осуществляется CPU Clock Speed. т.е. игра обманывается за счёт ускоренного времени. Например за 1 секунду перс должен пробежать 2 метра. Для игры время идёт намного быстрей, тут уж ей остаётся подчинится :)

Link to comment

1. setElementData была небольшой нашей недоработкой, в свое время не предусмотрели что взломав клиент и используя setElementData на клиенте можно менять то что задал сервер и повлиять на работу гейм-модов, а так как скриптеры и не задумывались о том что можно ввести дополнительные проверки на сервере, функцию пришлось заблокировать на уровне admin ресурса, поэтому в данный момент, на клиентской части, синхронизированную дату можно менять только на самом себе (на локальном игроке). В следующей версии это должно измениться, мы еще не пришли к общему решению данной проблемы, но скорее всего это будет дополнительный аргумент в серверной setElementData, который будет определять какую информацию может изменять клиент. (Если разрабатываешь ресурс для 1.1, то можно смело отключить убрать данную проверку, удалив в admin/server/admin_server.lua следующий код:

addEventHandler('onElementDataChange', root, 
        function(dataName, oldValue ) 
                if getElementType(source)=='player' and checkClient( false, source, 'onElementDataChange', dataName ) then 
                        setElementData( source, dataName, oldValue ) 
                        return 
                end 
        end 
) 

2. Нам прислали такой gta-sa.exe, который не видела наша защита, и он как раз позволял игрокам носиться как бешеным + многое другое. В данный момент его перекрыли и если это обновление еще не вышло, то выйдет в скором времени. (Он так же перекрывает многие другие потенциальные читы), но если кто-то бегает очень быстро не стоит сразу его записывать в читеры, так как очень распространен в старых играх баг с процессорами AMD, из-за которого игры идут в разы быстрее чем обычно (исправляется распределением игры на один логический процессор, либо установкой официального патча от AMD - Core Optimizer)

Link to comment
Если разрабатываешь ресурс для 1.1, то можно смело отключить убрать данную проверку, удалив в admin/server/admin_server.lua следующий код:

Отлично, я как раз для 1.1 и делаю.

В данный момент его перекрыли и если это обновление еще не вышло, то выйдет в скором времени

Просто замечательно.

баг с процессорами AMD

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

Собственно, поста от лил тоди я и ждал), все вопросы решены, всем спасибо.

Link to comment

Достаточно давно интересует вопрос о производительности. Известно, что серверная saveMapData считывает с элементов данные записанные функцией setElementData. Как влияет последняя на конечную производительность и есть ли ограничения на количество установленных с помощью нее данных на один элемент?

Link to comment
  • 1 month later...
3 - ты всегда можешь проверить скорость игры клиента, если это нужно. И написать античит в МТА с такими проверками не составит труда. МТА сам умеет менять/узнавать скорость игры клиента.

Ах да, одну вещь я забыл упомянуть. Способ с getGameSpeed я проверил сразу же, как только заметил, что кто-то балуется со скоростью, да только это ничего не дало: функция все время возвращала 1, то есть тут дело не в скорости игры, а, как бы сказать, в быстродействии что ли...

Например можно сделать через помощью махинации с xxx.dll ( не уверен )

когда-то, когда ставил 2х ядерный ЦП без переустановки OS получил такой баг в гта - ускорение всего

вообще не понял как это произошло ( игра потре:Oла 50% цп ), но вышенаписанная библиотека сыграла там не последню роль.

Имя dll-ки не d3d9 :) название афишировать тут не буду.

Если ВСЕ в т.ч и скриптинг работает быстрее, почему бы не устроить проверку с помощью

setTimer и getTickCount?

Link to comment
  • 2 months later...

Пожалуй подниму тему о защите. Выше lil Toady говорил о setElementData, в моём гейммоде вообще стоит запрет на изменение setElementData с клиента и если что - сразу в бан. В 1.1 я так понимаю этот запрет можно смело убрать? Или пока ещё рано?

Пока не вижу дополнительного аргумента в стандартной функции (Конечно же самому реализовать можно).

Немного настораживает вот это: http://exelab.ru/F/index.php?action=vthread&forum=5&topic=18095

Link to comment

А че там страшного? Ну если кто-то вдруг найдет способ сломать стандартный механизм, тогда в баг трекер и отпишешься с возмущениями. Кроме того, можно делать проверки на обеих сторонах в качестве дополнительной ступени безопасности. Ну и все-таки можно продолжать использовать триггеры, когда это нужно.

Пока что функция осталась без изменений - http://code.google.com/p/mtasa-blue/source/browse/trunk/MTA10/mods/shared_logic/lua/CLuaFunctionDefs.Element.cpp#1483

Link to comment
  • 1 month later...

Какой бы там версия безопасной не была, если в функции нет параметра который бы указывал, можно ли изменять определённую дату клиенту. То уберать какие либо проверки я бы не рекомендовал.

1. setElementData была небольшой нашей недоработкой, в свое время не предусмотрели что взломав клиент и используя setElementData на клиенте можно менять то что задал сервер и повлиять на работу гейм-модов, а так как скриптеры и не задумывались о том что можно ввести дополнительные проверки на сервере, функцию пришлось заблокировать на уровне admin ресурса, поэтому в данный момент, на клиентской части, синхронизированную дату можно менять только на самом себе (на локальном игроке). В следующей версии это должно измениться, мы еще не пришли к общему решению данной проблемы, но скорее всего это будет дополнительный аргумент в серверной setElementData, который будет определять какую информацию может изменять клиент.

В onElementDataChange ведь можно проверить входящие данные. Минус только в том, что данные приходится переназначать. Но если в onElementDataChange переназначить дату в oldValue, то значение что было отправлено от пользователя на сервере негде не успеет засветится ведь?

Если разрабатываешь ресурс для 1.1, то можно смело отключить убрать данную проверку, удалив в admin/server/admin_server.lua следующий код:

addEventHandler('onElementDataChange', root, 
        function(dataName, oldValue ) 
                if getElementType(source)=='player' and checkClient( false, source, 'onElementDataChange', dataName ) then 
                        setElementData( source, dataName, oldValue ) 
                        return 
                end 
        end 
) 

А какие отличия в 1.1 от 1.0.5 ? :shock:

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...