SA-MP Forums

SA-MP Forums (https://forum.sa-mp.com/index.php)
-   Русский/Russian (https://forum.sa-mp.com/forumdisplay.php?f=32)
-   -   Атака сервера (https://forum.sa-mp.com/showthread.php?t=400823)

-Stranger- 23/12/2012 09:59 AM

Re: Атака сервера
 
AirKite, сначала скажите хоть одну причину НЕ удалять управляющие символы из строки диалога?
PS> 50% серверов уязвимы через диалог, типа "000000\nadmin=9999". На нескольких десятков серверов проверял, и причём это были не нубосервера...

Свитч стоит потому что у меня идут ещё и другие замены.

Читами, OnDialogResponse можно вызвать с любым ID игрока, даже 1000

AirKite 23/12/2012 04:27 PM

Re: Атака сервера
 
Quote:

Originally Posted by DartfoL (Post 2284578)
в чате и в командах есть, а в диалогах - нет

Серверная сторона или клиент?

Quote:

Originally Posted by -Stranger- (Post 2284695)
AirKite, сначала скажите хоть одну причину НЕ удалять управляющие символы из строки диалога?
PS> 50% серверов уязвимы через диалог, типа "000000\nadmin=9999". На нескольких десятков серверов проверял, и причём это были не нубосервера...

Свитч стоит потому что у меня идут ещё и другие замены.

Читами, OnDialogResponse можно вызвать с любым ID игрока, даже 1000

Такое ощущение что ответ был дан не на мой пост. Где я хоть слово сказал о управляющих символах?
Что значит свитч потому что идут и другие замены? Я о конкретном диапазоне... Вообще case x...y: где между x и y большой диапозон, юзать не целесообразно. И где я хоть слово сказал об идах? Я это подозревал и проверил ещё почти сразу после выхода версии с диалогами. Никогда даже не принимал ид из OnDialogResponse. Вообще нахрен там сделали ID's если диалог может быть всего 1шт (сразу). Логично ведь что ID будет таким же как и тот что ты отправил последний. (Кроме reconnect случаев, но это уже не актуально). Ах да, ещё и максимальный ид диалога ограничен до 32767 (не критично естественно).

Если это всё был не уход от ответа, и вы действительно хотели бы ответить, то пожалуйста перечитайте внимательнее: http://forum.sa-mp.com/showpost.php?...5&postcount=40

DartfoL 23/12/2012 06:12 PM

Re: Атака сервера
 
смысл делать на клиентской стороне, если можно пропатчить клиент, тем самым убрав все проверки и замены?
хорошо, что калкор это осознает

-Stranger- 24/12/2012 02:13 AM

Re: Атака сервера
 
AirKite, такое ощущение, что под Вашим аккаунтом сидит куча народа или вы забываете что пишете.

Quote:

Странно... А в скромном примере убило
case 0x00 .. 0x1F
Это и есть управляющие символы, и что тут Вас так 'убило'?

Quote:

Вообще case x...y: где между x и y большой диапозон, юзать не целесообразно.
Лучше сделать 17 if ?

Quote:

И где я хоть слово сказал об идах?
Quote:

Это вообще реально что бы OnDialogResponse ответил с INVALID_PLAYER_ID или ответил от имени отключенного игрока

Вы, друг мой, сами прочтите что написали и сравните 2 поста...

AirKite 24/12/2012 01:00 PM

Re: Атака сервера
 
-Stranger-, Да уж, кто то из нас упоролся или мною правят зелёные человечики. Если серьёзно, давайте разберёмся уже в недопонимании :)

Какое отношение INVALID_PLAYER_ID (playerid - тот от кого был отправлен диалог) имеет к dialogid (ID диалога) ??? DIALOG_ID можно подменить, но причём тут playerid?

OnDialogResponse(playerid, dialogid, response, listitem, inputtext)
[данные от клиента (их можно подменить) - грубо говоря SAMP CONNECT ID (архитектура не позволяет его подменить)]

Идём дальше: О case 0x00...0x1F я говорил опять таки не о самих символах 0x00 и 0x1F а о switch и нецелесообразности юзать большой диапазон в switch > case. Ваш способ при компиляции условно создаёт 17 case. Если делать через if достаточно сделать одного условия if(inputtext[itr] >= 0x00 && inputtext[itr] <= 0x1F).

Для того что бы вы поняли о чём речь, попробуйте скомпилировать любой скрипт с диапазоном в case 0...99999999: (Не поленитесь и проверьте, надеюсь это вам поможет).

eakwarp 24/12/2012 01:18 PM

Re: Атака сервера
 
Quote:

Originally Posted by AirKite (Post 2286746)
-Stranger-, Да уж, кто то из нас упоролся или мною правят зелёные человечики. Если серьёзно, давайте разберёмся уже в недопонимании :)

Какое отношение INVALID_PLAYER_ID (playerid - тот от кого был отправлен диалог) имеет к dialogid (ID диалога) ??? DIALOG_ID можно подменить, но причём тут playerid?

OnDialogResponse(playerid, dialogid, response, listitem, inputtext)
[данные от клиента (их можно подменить) - грубо говоря SAMP CONNECT ID (архитектура не позволяет его подменить)]

Идём дальше: О case 0x00...0x1F я говорил опять таки не о самих символах 0x00 и 0x1F а о switch и нецелесообразности юзать большой диапазон в switch > case. Ваш способ при компиляции условно создаёт 17 case. Если делать через if достаточно сделать одного условия if(inputtext[itr] >= 0x00 && inputtext[itr] <= 0x1F).

Для того что бы вы поняли о чём речь, попробуйте скомпилировать любой скрипт с диапазоном в case 0...99999999: (Не поленитесь и проверьте, надеюсь это вам поможет).

switch - в павне if based, делайте выводы.

-Stranger- 24/12/2012 01:53 PM

Re: Атака сервера
 
AirKite, всё-же я настаиваю на том, что playerid в OnDialogResponse подменить можно, используя бота.
Но смысл не в том, как это можно сделать, а в том что это можно сделать, и добиться, как минимум вызова playerid, которого не существует на сервере в данный момент.
По мне лучше перестраховаться, и проверить как на IsPlayerConnected, так и на INVALID_PLAYER_ID.
Данная проверка хуже серверу ну никак не сделает. А вот пользу может принести.

На счёт switch > case. Тут больше дело вкуса, но ради интереса сделаю тесты и выложу в эту тему.

Stepashka 24/12/2012 02:02 PM

Re: Атака сервера
 
Quote:

Originally Posted by -Stranger- (Post 2286846)
AirKite, всё-же я настаиваю на том, что playerid в OnDialogResponse подменить можно, используя бота.
Но смысл не в том, как это можно сделать, а в том что это можно сделать, и добиться, как минимум вызова playerid, которого не существует на сервере в данный момент.
По мне лучше перестраховаться, и проверить как на IsPlayerConnected, так и на INVALID_PLAYER_ID.
Данная проверка хуже серверу ну никак не сделает. А вот пользу может принести.

На счёт switch > case. Тут больше дело вкуса, но ради интереса сделаю тесты и выложу в эту тему.

playerid сугубо внутрисерверная переменная и подменить её со стороны клиента нельзя.

AirKite 24/12/2012 02:23 PM

Re: Атака сервера
 
Quote:

Originally Posted by eakwarp (Post 2286784)
switch - в павне if based, делайте выводы.

Да выводы уже были давно сделаны и не только мной, switch работает быстрее if, только вот нужно учитывать то, что проверки по диапазону в switch не может быть. т.е. case 0...9999 по своей сути как макрос, который создаёт case 0:, case 1:, case 2:, case 3:, и в некоторых ситуациях целесообразней использовать if соответственно.

Quote:

Originally Posted by -Stranger- (Post 2286846)
AirKite, всё-же я настаиваю на том, что playerid в OnDialogResponse подменить можно, используя бота.
Но смысл не в том, как это можно сделать, а в том что это можно сделать, и добиться, как минимум вызова playerid, которого не существует на сервере в данный момент.

По мне лучше перестраховаться, и проверить как на IsPlayerConnected, так и на INVALID_PLAYER_ID.
Данная проверка хуже серверу ну никак не сделает. А вот пользу может принести

Даже у бота есть свой ID, и он никак не равен INVALID_PLAYER_ID. Ты конечно прав, что лучше перестраховаться. Однако я себе представлял немного иную архитектуру SAMP. Если playerid было бы возможно подменить, это уже бы давно делали. В любом случае твоя проверка не защитит от мистической подмены playerid, ибо по идее playerid создаётся по факту подключения, а если он есть то и IsPlayerConnected вернёт true... в прочем не будем холиварить, я исходных кодов последних версий samp не видел, как и вы :)

