PDA

Просмотр полной версии : [Античит] Защита от краша ( Зависание сервера у игроков ) Bullet Hit Type



Valera_Trefilov
07.09.2014, 17:53
Привет всем пользователям портала Pro-Pawn.
И вновь нашли дырку на клиенте SAMP.
Но как говорится, на любую дырку. Свой фикс.
Так вот сам крашер вызывает каллбэк OnPlayerWeaponShot с такими данными:

OnPlayerWeaponShot(0,0,1,0,2004318080.000000,2004318080.000000,2004318080.000000)

Как на это реагирует клиент:

http://puu.sh/bpafq/c5e0c28dc9.png


SA-MP 0.3z
Exception At Address: 0x49646550
Base: 0x04170000

Registers:
EAX: 0x04C72818 EBX: 0x042F9028 ECX: 0x04C72818 EDX: 0x00863C40
ESI: 0x04C2BF58 EDI: 0x042F9028 EBP: 0x00000000 ESP: 0x0028FB7C
EFLAGS: 0x00010246

Stack:
+0000: 0x004096AD 0x00533E99 0x04C2BF58 0x0028FBF0
+0010: 0x04C2BF58 0x00554164 0x042F9028 0x04C2BF58
+0020: 0x00000000 0x0055480F 0x427D5556 0x44582C0E
+0030: 0x44518AEA 0x04C2BF01 0x0028FC60 0x00000001
+0040: 0x04B481F0 0x04C2BF58 0x44518AEA 0xC5206C20
+0050: 0x443D5B00 0x42394800 0x00554BFD 0x04C2BF01
+0060: 0x0028FBF0 0x00000002 0x00000001 0x00000004
+0070: 0x0072D10B 0x44518AEA 0x00000012 0xC32458C2
+0080: 0xC35B2105 0x002DC1A0 0x00000007 0x00000002
+0090: 0xBF5CC141 0x3F32B54E 0x400E437C 0x00000005
+00A0: 0x40EA1EF6 0x00000012 0x00000004 0x00000001
+00B0: 0x00000014 0x00000002 0x4014E35F 0x40A1344E
+00C0: 0x417BC5FC 0x40F86EC0 0x419D2019 0x40F7B73D
+00D0: 0x41A0A168 0x3FF3E0E0 0x419E3E52 0x3FF6BEF8
+00E0: 0x419ABD03 0x43960000 0x00555669 0x0028FD64
+00F0: 0x00000005 0x00554B10 0x0028FD64 0x00000005
+0100: 0x00554840 0x0028FCC8 0x0028FCC8 0x0000000D
+0110: 0x002DC1A0 0x0000001A 0x0A68DC90 0x764B6C30
+0120: 0x00000000 0x3AA3D70A 0x435B2105 0xC32458C2
+0130: 0x43960000 0xC35B2105 0xC32458C2 0x43960000
+0140: 0x00000000 0xC8006558 0x486A6000 0xC4F90F23
+0150: 0x43132ACE 0x41E45183 0xC4B578D9 0x447DF0CE
+0160: 0x43C041BB 0xC523AF0A 0x446F0584 0x43C041BB
+0170: 0xC523675A 0x44591D54 0xC3F3CCC0 0xC4B4E97A
+0180: 0x4468089E 0xC3F3CCC0 0xC4DFB6C7 0x43EC71FB
+0190: 0x432207AA 0xC50B365F 0x43E14183 0x432207AA
+01A0: 0xC4F583A8 0x43E165BC 0x41F9B42C 0xC5003A6D
+01B0: 0x43DF28D8 0x41F9B42C 0xC50B1B7D 0x43D0D35F
+01C0: 0xC3250332 0xC4DF8104 0x43DC03D7 0xC3250332
+01D0: 0xC500350D 0x43DBDF9E 0xC208C834 0xC4F578E7
+01E0: 0x43DE1C82 0xC208C834 0x40A1344E 0x417BC5FC
+01F0: 0x40F7B73D 0x41A0A168 0x3FF3E0E0 0x419E3E52
+0200: 0x3FF6BEF8 0x419ABD03 0x40F86EC0 0x419D2019
+0210: 0x005558E2 0x00000001 0x00000000 0x41D45000
+0220: 0x0053E9FE 0x44340000 0x43E10000 0x0053ECC2
+0230: 0x00000001 0x00619B71 0x0000001A 0x00000001
+0240: 0x00000001 0x0000000A 0x00748DF0 0x0000001A
+0250: 0x00000001 0x76391245 0x00000000 0x0028FF88
+0260: 0x7EFDE000 0x012D0000 0x4E5AE91F 0x002D1130
+0270: 0x00000008 0x00000100 0x00000008 0x00000102

