Русское сообщество по скриптингу

SV_ReadClientMessage: unknown command char (66)

Все, что касается защиты серверов от различного рода атак, эксплойтов, бэкдуров и т.д.
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

SV_ReadClientMessage: unknown command char (66)

Сообщение Stimul » 22 авг 2013, 20:25

Привет. Кто-то атакует сервер, в логах вот такой вот флуд: SV_ReadClientMessage: unknown command char (66), в результате чего сервер падает без ошибок. Кто нибудь сталкивался с этим? И кто знает как это исправить?
Аватара пользователя
Stimul
 
Сообщения: 3582
Зарегистрирован: 04 янв 2012, 19:51
Благодарил (а): 192 раз.
Поблагодарили: 1163 раз.
Опыт программирования: Больше трех лет

Re: SV_ReadClientMessage: unknown command char (66)

Сообщение Chuvi » 23 авг 2013, 00:16

Это уже ошибка.
Клиент послал серверу команду с индексом 66, сервер её не знает.
Вариант- попросить клиента не слать левые команды.
(А вообще странно, вроде сервер должен отсоединить такого клиента, а не сам падать)
Плагинами на заказ не занимаюсь.
Своих дел хватает.
Аватара пользователя
Chuvi
Модератор
 
Сообщения: 2253
Зарегистрирован: 24 ноя 2011, 08:03
Благодарил (а): 127 раз.
Поблагодарили: 562 раз.

Re: SV_ReadClientMessage: unknown command char (66)

Сообщение Stimul » 23 авг 2013, 01:05

Заблокировать эту команду как-то можно?
Аватара пользователя
Stimul
 
Сообщения: 3582
Зарегистрирован: 04 янв 2012, 19:51
Благодарил (а): 192 раз.
Поблагодарили: 1163 раз.
Опыт программирования: Больше трех лет

Re: SV_ReadClientMessage: unknown command char (66)

Сообщение seroff » 19 дек 2017, 22:33

Помощь только от орфея думаю:
default:
Con_Printf ("SV_ReadClientMessage: unknown command char\n");
SV_DropClient (cl);
return;

Код:
Код: Выделить всё

void SV_ExecuteClientMessage 
(client_t *cl)
{
    
int        c;
    
char    *s;
    
usercmd_t    oldestoldcmdnewcmd;
    
client_frame_t    *frame;
    
vec3_t o;
    
qboolean    move_issued false//only allow one move command
    
int        checksumIndex;
    
byte    checksumcalculatedChecksum;
    
int        seq_hash;

    
// calc ping time
    
frame = &cl->frames[cl->netchan.incoming_acknowledged UPDATE_MASK];
    
frame->ping_time realtime frame->senttime;

    
// make sure the reply sequence number matches the incoming
    // sequence number 
    
if (cl->netchan.incoming_sequence >= cl->netchan.outgoing_sequence)
        
cl->netchan.outgoing_sequence cl->netchan.incoming_sequence;
    else
        
cl->send_message false;    // don't reply, sequences have slipped        

    // save time for ping calculations
    
cl->frames[cl->netchan.outgoing_sequence UPDATE_MASK].senttime realtime;
    
cl->frames[cl->netchan.outgoing_sequence UPDATE_MASK].ping_time = -1;

    
host_client cl;
    
sv_player host_client->edict;

//    seq_hash = (cl->netchan.incoming_sequence & 0xffff) ; // ^ QW_CHECK_HASH;
    
seq_hash cl->netchan.incoming_sequence;
    
    
// mark time so clients will know how much to predict
    // other players
     
cl->localtime sv.time;
    
cl->delta_sequence = -1;    // no delta unless requested
    
while (1)
    {
        if (
msg_badread)
        {
            
Con_Printf ("SV_ReadClientMessage: badread\n");
            
SV_DropClient (cl);
            return;
        }    

        
MSG_ReadByte ();
        if (
== -1)
            break;
                
        switch (
c)
        {
        default:
            
Con_Printf ("SV_ReadClientMessage: unknown command char\n");
            
SV_DropClient (cl);
            return;
                        
        case 
clc_nop:
            break;

        case 
clc_delta:
            
cl->delta_sequence MSG_ReadByte ();
            break;

        case 
clc_move:
            if (
move_issued)
                return;        
// someone is trying to cheat...

            
move_issued true;

            
checksumIndex MSG_GetReadCount();
            
checksum = (byte)MSG_ReadByte ();

            
// read loss percentage
            
cl->lossage MSG_ReadByte();

            
MSG_ReadDeltaUsercmd (&nullcmd, &oldest);
            
MSG_ReadDeltaUsercmd (&oldest, &oldcmd);
            
MSG_ReadDeltaUsercmd (&oldcmd, &newcmd);

            if ( 
cl->state != cs_spawned )
                break;

            
// if the checksum fails, ignore the rest of the packet
            
calculatedChecksum COM_BlockSequenceCRCByte(
                
net_message.data checksumIndex 1,
                
MSG_GetReadCount() - checksumIndex 1,
                
seq_hash);

            if (
calculatedChecksum != checksum)
            {
                
Con_DPrintf ("Failed command checksum for %s(%d) (%d != %d)\n"
                    
cl->namecl->netchan.incoming_sequencechecksumcalculatedChecksum);
                return;
            }

            if (!
sv.paused) {
                
SV_PreRunCmd();

                if (
net_drop 20)
                {
                    while (
net_drop 2)
                    {
                        
SV_RunCmd (&cl->lastcmd);
                        
net_drop--;
                    }
                    if (
net_drop 1)
                        
SV_RunCmd (&oldest);
                    if (
net_drop 0)
                        
SV_RunCmd (&oldcmd);
                }
                
SV_RunCmd (&newcmd);

                
SV_PostRunCmd();
            }

            
cl->lastcmd newcmd;
            
cl->lastcmd.buttons 0// avoid multiple fires on lag
            
break;


        case 
clc_stringcmd:    
            
MSG_ReadString ();
            
SV_ExecuteUserCommand (s);
            break;

        case 
clc_tmove:
            
o[0] = MSG_ReadCoord();
            
o[1] = MSG_ReadCoord();
            
o[2] = MSG_ReadCoord();
            
// only allowed by spectators
            
if (host_client->spectator) {
                
VectorCopy(osv_player->v.origin);
                
SV_LinkEdict(sv_playerfalse);
            }
            break;

        case 
clc_upload:
            
SV_NextUpload();
            break;

        }
    }
}
 
Аватара пользователя
seroff
 
Сообщения: 9
Зарегистрирован: 19 ноя 2017, 16:34
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около года
Языки программирования: Pawn
SourcePawn
C++
Php
C#


Вернуться в Безопасность и защита серверов

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5