Quote:

Originally Posted by -Stranger- (Post 2286846)
На счёт switch > case. Тут больше дело вкуса, но ради интереса сделаю тесты и выложу в эту тему.

На самом деле всё зависит сугубо от ситуации. Пример:
pawn Code:
new tick, lol = 5000;
tick = GetTickCount();
for(new i; i < 100000; i++) {
    switch(lol) {
        case 0..10000: {
            // code
        }
    }
}
printf("SWITCH: %d ms", GetTickCount()-tick);
tick = GetTickCount();
for(new i; i < 100000; i++) {
    if(lol >= 0 && lol <= 10000) {
        // code
    }
}
printf("SWITCH: %d ms", GetTickCount()-tick);
покажет:
Code:

SWITCH: 771 ms
SWITCH: 20 ms

Однако для диапазона в 17, всё же switch будет чуток быстрее.
pawn Code:
new tick, lol = 17;
tick = GetTickCount();
for(new i; i < 100000; i++) {
    switch(lol) {
        case 0..17: {
            // code
        }
    }
}
printf("SWITCH: %d ms", GetTickCount()-tick);
tick = GetTickCount();
for(new i; i < 100000; i++) {
    if(lol >= 0 && lol <= 17) {
        // code
    }
}
printf("SWITCH: %d ms", GetTickCount()-tick);
Code:

SWITCH: 15 ms
SWITCH: 20 ms

p.s. Вспомнил тему где спрашивалось о том, как сделать case 0..∞: :D

dimonml 24/12/2012 02:28 PM

Re: Атака сервера
 
Злостный оффтоп: читая дискуссию вспомнилось.

Я сейчас ковыряюсь с united 1.2 и там обнаружилась интересная вещь. В Юнайтеде добавили педов (ид добавленных педов более 300), они без особых проблем подхватились сампом, за исключением колбека OnPlayerSpawn. Не смотря на то, что номер Skin является серверной переменной и кроме как самим сервером никак не выставляется, в обработчике rpc сампа стояла проверка и если SkinId был >= 300, то обработка прекращалась :) Вполне возможно, что это радумент, но сейчас выглядит довольно смешно.

Так и тут: если удалось подменить player_id, то злоумышленник способен отсылать rpc вызовы от имени любого игрока и вся архитектура шифрования сессий RakNet уже скомпрометирована: наличие дополнительной проверки сервер уже не спасет :)

AirKite 24/12/2012 02:44 PM

Re: Атака сервера
 
Quote:

Originally Posted by dimonml (Post 2286905)
если удалось подменить player_id, то злоумышленник способен отсылать rpc вызовы от имени любого игрока и вся архитектура шифрования сессий RakNet уже скомпрометирована: наличие дополнительной проверки сервер уже не спасет :)

Верно сказано, но по всей видимости автор теории о подмене playerid в диалогах намекает на то, что именно этот паблик вызывается с аргументом playerid извне архитектуры SAMP. То есть туда якобы попадает playerid не имея никакого отношения к сессии. Только тут становится непонятно, зачем бы вообще нужно было SAMP-у отделять это событие... (абсурд).

Как на мой взгляд, так это то, что теория о подмене playerid в OnDialogResponse построена лишь на том, что туда попадают входящие данные (в том числе dialogid), которые отправляются непосредственно с клиента. Автор теории попросту не задумывался о том, что такое playerid и насколько фатальна была бы его подмена.