SCM Op: 0x248, lDbg: 0 LastRendObj: 18783

Game Version: EU 1.0

State Information: Ped Context: 0
P0 (0,0) P1 (32,0) P2 (0,0) P3 (0,0)
P4 (32,0) P5 (32,0) P6 (17,0) P7 (0,0)
P8 (32,0) P9 (32,0) P10 (0,0) P11 (32,0)
P12 (0,0) P13 (32,0) P14 (0,0) P15 (0,0)
P16 (32,0) P17 (0,0) P18 (0,0) P19 (0,0)
P20 (0,0) P21 (32,0) P22 (0,0) P23 (32,0)
P24 (32,0) P25 (32,0) P26 (0,0) P27 (32,0)
P29 (0,0) P30 (0,0) P31 (0,0)
P32 (32,0) P34 (0,0) P35 (32,0)
P36 (0,0) P37 (0,0) P38 (0,0) P40 (32,0) P43 (0,0)
P44 (0,0) P45 (32,0) P46 (0,0) P47 (0,0)
P49 (0,0) P50 (32,0) P55 (32,0)
P59 (0,0)
P62 (0,0) P63 (0,0)

А как на это отреагируем мы, обычные скриптеры. Которым жалуются клиенты / игроки на зависания.

Ищем паблик OnPlayerWeaponShot.

Вставляем туда:


if( hittype == BULLET_HIT_TYPE_PLAYER )
{
if( !( -20.0 <= fX <= 20.0 ) || !( -20.0 <= fY <= 20.0 ) || !( -20.0 <= fZ <= 20.0 ) )
{
// Наказываем игрока
return false;
}
}



Вариант от Daniel_Cortez (в самый верх мода после инклудов) .


public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
{
if(hittype == BULLET_HIT_TYPE_PLAYER)
{
if((floatcmp(floatabs(fX), 20.0) == 1)
|| (floatcmp(floatabs(fY), 20.0) == 1)
|| (floatcmp(floatabs(fZ), 20.0) == 1))
return Kick(playerid), 0;
}
#if defined hotfix_OnPlayerWeaponShot
return hotfix_OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, fX, fY, fZ);
#else
return 1;
#endif
}
#if defined _ALS_OnPlayerWeaponShot
#undef OnPlayerWeaponShot
#else
#define _ALS_OnPlayerWeaponShot
#endif
#define OnPlayerWeaponShot hotfix_OnPlayerWeaponShot
#if defined hotfix_OnPlayerWeaponShot
forward hotfix_OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ);
#endif

С вами был Valera_Trefilov

DeadLine
07.09.2014, 18:58
лойс!

Valera_Trefilov
07.09.2014, 19:00
лойс!
спасибо, друг мой.
за то что вы сами поставили лойс, и вас никто не просил :smile:

Salvacore
07.09.2014, 19:10
Ну дело в том что мануал не одобрен и посты and + не засчитываются.

DeadLine
07.09.2014, 19:12
Ну дело в том что мануал не одобрен и посты and + не засчитываются.

Я извеняюсь=) это личная приязнь ?
Причины есть по не одобрению ?
Всем понятно что взято это с sa-mp.com ( не реклама и да к тому же какая это может быть реклама на официальный сайт разработчиков.

Valera_Trefilov
07.09.2014, 19:14
Ну дело в том что мануал не одобрен и посты and + не засчитываются.

Одобрят - куда денутся.

Такого мануала нет нигде, чтобы реально так подробно описано в фиксом.
Да и код маленький, и компактный.

Уже 3-4 человека поставили на сервер. С этого мануала.
И зависания сервера, исправлены.

Daniel_Cortez
07.09.2014, 19:31
Набросал тут небольшой хотфикс.
Использование: просто вставить в самое начало мода, после инклудов и забыть об этой заплатке, пока не выйдет обновление SA:MP.


public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
{
if(hittype == BULLET_HIT_TYPE_PLAYER)
{
if((floatcmp(floatabs(fX), 20.0) == 1)
|| (floatcmp(floatabs(fY), 20.0) == 1)
|| (floatcmp(floatabs(fZ), 20.0) == 1))
return Kick(playerid), 0;
}
#if defined hotfix_OnPlayerWeaponShot
return hotfix_OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, fX, fY, fZ);
#else
return 1;
#endif
}
#if defined _ALS_OnPlayerWeaponShot
#undef OnPlayerWeaponShot
#else
#define _ALS_OnPlayerWeaponShot
#endif
#define OnPlayerWeaponShot hotfix_OnPlayerWeaponShot
#if defined hotfix_OnPlayerWeaponShot
forward hotfix_OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ);
#endif

