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)

DANGER1979 02/12/2013 06:53 AM

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

Originally Posted by exclide1 (Post 2657244)
Нет. Я проверял, прежде чем скинуть.

вот данные просто игрока
Code:

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

DANGER1979 02/12/2013 07:41 AM

Re: Атака сервера
 
Как вы смотрите на такую защиту
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

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

Slava[LSW] 02/12/2013 08:00 AM

Re: Атака сервера
 
По-моему, лучше отлавливать '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;
}

DANGER1979 02/12/2013 08:09 AM

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

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

Slava[LSW] 02/12/2013 08:15 AM

Re: Атака сервера
 
Попробуй подосить и увидишь.

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

White_116 02/12/2013 12:10 PM

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

Originally Posted by Slava[LSW] (Post 2803916)
По-моему, лучше отлавливать '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;
    }



DANGER1979 02/12/2013 12:45 PM

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

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

++NET_Warning{playerid};
что это за стиль писания?

White_116 02/12/2013 12:56 PM

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

Originally Posted by DANGER1979 (Post 2804094)
что это за стиль писания?

Кручу, верчу, запутать хочу.
Изначально так было,
Quote:

if(++NET_Warning{playerid} == 2)
вынес, чтобы было понятнее. Ну а цикл от Степашки подхватил.

Slava[LSW] 02/12/2013 12:56 PM

Re: Атака сервера
 
У меня значения Bytes received слишком сильно прыгают, поэтому использую Messages received, это стабильнее :)

White_116 02/12/2013 01:01 PM

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

Originally Posted by Slava[LSW] (Post 2804114)
У меня значения Bytes received слишком сильно прыгают, поэтому использую Messages received, это стабильнее :)

Когда досить начинают, там значения от 60.000 и выше. Счётчик Предупреждений как раз таки от прыжков спасёт.
Каждый выбирает то, что для него удобнее :D


All times are GMT. The time now is 05:24 AM.

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