А проверки в pawn если уж какие то и нужно было делать, то тогда это как минимум Ник и IP-Адрес. Как автор пытался на всякий случай спастись INVALID_PLAYER_ID и IsPlayerConnected не понятно.

-Stranger- 24/12/2012 04:48 PM

Re: Атака сервера
 
1) Подключаем бота.
2) Вызываем OnDialogResponse.
3) Сразу же отключаем бота.

Получаем playerid несуществующего игрока.
Может это и не совсем подмена, в том смысле, в котором Вы поняли, но разве от неё защиты ненужно делать?

add:
Я не знаю в каком случае OnDialogResponse может вернуть INVALID_PLAYER_ID, но разве это стоит дискуссии на 2 станицы? Есть проверка, пусть будет проверка, или 0.0001мс, которые заняла проверка стоят обсуждения?

Alexander_Petrov 24/12/2012 04:56 PM

Re: Атака сервера
 
Quote:

Originally Posted by -Stranger- (Post 2287167)
Я не знаю в каком случае OnDialogResponse может вернуть INVALID_PLAYER_ID, но разве это стоит дискуссии на 2 станицы? Есть проверка, пусть будет проверка, или 0.0001мс, которые заняла проверка стоят обсуждения?

Стоят, потому что за это время могла пройти другая, более нужная проверка.

dimonml 24/12/2012 05:10 PM

Re: Атака сервера
 
Quote:

Originally Posted by -Stranger- (Post 2287167)
1) Подключаем бота.

=OnPlayerConnect;
Quote:

Originally Posted by -Stranger- (Post 2287167)
2) Вызываем OnDialogResponse.

Получаем срабатывание колбека с валидным ид игрока;
Quote:

Originally Posted by -Stranger- (Post 2287167)
3) Сразу же отключаем бота.

=OnPlayerDisconnect;

Quote:

Originally Posted by -Stranger- (Post 2287167)
Получаем playerid несуществующего игрока.

Получаем вполне существующий (на момент вызова обработчика) playerid.

Quote:

Originally Posted by -Stranger- (Post 2287167)
Может это и не совсем подмена, в том смысле, в котором Вы поняли, но разве от неё защиты ненужно делать?

От описанного кейса нужно защищаться по другому;

Quote:

Originally Posted by -Stranger- (Post 2287167)
add:
Я не знаю в каком случае OnDialogResponse может вернуть INVALID_PLAYER_ID, но разве это стоит дискуссии на 2 станицы? Есть проверка, пусть будет проверка, или 0.0001мс, которые заняла проверка стоят обсуждения?

Просто тут идет попытка защититься от несуществующей угрозы. Ее никто не видел, но мы думаем - а вдруг поможет. Это гадание, а не программирование.

AirKite 24/12/2012 05:13 PM

Re: Атака сервера
 
Quote:

Originally Posted by -Stranger- (Post 2287167)
1) Подключаем бота.
2) Вызываем OnDialogResponse.
3) Сразу же отключаем бота.

Получаем playerid несуществующего игрока.
Может это и не совсем подмена, в том смысле, в котором Вы поняли, но разве от неё защиты ненужно делать?

Что значит несуществующего игрока? Его сессия всё ещё активна и не завершена. В чём будет заключаться защита если IsPlayerConnected будет возвращать true пока игрок или бот действует на сервере?

Особенно интересен переход с пункта 2 на 3. Как вы себе представляете отправку диалога и моментальный выход? Отправка пакета и выход с сервера до того как пакет дойдёт? В любом случае выход будет совершён после вызова диалога... Бред в общем.

Quote:

Originally Posted by -Stranger- (Post 2287167)
Я не знаю в каком случае OnDialogResponse может вернуть INVALID_PLAYER_ID, но разве это стоит дискуссии на 2 станицы? Есть проверка, пусть будет проверка, или 0.0001мс, которые заняла проверка стоят обсуждения?

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

stabker 25/12/2012 06:21 AM

Re: Атака сервера
 