Valera_Trefilov
07.09.2014, 19:43
Набросал тут небольшой хотфикс.
Использование: просто вставить в самое начало мода, после инклудов и забыть об этой заплатке, пока не выйдет обновление SA:MP.


public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
{
if(hittype == BULLET_HIT_TYPE_PLAYER)
{
if((floatcmp(floatabs(fX), 20.0) == 1)
|| (floatcmp(floatabs(fY), 20.0) == 1)
|| (floatcmp(floatabs(fZ), 20.0) == 1))
return Kick(playerid), 0;
}
#if defined hotfix_OnPlayerWeaponShot
return hotfix_OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, fX, fY, fZ);
#else
return 1;
#endif
}
#if defined _ALS_OnPlayerWeaponShot
#undef OnPlayerWeaponShot
#else
#define _ALS_OnPlayerWeaponShot
#endif
#define OnPlayerWeaponShot hotfix_OnPlayerWeaponShot
#if defined hotfix_OnPlayerWeaponShot
forward hotfix_OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ);
#endif


Я с самого начала хотел кое-что подобное добавить. Но думал народ не поймет.

А так проще в паблик засунуть, и все.
Не нужно тут всякий #include, #define, и прочее

Seregamil
07.09.2014, 19:49
Я с самого начала хотел кое-что подобное добавить. Но думал народ не поймет.

А так проще в паблик засунуть, и все.
Не нужно тут всякий #include, #define, и прочее

проще != лучше

wAx
07.09.2014, 19:56
проще != лучше

все гениальное - просто )

Valera_Trefilov
07.09.2014, 20:02
все гениальное - просто )

у кортеза также будет работать.
поэтому, как кто хочет так пусть и делает.

Daniel_Cortez
07.09.2014, 20:03
Почему такой подход лучше? Всё просто.
Заплатка будет находиться на самом видном месте: в самом начале мода.
Как только выйдет обновление SA:MP с исправлением бага, можно будет просто открыть мод, сразу же увидеть заплатку и, вспомнив, что она больше не нужна, удалить её, а не потерять среди остальных 50к строк кода.

OKStyle
07.09.2014, 20:07
Зачем перегружать код лишними действиями? Пусть и будет в паблике:

if(hittype == BULLET_HIT_TYPE_PLAYER)
{
if(floatcmp(floatabs(fX), 20.0) == 1 || floatcmp(floatabs(fY), 20.0) == 1 || floatcmp(floatabs(fZ), 20.0) == 1) return BanEx(playerid, "Crash");
}

Выйдет заплатка - Ctrl + F, находим паблик и удаляем. А не копаемся в коде, опасаясь пропустить строчку.

Valera_Trefilov
07.09.2014, 20:16
Почему такой подход лучше? Всё просто.
Заплатка будет находиться на самом видном месте: в самом начале мода.
Как только выйдет обновление SA:MP с исправлением бага, можно будет просто открыть мод, сразу же увидеть заплатку и, вспомнив, что она больше не нужна, удалить её, а не потерять среди остальных 50к строк кода.

Тут ты прав. Мало-ли еще какой-то краш / баг / дыру найдут.
Можно если что сразу в верх мода сделать или в #include засунуть.

- - - Добавлено - - -


Зачем перегружать код лишними действиями? Пусть и будет в паблике:

if(hittype == BULLET_HIT_TYPE_PLAYER)
{
if(floatcmp(floatabs(fX), 20.0) == 1 || floatcmp(floatabs(fY), 20.0) == 1 || floatcmp(floatabs(fZ), 20.0) == 1) return BanEx(playerid, "Crash");
}

Выйдет заплатка - Ctrl + F, находим паблик и удаляем. А не копаемся в коде, опасаясь пропустить строчку.

А return false?

Он успеет закрашить, до бана. А это не нужно

