Presiona ESC para cerrar

Cómo Detectar un Crypto Drainer y Rug Pull a Tiempo

Para detectar un crypto drainer o un rug pull antes de perder tu dinero, inspecciona el smart contract en BscScan o Etherscan buscando código no verificado, funciones mint() ocultas o impuestos de venta (sell taxes) que superen el 10%. Pasa siempre las direcciones del contrato por escáneres automáticos como Token Sniffer, DEXScreener y GoPlus Security para verificar la renuncia de propiedad (ownership renunciation) y la duración del bloqueo de liquidez. Por último, protege tu wallet contra drainers basados en firmas rechazando solicitudes a ciegas de eth_sign, Permit2 o setApprovalForAll, y simula cada transacción usando herramientas como Rabby Wallet o Pocket Universe.

Qué onda a todos. Por acá su Oleg Filatov. Llevo los últimos tres años manteniendo en pie la infraestructura de un exchange mientras lidio con cualquier vector de fraude on-chain que se puedan imaginar. Antes de esto, me la pasaba rompiendo smart contracts en auditorías de seguridad y desvelándome en hackathones de Web3. Vivo y respiro esto; la verdad no hay nada comparable con la descarga de adrenalina de hacerle ingeniería inversa a un payload de bytecode malicioso a las 2 AM y entender exactamente cómo un atacante intentó ejecutar un exploit millonario.

Vamos a meternos de lleno en cómo puedes proteger tu wallet de las minas que están regadas por todo el ecosistema Web3 hoy en día.

1. Comparativa rápida: Honeypot vs. Rug Pull vs. Wallet Drainer

Tipo de ScamCómo funcionaPrincipal señal de alerta (Red Flag)Herramienta principal de detección
HoneypotEl smart contract permite comprar tokens libremente, pero bloquea las llamadas de venta a través de lógica oculta o reverts condicionales.Impuesto de venta del 100%, error TRANSFER_FAILED en swaps de DEX, o cero transacciones de venta en el historial reciente.Token Sniffer / DEXScreener
Rug PullLos devs inyectan liquidez, le hacen hype al token y luego retiran todos los tokens del LP o dumpean su supply asignado en el pool.Liquidez no bloqueada, bloqueo de LP menor a 6 meses, o la wallet del dev holdeando >10% del supply total.DEXTools / Uncx Network
Wallet DrainerUn sitio de phishing te engaña para que firmes un mensaje off-chain o una transacción de allowance que otorga acceso total a tu wallet.Solicitudes de eth_sign, firmas de Permit2 o setApprovalForAll en dApps no verificadas.Pocket Universe / Rabby Wallet

2. Checklist de seguridad paso a paso antes de comprar cualquier token

Paso 1: Escaneo automático del contrato

Pasa la dirección del token por Token Sniffer, la API de GoPlus Security y DEXScreener. Si DEXScreener muestra 800 transacciones de compra y literalmente cero ventas en una ventana de 4 horas, frena ahí mismo. Es un honeypot. Punto.

Paso 2: Duración del bloqueo de liquidez

Un equipo legítimo bloquea sus tokens de Liquidity Pool (LP) a través de protocolos como Uncx Network o PinkSale.

  • Red Flag: La liquidez no está bloqueada, está en una EOA (Externally Owned Account) o está bloqueada por menos de 6 meses.
  • Green Flag: Los tokens de LP están quemados (enviados a 0x000000000000000000000000000000000000dead) o bloqueados en un contrato verificable durante al menos un año.

Paso 3: Verificación de distribución y propiedad (Ownership)

Inspecciona la pestaña Holders en Etherscan o BscScan.

Si un puñado de wallets que no son de exchanges ni de quema (burn) controlan más del 5 al 10% del supply total, tú eres su exit liquidity. Además, revisa si se renunció a la propiedad del contrato (ownership renounced). Si no es así, el dueño puede modificar impuestos arbitrariamente, meter tu dirección en una lista negra (blacklist) o pausar las transferencias cuando se le dé la gana.

Paso 4: Auditoría de transacciones y firmas

Nunca firmes transacciones a ciegas (blind-signing). Los drainers de wallets modernos ya casi no piden transferencias directas de ETH; ahora abusan de firmas off-chain como EIP-712, Permit2 o EIP-2612 para saltarse los avisos de advertencia estándar de las wallets. Usa extensiones de simulación dinámica de transacciones para inspeccionar los cambios de estado antes de transmitir la transacción.

3. Análisis de seguridad a fondo y mecánica del código

