Solo usuarios registrados pueden comentar y agradecer, Logueate o Registrate

Autor Topic: AntiFlood/AntiDDoS MuEmu (GS,MHP,CS,etc) + Fix Reconexión  (Visto 1168 veces)

0 Miembros and 1 Guest are viewing this topic.

Offline Duvy Posteado: January 12, 2024, 07:09:47 PM | Modificado: January 13, 2024, 03:46:50 PM by Duvy

  • ESTAFADOR
  • -1 puntos por ventas
  • *
  • Rank: Principiante
  • Posts: 26
  • Gracias recibida: 484
  • uy
Hola gente!!  cool2

Hoy quisiera compartirles una versión modificada del código aportado por @kind (https://tuservermu.com.ve/index.php?topic=32550) con algunas mejoras, principalmente la solución a los bloqueos falso-positivos que ocurren en caso de reconexiones, estos ocurren cuando un usuario con multicuentas las reconecta todas juntas.

¿Cómo funciona este fix?
Básicamente se genera una "whitelist" que perdurará mientras el servidor esté activo, los usuarios que ingresen una cuenta válida son agregados a esta whitelist, entonces aunque luego ocurra una reconexión la IP del usuario no será baneada aunque se realicen muchas conexiones (reconexiones en este caso) al mismo tiempo.

Cómo otro pequeño extra he agregado variables que pueden ser configuradas desde "GameServerInfo - Common.dat".
Verán que en el título se menciona el MHP y el CS además del GameServer, esto es porque el código en realidad tambien funciona para ellos, lo que van a tener que ver es cómo llamar la función "InsertRealUser" en CS y MHP, aunque para el MHP es bastante sencillo y pueden hacerlo justo cuando se imprime el HardwareID del usuario ya que las conexiones por ataques no tienen ningún HardwareID asociado.

No adjunto video del funcionamiento porque básicamente van a ver lo mismo que en la publicación de @kind


Empecemos...

Creo que no me estoy olvidando de nada, pero si es el caso háganmelo saber!!

Gracias:

venoha, yokkjll, Tester1838a, sanlp, waynemartins, darkes607, frenzo2009, taovanluc, Aero, mrbeng296, thaylormello, MUXP, oswaldo159, jeuzinn, amadeusx2, showmax, trinidad191817, mauri64, kaisudo, max1musn1, SkullDs, dreamboy7, ellite3, jonathadll, mkslep, Xysad, usersa, leehenry1208, josepin, ArnoldGarcia, InFamous, jayprotect2013, Demonu, muesmeralada20, S!ngle, vituocgia, ninjanegro, scfmt, phong, 0911300989, ScottLy, thiagaodomu, RaStraBaN, hieu95, OBBY, anhdatz2023, lozlomoka, VERNERON, coolgepds, warrior, aof10022535, kailknight, onlinezajzaj, harry130, wellihard, lechianh88, dakosmu, GabrielDev, louis, carper, juan1997, Greenland, clockbooster, alivejr, NghienMU, Platinum, vaneavanea31, z348870672, beecubin, hfhmu, distuber1, samsunggon, musouls, andreyzz, leoferrarezi, legacy101, kellington, Deivide, timaster, Smudevelop, lehuuducmjnh, komandirbk, Amarilofx, nylanpro, zHammer, BDCAM, awebravo, mustx1, NoobDK, Ultima, kimrubi, Matt1995, redf0x, 7glorious, dizzys, DjGamer, NVPGame, dark, mediodas20, zhangjianle865, Xenos, dahouzi, Odisk, ledemkhoc, stopk, zerg24, oxey.mu, Nakamura, Xingaw, god_mode, mutantekut, CezarMaster, leonardo24, Genius05, nic269, antonionnigomes, calibur, spartacus, xufqing, vnshell, saske98, CAPITOL, son1xx2, Thuong10c8, Orion88, phuongcuongmsqm, zodiacddos, dedicadobk, djagripnos, xlockee, brahian1891, beibei, felipesanto, whisky123, Darckz, ZabiinoOo, c4nhsatcodong, mugloves99, kaiocnx, korron, rodrigoo22, brunoap, pedrob, MsotoC, Genilson23, Ryzenn, Kaito, CorsarioDgx

Offline rodrigoo22 #1 Posteado: January 13, 2024, 09:35:53 AM

  • 0 puntos por ventas
  • *
  • Rank: Destacado
  • Posts: 80
  • Gracias recibida: 271
  • ar
hola alguna solucion para esto?    195   IntelliSense: la declaración no es compatible con "void CIpManager::InsertIpAddress(char *IpAddress, char *Account)" (se declara en la línea 26 de gameserver\gameserver\IpManager.h")   gameserver\gameserver\ipmanager.cpp   87
   194   IntelliSense: class "IP_ADDRESS_INFO" no tiene ningún miembro "IsRealPlayer"   gameserver\gameserver\ipmanager.cpp   31
   196   IntelliSense: class "IP_ADDRESS_INFO" no tiene ningún miembro "IsRealPlayer"   gameserver\gameserver\ipmanager.cpp   134
   197   IntelliSense: class "IP_ADDRESS_INFO" no tiene ningún miembro "IsRealPlayer"   gameserver\gameserver\ipmanager.cpp   136
Error   75   error C2511: 'void CIpManager::InsertIpAddress(char *)' : la función miembro sobrecargada no se ha encontrado en 'CIpManager'   \GameServer\GameServer\IpManager.cpp   88
Error   74   error C2039: 'IsRealPlayer' : no es un miembro de 'IP_ADDRESS_INFO'   ameServer\GameServer\IpManager.cpp   31
Error   76   error C2039: 'IsRealPlayer' : no es un miembro de 'IP_ADDRESS_INFO'   \GameServer\GameServer\IpManager.cpp   134
Error   77   error C2039: 'IsRealPlayer' : no es un miembro de 'IP_ADDRESS_INFO'   \GameServer\GameServer\IpManager.cpp   136
 soy ow y me aparecen esos errores

Gracias:


Offline Duvy #2 Posteado: January 13, 2024, 03:48:11 PM

  • ESTAFADOR
  • -1 puntos por ventas
  • *
  • Rank: Principiante
  • Posts: 26
  • Gracias recibida: 484
  • uy
hola alguna solucion para esto?    195   IntelliSense: la declaración no es compatible con "void CIpManager::InsertIpAddress(char *IpAddress, char *Account)" (se declara en la línea 26 de gameserver\gameserver\IpManager.h")   gameserver\gameserver\ipmanager.cpp   87
   194   IntelliSense: class "IP_ADDRESS_INFO" no tiene ningún miembro "IsRealPlayer"   gameserver\gameserver\ipmanager.cpp   31
   196   IntelliSense: class "IP_ADDRESS_INFO" no tiene ningún miembro "IsRealPlayer"   gameserver\gameserver\ipmanager.cpp   134
   197   IntelliSense: class "IP_ADDRESS_INFO" no tiene ningún miembro "IsRealPlayer"   gameserver\gameserver\ipmanager.cpp   136
Error   75   error C2511: 'void CIpManager::InsertIpAddress(char *)' : la función miembro sobrecargada no se ha encontrado en 'CIpManager'   \GameServer\GameServer\IpManager.cpp   88
Error   74   error C2039: 'IsRealPlayer' : no es un miembro de 'IP_ADDRESS_INFO'   ameServer\GameServer\IpManager.cpp   31
Error   76   error C2039: 'IsRealPlayer' : no es un miembro de 'IP_ADDRESS_INFO'   \GameServer\GameServer\IpManager.cpp   134
Error   77   error C2039: 'IsRealPlayer' : no es un miembro de 'IP_ADDRESS_INFO'   \GameServer\GameServer\IpManager.cpp   136
 soy ow y me aparecen esos errores


Ya lo corregí en el post gracias por avisar!! el problema es que me habia olvidado de "WORD IsRealPlayer;" en "struct IP_ADDRESS_INFO" del IpManager.h, o sea, remplaza

Code: [Select]
struct IP_ADDRESS_INFO
{
char IpAddress[16];
WORD IpAddressCount;
WORD IpFloodAttemps;
WORD IpBlocked;
DWORD IpBlockedTime;
DWORD IpTime;
DWORD IpTime2;
DWORD IpFloodLastTime;
};


Por

Code: [Select]
struct IP_ADDRESS_INFO
{
char IpAddress[16];
WORD IpAddressCount;
WORD IpFloodAttemps;
WORD IpBlocked;
WORD IsRealPlayer;
DWORD IpBlockedTime;
DWORD IpTime;
DWORD IpTime2;
DWORD IpFloodLastTime;
};

Gracias:


Offline rodrigoo22 #3 Posteado: January 13, 2024, 03:58:22 PM

  • 0 puntos por ventas
  • *
  • Rank: Destacado
  • Posts: 80
  • Gracias recibida: 271
  • ar
   2   IntelliSense: hay demasiados argumentos en la llamada a función   gameserver\gameserver\user.cpp   1464
Error   1   error C2660: 'CIpManager::InsertIpAddress' : la función no acepta 2 argumentos   Desktop\GameServer\GameServer\User.cpp   1464

Ahora tengo estos 2 en user.cpp disculpa soy now y no se nada des programacion


Offline Duvy #4 Posteado: January 13, 2024, 04:27:53 PM

  • ESTAFADOR
  • -1 puntos por ventas
  • *
  • Rank: Principiante
  • Posts: 26
  • Gracias recibida: 484
  • uy
   2   IntelliSense: hay demasiados argumentos en la llamada a función   gameserver\gameserver\user.cpp   1464
Error   1   error C2660: 'CIpManager::InsertIpAddress' : la función no acepta 2 argumentos   Desktop\GameServer\GameServer\User.cpp   1464

Ahora tengo estos 2 en user.cpp disculpa soy now y no se nada des programacion


Por el error entiendo que tu función "InsertIpAddress" del IpManager.cpp aceptaba 2 argumentos en lugar de 1 solo (InsertIpAddress(char* IpAddress)) como sucede en los files de Louis (al menos hasta update 15 que son los ultimos sources liberados), pero deberias poder adaptarlo sin mucho problema.
Hagamos algo, muestrame el IpManager.cpp completo ANTES de que lo modificaras para colocar el AntiDDoS, y de paso dinos que files son así lo adapto y lo dejo fijado para usuarios que puedan tener el mismo problema.


Offline rodrigoo22 #5 Posteado: January 13, 2024, 04:55:04 PM

  • 0 puntos por ventas
  • *
  • Rank: Destacado
  • Posts: 80
  • Gracias recibida: 271
  • ar
lo que hice fue cambiar esta linea gIpManager.InsertIpAddress(lpObj->IpAddr, lpObj->Account); por gIpManager.InsertIpAddress(lpObj->IpAddr); con chat gpt y compilo sin problemas no se si esta bien


Offline Duvy #6 Posteado: January 13, 2024, 05:12:24 PM

  • ESTAFADOR
  • -1 puntos por ventas
  • *
  • Rank: Principiante
  • Posts: 26
  • Gracias recibida: 484
  • uy
lo que hice fue cambiar esta linea gIpManager.InsertIpAddress(lpObj->IpAddr, lpObj->Account); por gIpManager.InsertIpAddress(lpObj->IpAddr); con chat gpt y compilo sin problemas no se si esta bien

O sea puede estar bien o no, "gIpManager.InsertIpAddress(lpObj->IpAddr);" es la forma de llamar el InsertIpAddress que tengo yo y la mayoria de los files, pero si tus files tambien guardaban la cuenta asociada a esa ip (lpObj->Account) sería recomendable adaptar el código en vez de recortar algo, que por algo lo pusieron ahi.
Puede que no te de ningun problema o puede que si, no se.


Online komandirbk #7 Posteado: January 13, 2024, 05:27:11 PM

  • 0 puntos por ventas
  • *
  • Rank: Dedicado
  • Posts: 40
  • Gracias recibida: 50
  • ua
Is this better or worse?
Code: [Select]
// IpManager.cpp: implementation of the CIpManager class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "IpManager.h"
#include "ServerInfo.h"
#include "Log.h"
#include "Util.h"

CIpManager gIpManager;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CIpManager::CIpManager()
{

}

CIpManager::~CIpManager()
{

}

//Reemplazar funcion entera:
bool CIpManager::CheckIpAddress(char* IpAddress)
{
std::map<std::string,IP_ADDRESS_INFO>::iterator it = this->m_IpAddressInfo.find(std::string(IpAddress));

if(it == this->m_IpAddressInfo.end())
{
return ((gServerInfo.m_MaxIpConnection==0)?0:1);
}
//guarda el tiempo entre cada conexion recibida
if(it->second.IpTime != 0)
{
it->second.IpTime2 = it->second.IpTime;
it->second.IpTime = GetTickCount();
}

if(!it->second.Account)
{
//bloquea si recibe 2 conexiones en menos de 1 segundo, medio sanguinario.
if(abs((int)((it->second.IpTime-it->second.IpTime2)) < 1000))
{
it->second.IpBlocked = 1;
it->second.IpBlockedTime = GetTickCount();
gLog.Output(LOG_ANTIFLOOD,"FLOOD ATTEMPT DETECTED - BAN IP: %s", IpAddress);
LogAdd(LOG_RED,"FLOOD ATTEMPT DETECTED - BAN IP: %s", IpAddress);
return 0;
}
}
//funcion para desbanear el ip
if(it->second.IpBlockedTime != 0 && abs((int)((GetTickCount()-it->second.IpBlockedTime))) > gServerInfo.m_BannedDuration) // 600000 tiempo de bloqueo del ip
{
gLog.Output(LOG_ANTIFLOOD,"IP IS UNBAN: %s", IpAddress);
LogAdd(LOG_RED,"IP IS UNBAN: %s", IpAddress);
it->second.IpBlocked = 0;
it->second.IpBlockedTime = 0;
}

//funcion para rechazar el ip bloqueado
if(it->second.IpBlocked > 0)
{
return 0;
}

//detecta si recibio mas de X intentos de conexion ya habiendo superado el limite de maxipconnection en menos de 1 minuto.
if(it->second.IpFloodAttemps > 0 && (abs((int)((GetTickCount()-it->second.IpFloodLastTime))) < 60000))
{
it->second.IpBlocked = 1;
it->second.IpBlockedTime = GetTickCount();
gLog.Output(LOG_ANTIFLOOD,"FLOOD ATTEMPT DETECTED - BAN IP: %s", IpAddress);
LogAdd(LOG_RED,"FLOOD ATTEMPT DETECTED - BAN IP: %s", IpAddress);
return 0;
}
else
{
if((int)it->second.Offattack >= gServerInfo.m_MaxIpConnection)
{
return 1;
}
else
{
if(it->second.IpAddressCount >= gServerInfo.m_MaxIpConnection)
{
//guarda los intentos de conexion superando el maxipconnection
it->second.IpFloodAttemps++;
it->second.IpFloodLastTime = GetTickCount();
return 0;
}
}

return 1;
}
}

void CIpManager::InsertIpAddress(char* IpAddress, char* Account)
{
IP_ADDRESS_INFO info;

strcpy_s(info.IpAddress, IpAddress);
strcpy_s(info.Account, Account);

info.IpAddressCount = 1;
//Agregar luego de info.IpAddressCount = 1;
info.IpFloodAttemps = 0;
info.IpBlocked = 0;
info.IpTime = GetTickCount();
info.IpBlockedTime = 0;
info.IpFloodLastTime = 0;
info.IpTime2 = 0;
info.Offattack = 0;

std::map<std::string,IP_ADDRESS_INFO>::iterator it = this->m_IpAddressInfo.find(std::string(IpAddress));

if(it == this->m_IpAddressInfo.end())
{
this->m_IpAddressInfo.insert(std::pair<std::string,IP_ADDRESS_INFO>(std::string(IpAddress),info));
}
else
{
it->second.IpAddressCount++;
}
}

void CIpManager::RemoveIpAddress(char* IpAddress)
{
std::map<std::string,IP_ADDRESS_INFO>::iterator it = this->m_IpAddressInfo.find(std::string(IpAddress));

if(it != this->m_IpAddressInfo.end())
{
if((--it->second.IpAddressCount) == 0 && it->second.IpBlocked == 0)
{
this->m_IpAddressInfo.erase(it);
}
}
}


Offline rodrigoo22 #8 Posteado: January 13, 2024, 05:52:43 PM

  • 0 puntos por ventas
  • *
  • Rank: Destacado
  • Posts: 80
  • Gracias recibida: 271
  • ar
este es el que me pediste mejor adaptar como decis vos antes de hacer macana // IpManager.cpp: implementation of the CIpManager class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "IpManager.h"
#include "ServerInfo.h"
#include "Log.h"
#include "Util.h"

CIpManager gIpManager;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CIpManager::CIpManager() // OK
{

}

CIpManager::~CIpManager() // OK
{

}

//Reemplazar funcion entera:
bool CIpManager::CheckIpAddress(char* IpAddress) // OK
{
   std::map<std::string,IP_ADDRESS_INFO>::iterator it = this->m_IpAddressInfo.find(std::string(IpAddress));

   if(it == this->m_IpAddressInfo.end())
   {
      return ((gServerInfo.m_MaxIpConnection==0)?0:1);
   }
   //guarda el tiempo entre cada conexion recibida
   if(it->second.IpTime != 0)
   {
      it->second.IpTime2 = it->second.IpTime;
      it->second.IpTime = GetTickCount();
   }

   if(!it->second.Account)
   {
      //bloquea si recibe 2 conexiones en menos de 1 segundo, medio sanguinario.
      if(abs((int)((it->second.IpTime-it->second.IpTime2)) < 1000))
      {
         it->second.IpBlocked = 1;
         it->second.IpBlockedTime = GetTickCount();
         gLog.Output(LOG_ANTIFLOOD,"FLOOD ATTEMPT DETECTED - BAN IP: %s", IpAddress);
         LogAdd(LOG_RED,"FLOOD ATTEMPT DETECTED - BAN IP: %s", IpAddress);
         return 0;
      }
   }
   //funcion para desbanear el ip
   if(it->second.IpBlockedTime != 0 && abs((int)((GetTickCount()-it->second.IpBlockedTime))) > gServerInfo.m_BannedDuration) // 600000 tiempo de bloqueo del ip
   {
      gLog.Output(LOG_ANTIFLOOD,"IP IS UNBAN: %s", IpAddress);
      LogAdd(LOG_RED,"IP IS UNBAN: %s", IpAddress);
      it->second.IpBlocked = 0;
      it->second.IpBlockedTime = 0;
   }

   //funcion para rechazar el ip bloqueado
   if(it->second.IpBlocked > 0)
   {
      return 0;
   }

   //detecta si recibio mas de X intentos de conexion ya habiendo superado el limite de maxipconnection en menos de 1 minuto.
   if(it->second.IpFloodAttemps > 0 && (abs((int)((GetTickCount()-it->second.IpFloodLastTime))) < 60000))
   {
      it->second.IpBlocked = 1;
      it->second.IpBlockedTime = GetTickCount();
      gLog.Output(LOG_ANTIFLOOD,"FLOOD ATTEMPT DETECTED - BAN IP: %s", IpAddress);
      LogAdd(LOG_RED,"FLOOD ATTEMPT DETECTED - BAN IP: %s", IpAddress);
      return 0;
   }   
   else
   {
      if((int)it->second.Offattack >= gServerInfo.m_MaxIpConnection)
      {
         return 1;
      }
      else
      {
         if(it->second.IpAddressCount >= gServerInfo.m_MaxIpConnection)
         {
            //guarda los intentos de conexion superando el maxipconnection
            it->second.IpFloodAttemps++;
            it->second.IpFloodLastTime = GetTickCount();
            return 0;
         }
      }
      
      return 1;
   }
}

void CIpManager::InsertIpAddress(char* IpAddress, char* Account) // OK
{
   IP_ADDRESS_INFO info;

   strcpy_s(info.IpAddress, IpAddress);
   strcpy_s(info.Account, Account);

   info.IpAddressCount = 1;
   //Agregar luego de info.IpAddressCount = 1;
   info.IpFloodAttemps = 0;
   info.IpBlocked = 0;
   info.IpTime = GetTickCount();
   info.IpBlockedTime = 0;
   info.IpFloodLastTime = 0;
   info.IpTime2 = 0;
   info.Offattack = 0;

   std::map<std::string,IP_ADDRESS_INFO>::iterator it = this->m_IpAddressInfo.find(std::string(IpAddress));

   if(it == this->m_IpAddressInfo.end())
   {
      this->m_IpAddressInfo.insert(std::pair<std::string,IP_ADDRESS_INFO>(std::string(IpAddress),info));
   }
   else
   {
      it->second.IpAddressCount++;
   }
}

void CIpManager::RemoveIpAddress(char* IpAddress) // OK
{
   std::map<std::string,IP_ADDRESS_INFO>::iterator it = this->m_IpAddressInfo.find(std::string(IpAddress));

   if(it != this->m_IpAddressInfo.end())
   {
      if((--it->second.IpAddressCount) == 0 && it->second.IpBlocked == 0)
      {
         this->m_IpAddressInfo.erase(it);
      }
   }
}


Offline Duvy #9 Posteado: January 13, 2024, 06:51:10 PM

  • ESTAFADOR
  • -1 puntos por ventas
  • *
  • Rank: Principiante
  • Posts: 26
  • Gracias recibida: 484
  • uy
Se ve bien la función, acordate de dejar la llamada que modificaste en el User.cpp como estaba antes.


Solo usuarios registrados pueden comentar y agradecer, Logueate o Registrate


 

Related Topics

  Subject / Started by Replies Last post
0 Replies
814 Views
Last post June 12, 2018, 03:47:49 AM
by Nexus
4 Replies
1514 Views
Last post July 27, 2018, 01:09:29 PM
by Natzugen
0 Replies
559 Views
Last post March 28, 2020, 08:04:46 PM
by fenospro
19 Replies
4726 Views
Last post March 27, 2022, 11:06:34 PM
by louis
35 Replies
9318 Views
Last post June 30, 2022, 08:45:21 AM
by walkeny