Атака сервера
#21

exclide1, а что за "фейк дисконнект" вообще? Подробнее об этом можно?
Reply
#22

Quote:
Originally Posted by stabker
Посмотреть сообщение
exclide1, а что за "фейк дисконнект" вообще? Подробнее об этом можно?
Это функция все в том же PizDoS-боте "bypass protection". Вы как бы покидаете сервер (идет OnPlayerDisconnect), но на самом деле остаетесь на нем. Подробнее этого пока не могу, только начал изучать RakSAMP.
Reply
#23

Quote:
Originally Posted by exclide1
Посмотреть сообщение
Это функция все в том же PizDoS-боте "bypass protection". Вы как бы покидаете сервер (идет OnPlayerDisconnect), но на самом деле остаетесь на нем. Подробнее этого пока не могу, только начал изучать RakSAMP.
pawn Код:
public OnPlayerDisconnect(playerid, reason)
{
    //...
    Kick(playerid);
    return 1;
}
Reply
#24

Quote:
Originally Posted by stabker
Посмотреть сообщение
pawn Код:
public OnPlayerDisconnect(playerid, reason)
{
    //...
    Kick(playerid);
    return 1;
}
И привет рекурсия.

pawn Код:
public OnPlayerDisconnect(playerid, reason)
{
    //...
    if(reason < 2) Kick(playerid);
    return 1;
}
Reply
#25

Quote:
Originally Posted by XemyL
Посмотреть сообщение
И привет рекурсия.

pawn Код:
public OnPlayerDisconnect(playerid, reason)
{
    //...
    if(reason < 2) Kick(playerid);
    return 1;
}
Можно ограничиться "if(!reason) Kick(playerid);", т.к. при том дисконнекте идет таймаут.
Reply
#26

Quote:
Originally Posted by XemyL
Посмотреть сообщение
И привет рекурсия.

pawn Код:
public OnPlayerDisconnect(playerid, reason)
{
    //...
    if(reason < 2) Kick(playerid);
    return 1;
}
Не совсем, но профлудит, пока игрок не отключится окончательно.

pawn Код:
public OnPlayerDisconnect(playerid)
{
    static DisconnectState[MAX_PLAYERS char];
    if(!DisconnectState{playerid}) Kick(playerid), DisconnectState{playerid} = 1;
    else DisconnectState{playerid} = 0;
}
ЗЫ. Такой код может повлиять на работу некоторых инклудов/плагинов
Reply
#27

Quote:
Originally Posted by stabker
Посмотреть сообщение
pawn Код:
public OnPlayerDisconnect(playerid, reason)
{
    //...
    Kick(playerid);
    return 1;
}
Уже давно начали подменять причину выхода, отправляется пакет что ты как-бы кикнут, но ты еще можешь спокойно сервер положить.
Reply
#28

Quote:
Originally Posted by sniper-termit
Посмотреть сообщение
Уже давно начали подменять причину выхода, отправляется пакет что ты как-бы кикнут, но ты еще можешь спокойно сервер положить.
И по фиг что причина выхода определяется и устанавливается на сервере.
Бред в преть писать не будем, ок!?
Reply
#29

Quote:
Originally Posted by sniper-termit
Посмотреть сообщение
Уже давно начали подменять причину выхода, отправляется пакет что ты как-бы кикнут, но ты еще можешь спокойно сервер положить.
Если в OnPlayerDisconnect кикнуть еще в добавок, то уже не сможешь
Reply
#30

Quote:
Originally Posted by exclide1
Посмотреть сообщение
Нет. Я проверял, прежде чем скинуть.
вот данные просто игрока
Код:
Network Active: 1
Network State: 8
Messages in Send buffer: 0
Messages sent: 59687
Bytes sent: 2770820
Acks sent: 388
Acks in send buffer: 0
Messages waiting for ack: 0
Messages resent: 94
Bytes resent: 2051
Packetloss: 0.1%
Messages received: 51833
Bytes received: 1458804
Acks received: 0
Duplicate acks received: 90
Inst. KBits per second: 47.0
KBits per second sent: 167.9
KBits per second received: 168.9
как видишь может свободно быть выше 150
Reply
#31

Как вы смотрите на такую защиту
pawn Code:
new gTimer;
public OnFilterScriptInit()
{
    gTimer = SetTimer("GetNetworkStatsTimer", 1000, 1);
    print(" antipizdos v0.2 By: DANGER1979");
    print("_____________________________________________");
    print(" ");
    return true;
}
public OnFilterScriptExit()
{
    KillTimer(gTimer); gTimer = -1;
    return 1;
}
forward GetNetworkStatsTimer();
public GetNetworkStatsTimer()
{
    new stats[500]; new pip[16]; new playername[MAX_PLAYER_NAME];
    for(new i; i<MAX_PLAYERS; i++)
    {
        if(!IsPlayerConnected(i)) continue;
        if(IsPlayerNPC(i)) continue;
        //if(!IsPlayerConnected(i)) return Kick(i);
        //new stats[418+1];
        GetPlayerNetworkStats(i, stats, sizeof(stats));
       
        new MSB = strval(findParam(stats, "Messages in Send buffer: "));
        if(MSB > 10000) {
            GetPlayerName(i, playername, sizeof(playername));
            GetPlayerIp(i, pip, sizeof(pip));
            printf("antipizdos: kick %s[%d][ip:%s]. Messages in Send buffer: %d", playername, i, pip, MSB);
            Kick(i);
        }
       
        new AS = strval(findParam(stats, "Acks sent: "));
        if(AS > 3000) {
            GetPlayerName(i, playername, sizeof(playername));
            GetPlayerIp(i, pip, sizeof(pip));
            printf("antipizdos: kick %s[%d][ip:%s]. Acks sent: %d", playername, i, pip, AS);
            Kick(i);
        }
    }
    return 1;
}
проверил вроде работает
[02/12/2013 12:53:30] Packet was modified, sent by id: 15, ip: 188.116.54.12:51757
...
[02/12/2013 12:53:33] Packet was modified, sent by id: 15, ip: 188.116.54.12:51757
[02/12/2013 12:53:33] antipizdos: kick Vova_Betman[15][ip:188.116.54.12]. Acks sent: 4197