Hablemos de la verdadera mecánica técnica. ¿Por qué los analizadores estáticos tradicionales no detectan los scams más sofisticados? Porque los estafadores escriben lógica sensible al contexto (context-aware).

A ver... ¿por qué la gente sigue pensando que la verificación de código en Etherscan garantiza seguridad? Me lo pregunto cada vez que alguien se queja de perder dinero en un proyecto "verificado". La verificación del código fuente solo prueba que el bytecode cargado en la EVM coincide con los archivos de Solidity enviados. ¡No dice absolutamente nada sobre si la lógica dentro de esos archivos es ética o maliciosa!

El truco del Honeypot: Gas-Griefing e impuestos dinámicos

Una técnica común de honeypot consiste en fijar fees estándar del 2% durante el despliegue inicial y luego subir la comisión al 99% dentro de la función _transfer() una vez que entra suficiente liquidez.

Peores aún son los honeypots dinámicos basados en gas-griefing:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/*
 * Mi réplica rápida generada por ingeniería inversa de la lógica de un honeypot que capturé en producción.
 * NO despliegues esto. Es puramente para análisis educativo.
 */
contract SneakyHoneypot {
    address private _owner;
    mapping(address => bool) private _isWhitelisted;
    mapping(address => uint256) private _balances;
    constructor() {
        _owner = msg.sender;
        _isWhitelisted[msg.sender] = true;
    }
    function transfer(address to, uint256 amount) public returns (bool) {
        _transfer(msg.sender, to, amount);
        return true;
    }
    function _transfer(address from, address to, uint256 amount) internal {
        require(_balances[from] >= amount, "ERC20: balance too low");
        // Si es una orden de venta (transferencia a la dirección del pair) y el remitente no está en la whitelist
        if (!_isWhitelisted[from] && !_isWhitelisted[to]) {
            // Truco: Quemar cantidades enormes de gas usando un bucle infinito o una asignación pesada de memoria
            // haciendo que la transacción del comprador falle con un error de "Out of Gas".
            assembly {
                let m := mload(0x40)
                mstore(m, 0xdeadbeef)
                // Quemar gas artificialmente en intentos de venta
                invalid()
            }
        }
        _balances[from] -= amount;
        _balances[to] += amount;
    }
}

¿Ves lo que pasa aquí? Cuando compras, todo sale bien. Pero en el momento en que ejecutas una llamada swapExactTokensForETH en Uniswap, el contrato verifica si tu wallet está en la whitelist. Si no lo está, ejecuta el opcode invalid() o un bucle infinito, consumiendo todo el gas asignado y revirtiendo la transacción con un error criptico. La mayoría de los usuarios retail asumen que "el slippage está muy bajo" y se rinden mientras el dev va drenando el pool poco a poco.

4. Cómo los Wallet Drainers evaden las defensas de Web3

Hablemos de los exploits con firmas off-chain, específicamente el abuso de Permit2 y EIP-712.

Las autorizaciones (allowances) tradicionales requieren que envíes una transacción on-chain llamando a approve(spender, amount). Esto cuesta gas y muestra una ventana emergente bastante clara en la interfaz de la wallet advirtiéndote sobre los permisos.

Los scripts de los drainers se saltan esto utilizando el estándar Permit2 de Uniswap o las aprobaciones EIP-2612. La dApp maliciosa te pide que firmes una cadena de datos aparentemente inofensiva usando la firma de tu wallet (eth_signTypedData_v4). Detrás de escena, esa firma digital le da al smart contract del atacante autorización explícita para transferir tus tokens ERC-20 o NFTs fuera de tu cuenta ¡sin requerir otra confirmación on-chain de tu parte!

// Muestra de payload malicioso construido por scripts de drainer
const domain = {
    name: 'Permit2',
    chainId: 1, // Mainnet
    verifyingContract: '0x000000000022D473030F116dDEE9F6B43aC78BA3' // Dirección oficial de Permit2 en Uniswap
};
const types = {
    PermitSingle: [
        { name: 'details', type: 'PermitDetails' },
        { name: 'spender', type: 'address' },
        { name: 'sigDeadline', type: 'uint256' }
    ],
    PermitDetails: [
        { name: 'token', type: 'address' },
        { name: 'amount', type: 'uint160' },
        { name: 'expiration', type: 'uint48' },
        { name: 'nonce', type: 'uint48' }
    ]
};
// El usuario cree que está iniciando sesión en un sitio, pero en realidad está autorizando el drenado de sus saldos de tokens:
const value = {
    details: {
        token: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", // USDC
        amount: "1461501637330902918203684832716283019655932542975", // Valor máximo para uint160
        expiration: 2000000000,
        nonce: 0
    },
    spender: "0xMaliciousAttackerContractAddressHere...",
    sigDeadline: 2000000000
};

