Saltar al contenido
Blog

Dupeo o exploit de dinero en FiveM: deshazlo con un backup

¿Alguien ha dupeado objetos o se ha dado dinero? Encuentra cuándo empezó, elige el backup justo anterior y haz rollback de la base perdiendo lo mínimo.

Por PK

9 min de lectura
  • Backups
  • Rollback
  • Dupes
  • Economy
En esta página

Cuando un jugador duplica objetos o un cheater se da dinero en tu servidor de FiveM, la solución más limpia es restaurar la base de datos desde un backup hecho justo antes. Borrar las copias a mano casi nunca funciona, porque para cuando te das cuenta, el dinero y los objetos ya están en manos de otros jugadores. Este post explica cómo suelen ocurrir estos exploits, cómo encontrar el punto de restauración correcto, cuándo hacer rollback para todos y cuándo solo para unos pocos jugadores, y cómo lo hacen los backups de FiveDock desde el panel.

La mayoría de servidores llegan a FiveDock por su CDN, para las imágenes de ox_inventory y las fotos del móvil. FiveDock también hace backups de la base de datos de tu servidor, en todos los planes, el gratuito incluido. Y eso es lo que te salva la noche en que alguien rompe la economía.

Cómo se ve un dupeo o un exploit de dinero

Normalmente empieza con un mensaje en Discord. Alguien vende rifles a mitad de precio, un jugador nuevo se ha comprado tres superdeportivos el primer día o el mercado se llena de repente de un objeto que debería ser raro. Lo miras y un personaje tiene 40 millones en el banco, mientras que el siguiente más rico tiene 200 000.

Detrás casi siempre hay una de estas causas:

  • Un evento de servidor que se fía del cliente. Un script de trabajo paga la cantidad que manda el cliente, y alguien con un menú de trampas llama a ese evento con 9 999 999 en vez de 450.
  • Una condición de carrera en el inventario. Dos jugadores mueven el mismo stack en el mismo momento, un intercambio termina justo cuando uno de los dos se desconecta, o el servidor se cae después de mover un objeto pero antes del siguiente guardado. El objeto acaba en los dos sitios.
  • Un script de tienda o crafteo que paga antes de comprobar. Entrega el dinero y solo después intenta quitar el objeto, o acepta una cantidad negativa.
  • Un error del staff. Un /givemoney con tres ceros de más, o una cuenta de staff en la que ha entrado otra persona.

Por qué limpiarlo a mano casi nunca funciona

Lo primero que sale es vaciarle la cuenta al cheater y banearlo. Eso arregla una fila. Para cuando te enteras, el dinero suele estar ya en coches, casas y bolsillos de otros jugadores, y los objetos dupeados se han vendido, guardado en stashes y regalado a amigos. Cada uno de esos sitios es otra fila en otra tabla, y alguno se te va a escapar.

Un backup de antes del exploit no tiene nada de eso. Lo restauras y las copias desaparecen de todas partes a la vez, también de los sitios donde nunca se te habría ocurrido mirar.

Encuentra el punto de restauración correcto

El punto de restauración es el backup más reciente hecho antes de que empezara el exploit. Uno posterior ya contiene las copias. Para encontrarlo:

  1. Encuentra el primer evento explotado. Tus logs de dinero, el historial del jugador en txAdmin o la hora de una alerta te dicen más o menos cuándo apareció la primera transferencia u objeto raro.
  2. Elige el último backup antes de ese momento, no el último antes de que te dieras cuenta.
  3. Comprueba que está limpio antes de usarlo. Cárgalo en una base de datos aparte junto a la de producción y compara los saldos.
terminal
mysql -u root -p -e "CREATE DATABASE restore_check"
mysql -u root -p restore_check < fivem-2026-10-23-2000.sql

Luego mira quién ha ganado más desde ese backup. En QBCore y Qbox:

QBCore · Qbox
SELECT live.citizenid,
  CAST(JSON_EXTRACT(old.money, '$.bank') AS SIGNED) AS bank_then,
  CAST(JSON_EXTRACT(live.money, '$.bank') AS SIGNED) AS bank_now,
  CAST(JSON_EXTRACT(live.money, '$.bank') AS SIGNED)
    - CAST(JSON_EXTRACT(old.money, '$.bank') AS SIGNED) AS gained
FROM fivem.players AS live
JOIN restore_check.players AS old ON old.citizenid = live.citizenid
ORDER BY gained DESC
LIMIT 20;

En ESX el dinero está en la columna accounts de users:

ESX
SELECT live.identifier,
  CAST(JSON_EXTRACT(old.accounts, '$.bank') AS SIGNED) AS bank_then,
  CAST(JSON_EXTRACT(live.accounts, '$.bank') AS SIGNED) AS bank_now,
  CAST(JSON_EXTRACT(live.accounts, '$.bank') AS SIGNED)
    - CAST(JSON_EXTRACT(old.accounts, '$.bank') AS SIGNED) AS gained
FROM fivem.users AS live
JOIN restore_check.users AS old ON old.identifier = live.identifier
ORDER BY gained DESC
LIMIT 20;

Cambia $.bank por $.cash ($.money en ESX) para revisar el efectivo. Los personajes creados después del backup no salen en esta lista, así que míralos aparte. Si el saldo del cheater en el backup parece normal, es un buen punto de restauración. Si ahí ya es enorme, retrocede un backup más.

La misma consulta te enseña a quién le pasó el dinero el cheater. Un jugador que ha ganado unos cuantos millones en una hora sin un trabajo que pague tanto suele ser adonde fue el dinero.

Por qué la frecuencia de los backups decide cuánto pierdes

Un rollback devuelve a cada jugador al momento del backup, así que también se pierde todo lo que hizo desde entonces. Con un backup cada noche a las 04:00 y un exploit descubierto a las 21:00, toda la ciudad pierde 17 horas de juego. Con un backup cada hora, pierde menos de una.