что не так? что исправить? как у вас?
Reply
#32

По-моему, лучше отлавливать 'Messages received', и получать разность каждую секунду.
Acks sent постепенно достигнет значения в 3000, и тогда будет плохо.

А 'Messages received', на мой взгляд, самый надежный.

Мой вариант:
pawn Code:
public OnGameModeInit()
{
    SetTimer("AntiDOS", 950, true);
}

new m_per_sec[MAX_PLAYERS];

forward AntiDOS();
public AntiDOS()
{
    new str[268];
    new mes;
    new find;
   
    for(new i=0;i<MAX_PLAYERS;i++)
    {
        if(IsPlayerConnected(i))
        {
            GetPlayerNetworkStats(i, str, 268);
           
            find = strfind(str, "Messages received:", false, 205);
            if(find != -1)
            {
                mes = strval(str[find+18]);

                if((mes - m_per_sec[i]) >= 500)
                {
                    SetTimerEx("testDos", 200, false, "%d%d", i, (mes - m_per_sec[i]));//Во время выхода игрока с сервера, таймер может сработать, тогда значение подпрыгнет примерно до 115000, это не допустимо
                }

                m_per_sec[i] = mes;
            }
        }
    }
    return true;
}

forward testDos(playerid, messages);
public testDos(playerid, messages)
{
    if(IsPlayerConnected(playerid))
    {
        //Ban(playerid);
    }
    return false;
}

public OnPlayerConnect(playerid)
{
    m_per_sec[playerid] = 2147483647;
}
Reply
#33

Если Messages received:
то какую разность надо отслеживать?

У Messages received: по-моему вообще нету зависимости, просмотрев статы нескольких игроков.
Reply
#34

Попробуй подосить и увидишь.

Отредактировал верхний пост.
Reply
#35

Quote:
Originally Posted by Slava[LSW]
View Post
По-моему, лучше отлавливать 'Messages received', и получать разность каждую секунду.
Acks sent постепенно достигнет значения в 3000, и тогда будет плохо.
А 'Messages received', на мой взгляд, самый надежный.
По мне так "Bytes received". Включает запросы и сообщения.

PHP Code:
#include <a_samp>
new NET_Bytes[MAX_PLAYERS];
new 
NET_Warning[MAX_PLAYERS char];
new 
NET_Timer=-1;
public 
OnFilterScriptInit()
{
    
NET_Timer=SetTimer("NET"9551);
    return 
1;
}
public 
OnFilterScriptExit()
{
    
KillTimer(NET_Timer);
    
NET_Timer=-1;
    return 
1;
}
public 
OnPlayerConnect(playerid)
{
    
NET_Warning{playerid}=0;
    
NET_Bytes[playerid]=0;
    return 
1;
}
forward NET();//В секундный таймер
public NET()
{
    new 
pack[1024],pa[12];
    for(new 
playerid=MAX_PLAYERS;playerid--;)if(IsPlayerConnected(playerid))
    {
        
GetPlayerNetworkStats(playerid,pack,sizeof(pack));
        new 
packet=strfind(pack,"Bytes received:")+16;
        
strmid(pa,pack,packet,packet+12);
        
packet=strval(pa);
        if((
packet-NET_Bytes[playerid]) > 3000)//3000 изменить на ваше желаемое.
        
{
            ++
NET_Warning{playerid};
            if(
NET_Warning{playerid} == 2)
            {
                
Kick(playerid);
                print(
"Paket");
            }
        }
        else 
NET_Warning{playerid}=0;
        
NET_Bytes[playerid]=packet;
    }

Reply
#36

Quote:

for(new playerid=MAX_PLAYERS;playerid--;)if(IsPlayerConnected(playerid))

Quote:

++NET_Warning{playerid};

что это за стиль писания?
Reply
#37

Quote:
Originally Posted by DANGER1979
View Post
что это за стиль писания?
Кручу, верчу, запутать хочу.
Изначально так было,
Quote:

if(++NET_Warning{playerid} == 2)

вынес, чтобы было понятнее. Ну а цикл от Степашки подхватил.
Reply
#38

У меня значения Bytes received слишком сильно прыгают, поэтому использую Messages received, это стабильнее
Reply
#39

Quote:
Originally Posted by Slava[LSW]
View Post
У меня значения Bytes received слишком сильно прыгают, поэтому использую Messages received, это стабильнее
Когда досить начинают, там значения от 60.000 и выше. Счётчик Предупреждений как раз таки от прыжков спасёт.
Каждый выбирает то, что для него удобнее
Reply
#40

Кол-во входов
public OnPlayerConnect(playerid)
{
if(IsPlayerNPC(playerid)) { return 1; }
numplayers ++;

не совпадает с кол-вом выходов
public OnPlayerDisconnect(playerid, reason)
{
if(IsPlayerNPC(playerid)) { return 1; }
numplayers --;

Как такое может быть? При чем кол-во numplayers ушло на -1206513.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)