Si firmas este payload, el atacante toma esa firma off-chain, la envía él mismo al contrato de Permit2, paga la tarifa de gas y te roba tus USDC al instante.

5. Ingeniería inversa del bytecode de la EVM: cazando estafas sin código fuente

¿Qué pasa cuando un token nuevo aún no está verificado en Etherscan o BscScan? La mayoría sale corriendo. Pero para un CTO (y ex-auditor de seguridad), el bytecode no verificado es justo donde empieza lo bueno. En realidad, no te hace falta el código fuente original en Solidity para averiguar si un contrato te quiere robar.

Cuando los desarrolladores compilan código de Solidity en bytecode de la EVM, los nombres de las funciones se convierten en identificadores de 4 bytes llamados selectores de función (Function Selectors, es decir, los primeros 4 bytes del hash Keccak-256 de la firma de la función).

Por ejemplo, transfer(address,uint256) siempre da el hash 0xa9059cbb.

Si pegas el bytecode de un contrato no verificado en una herramienta como Dedaub Bytecode Decompiler o ethervm.io, mira directamente al selector dispatcher o busca estos hashes sospechosos de funciones en el bytecode en crudo:

0x40c10f19 -> mint(address,uint256)
0xbf8b0f72 -> enableTrading() / setTradingStatus(bool)
0x0283c741 -> setFee(uint256)
0xe47d6060 -> setBlacklist(address,bool)

Espera... ¿por qué deberían importarte estas firmas exactas? Pues porque si un contrato de token no verificado contiene 0x40c10f19 (mint) y la propiedad (owner) no ha sido renunciada (un-renounced), el dev puede mintear silenciosamente 10 mil millones de tokens de la nada directamente en su wallet privada, dumpearlos en Uniswap y vaciar hasta el último céntimo de liquidez en cuestión de segundos.

Aquí tienes un script simple en Python usando web3.py que utilizo de forma interna para escanear el bytecode de contratos no verificados en busca de funciones de administración peligrosas antes de interactuar con cualquier token:

# Fragmento de herramienta de seguridad interna para detectar firmas de funciones de alto riesgo en bytecode EVM no verificado.
# Escrito para comprobaciones automáticas rápidas durante investigaciones de smart contracts.
from web3 import Web3
# Conectar a un nodo RPC público
w3 = Web3(Web3.HTTPProvider('https://eth.llamarpc.com'))
# Selectores de funciones de 4 bytes de alto riesgo conocidos (hashes Keccak-256)
DANGEROUS_SELECTORS = {
    "0x40c10f19": "mint(address,uint256)",
    "0xe47d6060": "setBlacklist(address,bool)",
    "0x8a8c523c": "preventSell(address)",
    "0x70480932": "pauseTrading()"
}
def analyze_bytecode(contract_address: str):
    # Obtener el bytecode en crudo de la cadena
    code = w3.eth.get_code(Web3.to_checksum_address(contract_address)).hex()
    
    if code == '0x' or len(code) <= 2:
        print("[-] La dirección no tiene ningún código de contrato desplegado (EOA).")
        return
    print(f"[+] Analizando el bytecode de la EVM para: {contract_address}")
    
    found_flags = []
    for selector, func_name in DANGEROUS_SELECTORS.items():
        # Eliminar el prefijo '0x' para buscar en la cadena hexadecimal en crudo
        clean_selector = selector[2:]
        if clean_selector in code:
            found_flags.append(func_name)
    if found_flags:
        print("[!] ¡ALERTA DE BANDERA ROJA! Se han detectado funciones peligrosas en el bytecode:")
        for flag in found_flags:
            print(f"    - {flag}")
    else:
        print("[+] No se han detectado selectores de administración ocultos básicos en el escaneo estándar.")
# Ejemplo de uso con una dirección arbitraria
# analyze_bytecode("0x...")

6. Tácticas avanzadas de drainers: aprobaciones envenenadas y Address Poisoning

Los timadores ya no dependen solo de los pools de liquidez de los DEX; ahora van directos a por el saldo de tu wallet utilizando fallos de experiencia de usuario (UX) y triquiñuelas psicológicas.

Ataques de Address Poisoning (envenenamiento de direcciones)

¿Alguna vez has mirado el historial de tu wallet y has visto una transferencia de 0 ETH o 0,0001 tokens desde una dirección que es prácticamente idéntica a la tuya?