Вообщем, это Ping response flood. Нужно проверять Messages in Send buffer через GetPlayerNetworkStats, если значение >= 8-10k - банить. Но учитывайте, что при дисконнекте данные скачут, добавляйте какой-то флаг о том, что началось выполнение OnPlayerDisconnect и если при нем Messages in Send buffer завышена, это можно проигнорировать. И еще, для уверенности, на всякий случай баньте после 2х таких определений.
Думаю кому-то пригодиться.

jhonyxakep 25/12/2012 09:15 AM

Re: Атака сервера
 
Quote:

Цитата: Сообщение от -Stranger-
1) Подключаем бота.

=OnPlayerConnect;
Цитата: Сообщение от -Stranger-
2) Вызываем OnDialogResponse.

Получаем срабатывание колбека с валидным ид игрока;
Цитата: Сообщение от -Stranger-
3) Сразу же отключаем бота.

=OnPlayerDisconnect;

Цитата: Сообщение от -Stranger-
Получаем playerid несуществующего игрока.

Получаем вполне существующий (на момент вызова обработчика) playerid.

Quote:

Особенно интересен переход с пункта 2 на 3. Как вы себе представляете отправку диалога и моментальный выход? Отправка пакета и выход с сервера до того как пакет дойдёт? В любом случае выход будет совершён после вызова диалога... Бред в общем.
Как самп реагирует на пакеты от потенциально не подключенного игрока? Те без вызова OnPlayerConnect

AirKite 25/12/2012 04:43 PM

Re: Атака сервера
 
Quote:

Originally Posted by jhonyxakep (Post 2288160)
Как самп реагирует на пакеты от потенциально не подключенного игрока? Те без вызова OnPlayerConnect

Что означает потенциально не подключенного? Он или подключен или нет. Есть ведь определённый таймаут подключения по которому и считается подключен игрок или нет. Ну и по факту ответа от него разумеется.

Stepashka 25/12/2012 05:47 PM

Re: Атака сервера
 
Quote:

Originally Posted by jhonyxakep (Post 2288160)
Как самп реагирует на пакеты от потенциально не подключенного игрока? Те без вызова OnPlayerConnect

игнорирует.

AirKite 26/12/2012 07:04 AM

Re: Атака сервера
 
Quote:

Originally Posted by stabker (Post 2288010)
Вообщем, это Ping response flood. Нужно проверять Messages in Send buffer через GetPlayerNetworkStats, если значение >= 8-10k - банить. Но учитывайте, что при дисконнекте данные скачут, добавляйте какой-то флаг о том, что началось выполнение OnPlayerDisconnect и если при нем Messages in Send buffer завышена, это можно проигнорировать. И еще, для уверенности, на всякий случай баньте после 2х таких определений.
Думаю кому-то пригодиться.

Всем наверное срать, никто даже и спасибо не сказал. Вообще спасибо. Сервер пока не держу, но подозревал о переполнении буфера и выявлении аномалий в GetPlayerNetworkStats. То времени то возможности не было проверить эти уязвимости. Кстати разве Messages in Send buffer не буфер на стороне клиента? Типа очередь сообщений для отправки? т.е. разумеется можно переписать досер так, что бы он не отсылал пакеты как только Messages in Send buffer переполняется, и как только он уменьшится возобновить отправку (на сторону сервера и эффективность атаки никак не повлияет если Messages in Send buffer это то, о чём я подумал).

DANGER1979 26/12/2012 07:11 AM

Re: Атака сервера
 
Кстати часто бывает, что игрок, т.е. вы вышли с сервера, но в списке игроков сампа ваш ник там ещё есть.
Возможно - это просто проблема обновления списка игроков в сампе.

DANGER1979 26/12/2012 07:18 AM

Re: Атака сервера
 
AirKite, я поставил каждую секунду проверять Messages sent: с прошлым значением.
И при онлайне 50 разница значений достигало только 700-800.
Хотя на пустом сервере с ботами эта разница не более 70 у ботов и одного игрока.

