WhatsApp Discord
[APORTE] Sistema de Seguridad: Baneo por Hardware ID (HWID) | Lua + SQL - Source Mu - Mu Server Files
 

[APORTE] Sistema de Seguridad: Baneo por Hardware ID (HWID) | Lua + SQL

Publicado por Dakosmu, Abr 04, 2026, 07:50 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Keywords Lua

Dakosmu

[APORTE] Sistema de Seguridad: Baneo por Hardware ID (HWID) | Lua + SQL

Protege tu servidor de usuarios malintencionados con este Sistema de Baneo por HWID. A diferencia del baneo por cuenta o IP, este método identifica la firma única de la computadora, impidiendo que el infractor regrese incluso creando nuevas cuentas.

Este script utiliza una arquitectura híbrida: almacena los datos en SQL Server para persistencia y mantiene una caché en memoria Lua para no afectar el rendimiento (FPS) del GameServer durante las validaciones.

¿Cómo funciona el Sistema (Versión Free)?

Al ejecutar el comando de baneo, el sistema realiza las siguientes acciones automáticas:
  • Obtiene el HWID único del objetivo.
  • Desconecta al usuario inmediatamente.
  • Guarda el identificador en la base de datos SQL.
  • Escanea y cierra todas las cuentas abiertas (multicuenta) desde esa misma PC.

Al intentar reconectar, el escáner de seguridad detecta la PC en la "lista negra" y bloquea el acceso antes de que el usuario llegue a la selección de personaje.

Instrucción de Instalación y Requisitos

  • Verifica que tus Files/GameServer soporten la lectura de HardwareID (Función
    GetObjectHardwareId).
  • Ejecuta el script SQL incluido en la descarga para crear la tabla de bloqueos.
  • Configura la variable
    COMANDO_ID en el script Lua según los comandos libres de tu servidor.
  • Agrega el script a tu carpeta de inicialización de Lua y reinicia el servicio.

Advertencia de compatibilidad: Algunas versiones antiguas de GameServer no exponen el HWID a Lua. Asegúrate de que tu versión sea compatible antes de intentar la instalación.

Si utilizas SubServers: Configura intervalos de refresco distintos (ej: Sub1: 120s / Sub2: 150s) para evitar colisiones en las consultas a la base de datos.

Enlaces de Descarga
Regístrate para ver el enlace

Regístrate para ver el enlace

★ VERSIÓN COMPLETA / PRO (5 USD) ★
Sistema de Baneo Inteligente y Recursivo (Anti-Evasión)

¿Buscas una protección definitiva? La versión PRO aplica una lógica de "contagio" para evitar que el usuario cambie de dispositivo dentro de su red.

  • Baneo en Cadena: Si el usuario intenta entrar desde otra PC en la misma red (IP), el sistema banea automáticamente el HWID de esa nueva computadora.
  • Bloqueo Dual: Combina IP + HWID para que ni el reinicio de router ni el uso de VPN sean efectivos una vez capturado el hardware.
  • Evasión Imposible: Deshabilita el acceso a todo dispositivo que se conecte desde la ubicación del infractor.

¿Necesitas Scripts Personalizados?
Estoy disponible para desarrollos a medida: Eventos únicos, automatizaciones, NPCs Custom y optimización de scripts Lua. ¡Consultame sin compromiso!

Créditos:
0xNoobdll
¿Tienes dudas sobre la implementación o necesitas soporte? ¡Deja tu comentario abajo y te ayudaré con gusto!


hwidban.txt
-- ==========================================================
-- SISTEMA DE SEGURIDAD HWID
-- ==========================================================

local COMANDO_ID = 109
local Blacklist_Memoria = {}
local Ultimo_Refresco_SQL = 0

-- CONFIGURACIÓN DE SQL
local SQL_DB   = "MuOnline"
local SQL_USER = ""
local SQL_PASS = ""