Por eso el tiempo entre el exploit y el momento en que te das cuenta importa tanto como el backup en sí. Las alertas que te avisan en minutos mantienen el rollback corto.

Rollback para todos o solo para unos pocos jugadores

Haz rollback de toda la base cuando las copias se han extendido: hay muchos jugadores implicados, el bug afectó a toda la economía o no sabes quién tiene qué. Todos pierden las mismas pocas horas, pero la economía vuelve a estar limpia.

Restaura solo a unos pocos jugadores cuando lo hicieron una o dos personas y las copias no llegaron lejos. Devuelves sus filas desde el backup y nadie más pierde nada. Restaurar el inventario de un jugador explica cómo, con SQL para ESX y QBCore.

Restaurar solo al cheater mientras sus copias siguen en los inventarios de otros jugadores deja el dupeo en el juego. Comprueba adónde fueron los objetos y el dinero antes de elegir este camino.

Cómo lo resuelven los backups de FiveDock

FiveDock hace todo esto desde el panel, a través del agente que ya corre en tu servidor para el CDN y lo demás. Cada backup se cifra en tu máquina con una clave que nosotros nunca vemos.

  • Backups en todos los planes. Free hace un backup al día y guarda 7 días, City uno al día durante 30 días. Metro hace uno cada hora y guarda las últimas 24 horas hora a hora, luego uno al día durante 30 días y uno a la semana durante 12 semanas.
  • Un backup en cuanto salta una alerta. Las alertas de dinero, en todos los planes, publican en Discord cuando una sola transferencia supera un umbral o un jugador gana dinero demasiado rápido. Las alertas de objetos duplicados en Metro detectan el mismo objeto único en dos sitios, o un stack que crece sin explicación. Cada alerta hace un backup en ese mismo segundo y lo enlaza al hallazgo, así que tienes una foto congelada de quién tenía qué cuando se detectó.
  • Una vista previa antes de cambiar nada. Eliges un backup y ves qué va a cambiar el rollback antes de confirmar. Toda la base o todo el servidor se restaura en todos los planes; una sola tabla o un solo jugador es cosa de Metro.
  • Primero, un backup de seguridad. Antes de cada rollback, FiveDock guarda el estado actual. ¿Elegiste la hora equivocada? Vuelves a donde estabas.
  • El framework no deshace tu trabajo. Un rollback de la base se rechaza mientras ESX, QBCore o Qbox estén corriendo, porque el framework volvería a escribir encima los jugadores que tiene en memoria. La restauración de un jugador se rechaza mientras ese jugador esté conectado. Las dos se pueden forzar si sabes lo que haces.
  • Solo los owners pueden hacer rollback, y cada uno queda en el registro de auditoría. Un backup borrado se queda bloqueado 30 días, así que ni una cuenta de staff robada puede borrarte el historial.

Los precios y la lista completa de lo que trae cada plan están en precios. Si quieres ver cómo se hacen y se prueban estos backups a mano, lee cómo hacer backup de un servidor de FiveM.

Antes de volver a arrancar el servidor

Cierra primero el agujero. Si el exploit venía de un script, para ese recurso o arréglalo antes del reinicio, o volverá a pasar en menos de una hora. En un evento de dinero, la cantidad la decide siempre el servidor, nunca el cliente:

server.lua
-- Exploitable: the client decides how much it gets paid
RegisterNetEvent('delivery:pay', function(amount)
  local xPlayer = ESX.GetPlayerFromId(source)
  xPlayer.addMoney(amount)
end)

-- Safe: the server decides the amount and checks the job was done
local PAY = 450
local onDelivery = {} -- set by the server when it hands out a job

RegisterNetEvent('delivery:finish', function()
  local src = source
  if not onDelivery[src] then return end
  onDelivery[src] = nil
  ESX.GetPlayerFromId(src).addMoney(PAY)
end)
  1. Banea al cheater por su licencia y los demás identificadores que muestra txAdmin, no solo a su personaje.
  2. Diles a los jugadores a qué hora has vuelto y por qué. La gente acepta mucho mejor una noche perdida cuando sabe que fue un cheater y no tú.
  3. Guarda un tiempo el backup de seguridad y el de la alerta. Muestran lo que pasó si alguien recurre el ban.

Preguntas frecuentes

¿Hasta dónde hago rollback en FiveM después de un dupeo?

Hasta el backup más reciente hecho antes del primer evento explotado, no antes de que te dieras cuenta. Cárgalo primero en una base de datos aparte y comprueba que el saldo y los objetos del cheater se ven normales ahí.

¿Los jugadores pierden progreso si hago rollback de la base?

Sí, todo lo que pasó desde el backup. Con backups cada hora es menos de una hora; con uno cada noche puede ser casi un día entero. Si solo hubo unos pocos jugadores implicados, restaura solo sus filas.

Un cheater se ha dado dinero. ¿Basta con quitárselo?

Solo si el dinero nunca salió de su personaje. Normalmente ya está en coches, casas o cuentas de otros jugadores, y quitarlo de una fila deja el resto. Volver a un backup de antes es más rápido y lo pilla todo.

¿Puede txAdmin hacer rollback de la base de datos?

No. txAdmin gestiona el proceso del servidor, los bans y el historial de jugadores, pero no hace backup ni restaura tu base MySQL o MariaDB. Para eso necesitas mysqldump programado o una herramienta como FiveDock.

¿Los backups de FiveDock vienen en el plan gratuito?

Sí. Free hace un backup diario, lo guarda 7 días y puede restaurar toda la base. Los backups cada hora, las alertas de objetos duplicados y la restauración de un solo jugador son de Metro.

Todos los artículos