Вот типичное сохранение
Network Active: 1
Network State: 8
Messages in Send buffer: 0
Messages sent: 86069
Bytes sent: 4414342
Acks sent: 712
Acks in send buffer: 0
Messages waiting for ack: 3
Messages resent: 1746
Bytes resent: 75543
Packetloss: 1.7%
Messages received: 28837
Bytes received: 1101058
Acks received: 0
Duplicate acks received: 0
Inst. KBits per second: 29.3
KBits per second sent: 15987412.2
KBits per second
как видим длины 400 не достаточно, как на вики пишут

DANGER1979 26/12/2012 11:33 AM

Re: Атака сервера
 
Ну всё такие есть какое-нибудь решение
как этот флуд
[25/12/2012 10:15:12] Warning: PlayerDialogResponse PlayerId: 32 dialog ID doesn't match last sent dialog ID
[25/12/2012 10:15:12] Warning: PlayerDialogResponse crash exploit from PlayerId: 32
в логе прикрыть?

White_116 26/12/2012 11:42 AM

Re: Атака сервера
 
Можно ручками, сервер hex редактором поковырять и уменьшить текст.
Защититься почти не реально, если только память хакать, или лог подчищать.
Или вот это

GameMan 26/12/2012 04:30 PM

Re: Атака сервера
 
Quote:

Originally Posted by White_116 (Post 2290147)
Можно ручками, сервер hex редактором поковырять и уменьшить текст.
Защититься почти не реально, если только память хакать, или лог подчищать.
Или вот это