function Cargar_Blacklist_A_Memoria()
    Blacklist_Memoria = {}
    if SQLConnect(SQL_DB, SQL_USER, SQL_PASS) == 1 then
        local query = "SELECT HardwareID FROM Blacklist_HWID"
        if SQLQuery(query) == 1 then
            while SQLFetch() == 1 do
                local id = SQLGetString("HardwareID")
                if id then
                    local cleanID = id:gsub("%s+", ""):upper()
                    Blacklist_Memoria[cleanID] = true
                end
            end
        end
        SQLClose()
        Ultimo_Refresco_SQL = os.time()
    end
end

function Escaner_Seguridad_HWID()
    if os.time() - Ultimo_Refresco_SQL > 120 then
        Cargar_Blacklist_A_Memoria()
    end

    for i = GetMinUserIndex(), GetMaxUserIndex() do
        if GetObjectConnected(i) == 1 then
            local currentHWID = GetObjectHardwareId(i)
            if currentHWID then
                local cleanHWID = currentHWID:gsub("%s+", ""):upper()
                if Blacklist_Memoria[cleanHWID] ~= nil then               
                    UserDisconnect(i)
                end
            end
        end
    end
end

function Comando_Ban_Hardware(aIndex, code, arg)
    if code ~= COMANDO_ID then return 0 end
   
    if GetObjectAuthority(aIndex) < 1 then return 1 end

    local targetName = arg:match("%S+")
    if not targetName then
        MessageSend(aIndex, 0, aIndex, "Uso: /banpc <nombre>")
        return 1
    end

    local targetIndex = GetObjectIndexByName(targetName)
    if targetIndex == -1 then
        MessageSend(aIndex, 0, aIndex, "Usuario no online.")
        return 1
    end

    local rawHWID = GetObjectHardwareId(targetIndex)
    if not rawHWID or rawHWID == "" then
        MessageSend(aIndex, 0, aIndex, "Error: No se pudo leer el HWID.")
        return 1
    end
    local targetHWID = rawHWID:gsub("%s+", ""):upper()


    UserDisconnect(targetIndex)

    if SQLConnect(SQL_DB, SQL_USER, SQL_PASS) == 1 then
        local query = string.format("INSERT INTO Blacklist_HWID (HardwareID, Admin) VALUES ('%s', '%s')", targetHWID, GetObjectName(aIndex))
        SQLQuery(query)
        SQLClose()
       
        Blacklist_Memoria[targetHWID] = true
       
        for i = GetMinUserIndex(), GetMaxUserIndex() do
            if GetObjectConnected(i) == 1 then
                local checkHWID = (GetObjectHardwareId(i) or ""):gsub("%s+", ""):upper()
                if checkHWID == targetHWID then
                    UserDisconnect(i)
                end
            end
        end
       
        MessageSend(aIndex, 0, aIndex, "PC Bloqueada y Conexiones Cerradas.")
        NoticeGlobalSend(0, "Una PC ha sido bloqueada por el Administrador.")
    end

    return 1
end

-- INICIALIZACIÓN
Cargar_Blacklist_A_Memoria()
BridgeFunctionAttach("OnTimerThread", "Escaner_Seguridad_HWID")
BridgeFunctionAttach("OnCommandManager", "Comando_Ban_Hardware")

HWIDBan.sql
USE [MuOnline]
GO

/****** SISTEMA DE BANEO POR HARDWARE ID ******/


IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Blacklist_HWID]') AND type in (N'U'))
BEGIN
    CREATE TABLE [dbo].[Blacklist_HWID](
        -- Columna principal: el HWID (sin espacios y único)
        [HardwareID] [varchar](100) NOT NULL,
       

        [Admin] [varchar](20) NULL,
       

        [Motivo] [varchar](100) NULL DEFAULT ('Baneo por Hardware'),
       

        [FechaBan] [datetime] NULL DEFAULT (getdate()),

       
        CONSTRAINT [PK_Blacklist_HWID] PRIMARY KEY CLUSTERED ([HardwareID] ASC)
    ) ON [PRIMARY]
   
    PRINT 'Tabla Blacklist_HWID creada correctamente.'
END
ELSE
BEGIN
    PRINT 'La tabla Blacklist_HWID ya existe.'
END
GO
Bon Dia

🡱 🡳
Real Time Web Analytics