Eso es el Address Poisoning.

Los scripts de los atacantes monitorizan la mempool en busca de transacciones de wallets con pasta. Generan una dirección personalizada (vanity address) mediante un generador por GPU (como profanity) que comparte exactamente los mismos primeros 4-5 dígitos y los últimos 4-5 dígitos con tu wallet (o con una dirección a la que sueles enviar fondos con frecuencia).

Luego, te envían una transacción de valor cero a tu wallet usando transferFrom().

¿El objetivo? Quieren que su dirección falsa aparezca en tu historial de transacciones recientes. La próxima vez que abras tu wallet para enviar fondos, en lugar de teclada la dirección o comprobar cada puñetero carácter, copias y pegas la dirección de arriba del historial... y le mandas tus ETH directos al timador sin darte cuenta.

Regla de oro: ¡Nunca copies direcciones de wallets de tu lista de historial de transacciones! Copia siempre las direcciones de una lista de contactos guardados, un dominio ENS o comprueba cada maldito carácter de la dirección.

7. La checklist definitiva de endurecimiento para la defensa on-chain

Para mantener tus activos a salvo en el Web3 moderno, implementa esta configuración de seguridad operacional (OpSec):

  • Usa hardware wallets separadas para interactuar y para almacenar: Ten una wallet de hardware en "almacenamiento frío" dedicada (Ledger, Trezor, Keystone) que jamás se conecte a dApps, firme mensajes ni reclame airdrops. Mantén otra "burner wallet" independiente con fondos mínimos para los swaps diarios y para interactuar con protocolos DeFi experimentales.
  • Rechaza la firma ciega (blind signing) de mensajes off-chain: Desactiva la "firma ciega" en tu dispositivo hardware siempre que sea posible. Si una dApp web te exige eth_sign o un payload hexadecimal opaco que no puedes leer, recházalo de inmediato.
  • Establece límites de gasto personalizados (Spend Limits): Al aprobar un límite de gasto de un token ERC-20 en Uniswap o 1inch, no selecciones nunca "Ilimitado" (Unlimited). Configura la asignación (allowance) manualmente por la cantidad exacta que planeas tradear. Así, aunque el protocolo sufra un exploit más adelante, tus tokens restantes se quedarán intactos.
  • Higiene de revocación periódica: Ponte un recordatorio en el calendario el día 1 de cada mes para pasarte por Revoke.cash o por el Token Approval Checker de Etherscan y revocar permisos caducados o que ya no uses en todas las redes (Ethereum, Arbitrum, Solana, Base, BSC).

¡Y bueno, creo que eso cubre todas las mecánicas clave! Si te topaste con un contrato sospechoso, tienes dudas sobre los snippets de código o necesitas ayuda para desglosar un hash de transacción raro, déjamelo abajo en los comentarios. ¡Haré todo lo posible por darme una vuelta y responderte!


FAQ

Desconecta tu wallet de esa página chafa de inmediato y revoque todos los permisos activos. Échale mano a herramientas como Revoke.cash o el Approval Checker en Etherscan/BscScan. Si firmaste un permit off-chain para algún token, pásale lo que te queda a una wallet limpia y totalmente nueva al instante; a veces los drainers se guardan esas firmas off-chain para aplicarte el sabadazo nomás ven que sube tu balance.

Nel, claro que sí. La verificación nomás checa que el código fuente coincida con el bytecode desplegado. Un contrato verificado te puede meter un impuesto de venta bien pasado de lanza, funciones de emergency withdraw para el dev, lógica de mint oculta o trabas para transferir. Jamás veas una palomita de verificado como si fuera un certificado de auditoría de seguridad.

Uff, durísimo. El `eth_sign` deja que cualquier app externa te pida la firma de un hash en crudo, la cual pueden usar para autorizar transacciones bien locas u operaciones off-chain en tu nombre sin enseñarte en la interfaz (UI) qué diablos estás firmando. Justo por eso las wallets modernas que se toman la seguridad en serio bloquean el `eth_sign` por default.
Oleg Filatov

As the Chief Technology Officer at EXMON Exchange, I focus on building secure, scalable crypto infrastructure and developing systems that protect user assets and privacy.

With over 15 years in cybersecurity, blockchain, and DevOps, I specialize in smart contract analysis, threat modeling, and secure system architecture.

At EXMON Academy, I share practical insights from real-world...

...

Escribe una opinión

Tu correo electrónico no será publicado. Los campos obligatorios están marcados *