Daniel_Cortez
07.09.2014, 20:18
Выйдет заплатка - Ctrl + F, находим паблик и удаляем. А не копаемся в коде, опасаясь пропустить строчку.
1. Где гарантия того, что ты не забудешь об этой заплатке до выхода обновления? В прошлый раз с OnFootCrasher пришлось полгода ждать новый релиз.
2. Можно просто сделать вокруг заплатки пустые строки или комментарии. Нужно быть идиотом, чтобы пропустить такое.


Зачем перегружать код лишними действиями? Пусть и будет в паблике:
Пара-тройка инструкций push, call и stack - действительно, очень большая нагрузка!

OKStyle
07.09.2014, 20:28
А return false? Он успеет закрашить, до бана. А это не нужно
Ерунду ты говоришь :acute: Можешь как DC поставить после бана: , 0


Где гарантия того, что ты не забудешь об этой заплатке до выхода обновления? В прошлый раз с OnFootCrasher пришлось полгода ждать новый релиз.
Ну и себе этот же вопрос задай. Чем меньше данных до пабликов, тем легче разработка.


Пара-тройка инструкций push, call и stack - действительно, очень большая нагрузка!
Нагрузка и перегрузка - разные вещи. Причём эти 2 состояния относятся к разным объектам. Тебе ли это не знать. 3 строчки вместо 22 намного лучше.

Daniel_Cortez
07.09.2014, 20:52
Ну и себе этот же вопрос задай. Чем меньше данных до пабликов, тем легче разработка.
Ещё раз повторю, заплатку можно поставить в самом начале мода - на самом видном месте. Куда ещё проще?!


Нагрузка и перегрузка - разные вещи.
Да будет тебе известно, что вызов функции на Pawn - ничто по сравнению с вызовом нативных функций для операций над переменными типа Float. Поэтому вызов (лишней) функции при перехвате выполнится в десятки (а с JIT и в сотни) раз быстрее самой проверки в фиксе.
Ну ладно, допустим, что дополнительная нагрузка есть. Если все 1000 игроков одновременно начнут палить из минигана, сервер будет проще перегрузить на 1-2% - сразу очень многое меняет.


3 строчки вместо 22 намного лучше.
1. Код перехвата функции отсеивается на этапе препроцессинга.
Плюс условие с проверкой углов разбито на несколько строк, чтобы не приходилось листать горизонтальную прокрутку в редакторе кода.
В остальном это всё те же "3 строчки".
2. Лучше может быть как в плане быстродействия, так и в плане удобства разработки.
В моём варианте упор идёт на удобство, при этом быстродействие практически не затрагивается.

OKStyle
07.09.2014, 22:04
Ты пойми, что в начале мода писать этот код - себе во вред. Ни одному в голову не придёт размещать защиту паблика вне паблика.

Daniel_Cortez
07.09.2014, 23:42
Ты пойми, что в начале мода писать этот код - себе во вред.
А оставить его где-то в середине мода и забыть о нём, когда через год выйдет обновление сервера - это, конечно же, нормально.


Ни одному в голову не придёт размещать защиту паблика вне паблика.
Учись мыслить нелинейно. Именно так и появляются новые приёмы по упрощению разработки.

OKStyle
08.09.2014, 08:38
Не "где-то", в том паблике, для которого и пишем защиту. Мыслить нелинейно - это хорошо, но тут я вижу лишь глупость и понты.

DeimoS
08.09.2014, 13:10
Создаём отдельный инклюд, а-ля

#include <fix_samp>
и помещаем туда разнообразные фиксы, используя перехваты (не только этого колбэка). Таким образом малоизменяемый код не будет мозолить глаза и мы с лёгкостью сможем убрать ненужный нам фикс, всего лишь открыв инклюд и удалив его. Это гораздо лучше, нежели прокручивать сотни строк кода с фиксами (это же SA-MP) ради того, чтоб найти нужный

UPD: Так же, при взгляде на код подключения инклюда, мы сразу будем вспоминать о его примерном содержимом

Maranzalla
22.02.2015, 18:15
актуальна еще тема или давно зафиксили это

BaBuIIIkaDrifteR
13.03.2015, 21:57
в SA:MP 0.3.7 Исправят ? кто нибудь знает?

wAx
14.03.2015, 17:04
в SA:MP 0.3.7 Исправят ? кто нибудь знает?

Писалось вроде что пофикшено большинство крашеров.