У меня почему-то от этого плагина кодировка в логе сбилась и сервер начал вырубаться сам по себе через 5 минут :( Как исправить и только у меня ли так - не знаю...

SDraw 26/12/2012 04:34 PM

Re: Атака сервера
 
Quote:

Originally Posted by GameMan (Post 2290590)
У меня почему-то от этого плагина кодировка в логе сбилась и сервер начал вырубаться сам по себе через 5 минут :( Как исправить и только у меня ли так - не знаю...

Не только у тебя. Имею ту же проблему...

AirKite 26/12/2012 06:04 PM

Re: Атака сервера
 
Quote:

Originally Posted by GameMan (Post 2290590)
У меня почему-то от этого плагина кодировка в логе сбилась и сервер начал вырубаться сам по себе через 5 минут :( Как исправить и только у меня ли так - не знаю...

Quote:

Originally Posted by SDraw (Post 2290598)
Не только у тебя. Имею ту же проблему...

Попробуйте описать проблему ******. Обычно быстро отвечает и фиксит.

jhonyxakep 27/12/2012 02:07 AM

Re: Атака сервера
 
Quote:

Что означает потенциально не подключенного? Он или подключен или нет. Есть ведь определённый таймаут подключения по которому и считается подключен игрок или нет. Ну и по факту ответа от него разумеется.
Те подключился, отослал парочку опознавательных клиентов, а дальше мусор.

Quote:

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

DANGER1979 27/12/2012 04:16 AM

Re: Атака сервера
 
Ни когда не использую ****** творения.
Раньше использовал динамические циклы и т.п., постоянно имел лишний геморой с проблемой краша сервера или ещё хуже зависания, после чего слетают аки.

Посмотрел суть его динамических циклов и создал свои. Но код его читать и разбираться в нём очень трудно.

AirKite 27/12/2012 06:14 AM

Re: Атака сервера
 
Quote:

Originally Posted by DANGER1979 (Post 2291367)
Ни когда не использую ****** творения.
Раньше использовал динамические циклы и т.п., постоянно имел лишний геморой с проблемой краша сервера или ещё хуже зависания, после чего слетают аки.

Посмотрел суть его динамических циклов и создал свои. Но код его читать и разбираться в нём очень трудно.

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

stabker 27/12/2012 11:06 AM

Re: Атака сервера
 
Quote:

Originally Posted by AirKite (Post 2291466)
Более того в его инклудах YSI не однократно указывал ему на очепятки и касяки. Код специфичный, но не сложный. Понятное дело, кому как. Сам лично тоже не использую его инклуды. Тут же речь о плагине, который как минимум можно подглядеть как устроен плагин. Там в принципе ничего хитрого не должно быть, просто чтение лога и вызов коулбэка по факту его обновления.

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

Кстати, возвращаясь к теме самой темы: GetPlayerNetworkStats очень часто возвращает ошибочные данные, не знаю при каких условиях, но у меня каждый день банит по 3-6 человек, некоторых не знаю, некоторых знаю, что они чистые. Приходится всех разбанивать каждую полночь. И это не смотря на то, что я сделал проверку, банить только после >= 5 скачков Messages in Send buffer.

А что, если их кикать, а не банить?

UPD:
Сделаю пока что временный бан ип адреса, если игрок подозревается в атаке.

dimonml 27/12/2012 02:57 PM

Re: Атака сервера
 
Quote:

Originally Posted by -Stranger- (Post 2287167)
Я не знаю в каком случае OnDialogResponse может вернуть INVALID_PLAYER_ID

Судя по коду сервера 0.3e, INVALID_PLAYER_ID в коллбек pawn никогда не попадет.

SDraw 27/12/2012 05:23 PM

Re: Атака сервера
 
Quote:

Originally Posted by AirKite (Post 2290774)
Попробуйте описать проблему ******. Обычно быстро отвечает и фиксит.

Писал еще давно, не реагировал...Попытаюсь еще раз...

jhonyxakep 27/12/2012 08:04 PM

Re: Атака сервера
 
Quote:

Судя по коду сервера 0.3e, INVALID_PLAYER_ID в коллбек pawn никогда не попадет.
Это вы каким таким дебагером отследили внутренности Pawn машины

DANGER1979 28/12/2012 04:46 AM

Re: Атака сервера
 
Quote:

Originally Posted by stabker (Post 2291743)
Ага, специфичный :cool:. Я когда его код смотрю, у меня возникает чувство, что он сначала все нормально пишет, а потом заменяет названия переменных и функций, специально, чтобы никто не понял, что там происходит.

Кстати, возвращаясь к теме самой темы: GetPlayerNetworkStats очень часто возвращает ошибочные данные, не знаю при каких условиях, но у меня каждый день банит по 3-6 человек, некоторых не знаю, некоторых знаю, что они чистые. Приходится всех разбанивать каждую полночь. И это не смотря на то, что я сделал проверку, банить только после >= 5 скачков Messages in Send buffer.

А что, если их кикать, а не банить?

UPD:
Сделаю пока что временный бан ип адреса, если игрок подозревается в атаке.

у меня почему то
Messages in Send buffer.
всегда равна нулю у всех.
Но Messages sent имеет большие значения.

dimonml 28/12/2012 06:06 AM

Re: Атака сервера
 
Quote:

Originally Posted by jhonyxakep (Post 2292535)
Это вы каким таким дебагером отследили внутренности Pawn машины

Просто с помощью дизассемблера посмотрел тот кусок сервера, который обрабатывает пришедший пакет от клиента. До amx машины там дело не доходит.

AirKite 28/12/2012 12:44 PM

Re: Атака сервера
 
Quote:

Originally Posted by DANGER1979 (Post 2293210)
у меня почему то
Messages in Send buffer.
всегда равна нулю у всех.
Но Messages sent имеет большие значения.

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

MichaelKonsta 02/01/2013 08:16 AM

Re: Атака сервера
 
http://mishakonsta.ru/bugs-fix/17-an...mazahacka.html

AirKite 02/01/2013 11:56 AM

Re: Атака сервера
 
Quote:

Originally Posted by MichaelKonsta (Post 2301765)

pawn Code:
#include <a_samp>

#define MAX_MESSAGES 1500

new MessagesCount[MAX_PLAYERS];
new lastchecktime;

public OnFilterScriptInit()
{
    for(new i=0; i<MAX_PLAYERS; i++)MessagesCount[i] = 9999999;
    SetTimer("NetworkUpdate", 5000, true);
    return 1;
}

public OnPlayerConnect(playerid)
{
    MessagesCount[playerid] = 9999999;
    return 1;
}

forward NetworkUpdate();
public NetworkUpdate()
{
    new stats[300], idx, pos, msgs;
    for(new i=0; i<MAX_PLAYERS; i++)
    {
        if(IsPlayerConnected(i))
        {
            idx = 0;
            GetPlayerNetworkStats(i, stats, sizeof(stats));
            pos = strfind(stats, "Messages received: ", false, 209);//209 - минимальная позиция "Messages received" в строке
            msgs = strval(strtok(stats[pos+19], idx));
            if(msgs - MessagesCount[i] > MAX_MESSAGES)
            {
                new pname[MAX_PLAYER_NAME];
                GetPlayerName(i, pname, sizeof(pname));
                printf("%s[id:%d] banned for UDP flood", pname, i);
                BanEx(i, "UDP flood");
            }
            MessagesCount[i] = msgs;
        }
    }
    lastchecktime = GetTickCount();
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if(!strcmp(cmdtext, "/mctop", true))
    {
        if(!IsPlayerAdmin(playerid))return 1;//rcon only
        SetTimerEx("ShowMessagesCountTop10", 4000-(GetTickCount()-lastchecktime), false, "d", playerid);
        return 1;
    }
    return 0;
}

forward ShowMessagesCountTop10(playerid);
public ShowMessagesCountTop10(playerid)
{
    new stats[300], idx, pos, msgs, SortedArray[MAX_PLAYERS][2], i, string[256], pname[MAX_PLAYER_NAME];
    for(i=0; i<MAX_PLAYERS; i++)
    {
        if(IsPlayerConnected(i))
        {
            idx = 0;
            GetPlayerNetworkStats(i, stats, sizeof(stats));
            pos = strfind(stats, "Messages received: ", false, 209);
            msgs = strval(strtok(stats[pos+19], idx));
            SortedArray[i][0] = msgs - MessagesCount[i];
            SortedArray[i][1] = i;
        }
    }

    for(i=0; i<MAX_PLAYERS; i++)// бабл сорт
    {
        if(IsPlayerConnected(i))
        {
            for(new j=0; j<i; j++)
            {
                if(SortedArray[i][0] > SortedArray[j][0])
                {
                    new temp = SortedArray[i][0]; //swap
                    SortedArray[i][0] = SortedArray[j][0];
                    SortedArray[j][0] = temp;
                    temp = SortedArray[i][1];
                    SortedArray[i][1] = SortedArray[j][1];
                    SortedArray[j][1] = temp;
                }
            }
        }
    }
   
    SendClientMessage(playerid, 0xFFFF00AA, "Top 10 high packets players:");
    for(i=0; i<10; i++)
    {
        if(IsPlayerConnected(i))
        {
            GetPlayerName(SortedArray[i][1], pname, sizeof(pname));
            format(string, sizeof(string), "%d. %s[id:%d] - %d packets", i+1, pname, SortedArray[i][1], SortedArray[i][0]);
            SendClientMessage(playerid, 0xFFFF00AA, string);
        }
    }
    return 1;
}

stock strtok(const string[], &index)
{
    new length = strlen(string);
    while ((index < length) && (string[index] <= ' '))
    {
        index++;
    }

    new offset = index;
    new result[20];
    while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
    {
        result[index - offset] = string[index];
        index++;
    }
    result[index - offset] = EOS;
    return result;
}

// (c) MazaHACKa
Так то ничего что Messages received: это входящие пакеты а не исходящие...

Jon_De 06/07/2013 04:20 PM

Re: Атака сервера
 
Quote:

Originally Posted by eakwarp (Post 2281662)
Между прочим, тоже столкнулся с подобной проблемой, только у меня еще и ботов выбивало, в коде все в порядке, в логах только игроки, причем в этот момент на какого либо из игроков(причем судя по всему к атаке не имеющего отношения) идет варнинг на модифицированный пакет. Сервер уходит в логаут секунд на 30. К сожалению, реально лень отслеживать потребление ресурсов при этом, ибо они у меня не ограничены по сути, но нечто, процессорное время занимает чуть более чем полностью. С кодом не связано, очередной эксплойт.

те же симптомы (ботов выбивает, сервер на 30 сек виснет, варнинги от простых игроков), как исправил?


All times are GMT. The time now is 05:26 PM.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.