DEV Community

LeoJulieta
LeoJulieta

Posted on

Mods en tiempo real: IA que decompila y parchea juegos al instante

IA que decompila juegos y crea mods en tiempo real

Cómo montar un pipeline práctico con LLMs y herramientas de reverse‑engineering


Introducción

¿Te imaginas lanzar un mod para tu juego favorito sin tocar una sola línea de código fuente? En los últimos meses la combinación de modelos de lenguaje de gran escala (LLMs) y herramientas de ingeniería inversa ha hecho posible descompilar binarios, entender su lógica y generar parches automáticos en cuestión de minutos. Después del artículo viral de Hacker News que superó las 150 000 visitas, la comunidad está pidiendo guías paso a paso que no solo expliquen la teoría, sino que entreguen scripts listos para copiar‑pegar. En este post encontrarás exactamente eso: arquitectura del agente, configuración del entorno, ejemplos de comandos y fragmentos de código, comparativas de modelos y una checklist de seguridad y legalidad para que puedas montar tu propio flujo de trabajo hoy mismo.


1. Arquitectura del agente inteligente

┌─────────────────────┐
│  Entrada: binario   │
│  (.exe, .dll, .so)  │
└───────┬─────┬───────┘
        │     │
  1️⃣  │     │ 2️⃣  Desensamblado (radare2 / Ghidra)
        │     │
        ▼     ▼
┌─────────────────────┐
│  LLM (GPT‑4o,      │
│  Claude‑3.5, …)    │
│  – prompt “extrae   │
│   estructuras C++” │
└───────┬─────┬───────┘
        │     │
  3️⃣  │     │ 4️⃣  Generación de código
        │     │     (wrapper, hooks)
        ▼     ▼
┌─────────────────────┐
│  Post‑procesado:   │
│  pruebas unitarias│
│  y empaquetado .zip│
└─────────────────────┘
Enter fullscreen mode Exit fullscreen mode
  1. Desensamblado: usamos radare2 (rápido y CLI) o Ghidra (interfaz gráfica) para obtener el flujo de control y los símbolos exportados.
  2. Prompting: enviamos bloques de ensamblado al LLM con instrucciones concretas (“genera la firma C++ de esta función”).
  3. Código generado: el modelo devuelve stubs en C++/C# que podemos compilar como DLL de inyección o como parche de bytecode.
  4. Validación: pruebas automáticas con Catch2 (C++) o xUnit (C#) para asegurar que el comportamiento no se rompe.

2. Preparando el entorno (guía rápida)

# 1. Instala las dependencias del sistema
sudo apt-get update && sudo apt-get install -y \
    git build-essential cmake python3-pip \
    radare2 ghidra unzip wget

# 2. Crea un entorno virtual de Python
python3 -m venv .venv
source .venv/bin/activate
pip install openai==1.12.0 anthropic==0.5.0 google-generativeai tqdm

# 3. Descarga un modelo local (opcional)
# LLaMA‑2‑70B con 12 GB VRAM (requiere huggingface-cli)
git lfs install
huggingface-cli download meta-llama/Llama-2-70b-chat-hf \
    --local-dir ./models/llama2-70b

# 4. Configura variables de entorno (API keys)
export OPENAI_API_KEY=sk-...
export ANTHROPIC_API_KEY=...
export GOOGLE_API_KEY=...
Enter fullscreen mode Exit fullscreen mode

Tip: si tu GPU tiene menos de 12 GB, usa la versión 70b‑q4_0.gguf que reduce la memoria a ~8 GB con mínima pérdida de calidad.


3. Desensamblado y extracción de símbolos

# Analiza el ejecutable y guarda la salida en JSON
r2 -A -c "aaa; aflj" -o symbols.json ./MyGame.exe

# Filtra solo funciones públicas (ejemplo con jq)
jq '[.[] | select(.type=="FUNC" and .is_import==false)]' symbols.json > funcs.json
Enter fullscreen mode Exit fullscreen mode

El archivo funcs.json contiene algo como:

[
  {"offset":4096,"name":"UpdatePlayer","size":112},
  {"offset":4224,"name":"SpawnEnemy","size":96}
]
Enter fullscreen mode Exit fullscreen mode

4. Prompting al LLM

import os, json, openai, anthropic, google.generativeai as genai
from tqdm import tqdm

# Carga funciones a procesar
with open("funcs.json") as f:
    funcs = json.load(f)

def build_prompt(func):
    return f"""Eres un ingeniero de software experto en C++.
A partir del siguiente fragmento de ensamblado (AT&T) genera la firma completa
de la función, sus parámetros y una posible implementación mínima que compile
con gcc -O2. Usa tipos estándar y comenta cada línea.

Offset: 0x{func['offset']:x}
Tamaño: {func['size']} bytes

[INCLUDE ASSEMBLY HERE]"""

def query_llm(prompt, model="gpt-4o"):
    # ejemplo con OpenAI
    resp = openai.ChatCompletion.create(
        model=model,
        messages=[{"role":"user","content":prompt}],
        temperature=0.0,
        max_tokens=1024,
    )
    return resp.choices[0].message.content

# Loop de generación
generated = {}
for f in tqdm(funcs):
    # extrae el ensamblado con radare2 (solo como ejemplo)
    asm = os.popen(f"r2 -c 'pd {f['size']//2} @ {f['offset']}' ./MyGame.exe").read()
    prompt = build_prompt(f).replace("[INCLUDE ASSEMBLY HERE]", asm)
    generated[f["name"]] = query_llm(prompt)

# Guarda resultados
with open("stubs.cpp","w") as out:
    out.write("\n\n".join(generated.values()))
Enter fullscreen mode Exit fullscreen mode

Resultado típico (UpdatePlayer):

// Offset 0x1000, tamaño 112 bytes
struct Vec2 { float x, y; };
struct Player {
    Vec2 pos;
    int   health;
};

void UpdatePlayer(Player* p, float dt) {
    // Aplicar gravedad
    p->pos.y -= 9.81f * dt;
    // Limitar al suelo
    if (p->pos.y < 0.0f) p->pos.y = 0.0f;
}
Enter fullscreen mode Exit fullscreen mode

5. Compilación y prueba automática

# 5.1 Compila la DLL de hooks
g++ -shared -fPIC -O2 -std=c++20 -I./include stubs.cpp -o mod_hook.dll

# 5.2 Prueba con Catch2
cat > test_mod.cpp <<'EOF'
#define CATCH_CONFIG_MAIN
#include <catch2/catch.hpp>
extern "C" void UpdatePlayer(void*, float);
TEST_CASE("UpdatePlayer no hace que la posición sea negativa") {
    Player p{ {0,10}, 100 };
    UpdatePlayer(&p, 0.016f);
    REQUIRE(p.pos.y >= 0);
}
EOF

g++ -std=c++20 -I./include -I./catch2 test_mod.cpp -L. -lmod_hook -o test_mod
./test_mod
Enter fullscreen mode Exit fullscreen mode

Si todas las pruebas pasan, el mod está listo para inyectarse con herramientas como x64dbg o DLLInject.


6. Comparativa rápida de modelos (abril 2024)

Modelo Precio (USD/1 M tokens) Latencia media (1 KB) Precisión de firmas Comentario práctico
GPT‑4o (OpenAI) $0.03 (prompt) / $0.06 (completion) 1.8 s 88 % Mejor velocidad, buen soporte de herramientas.
Claude‑3.5 (Anthropic) $0.025 / $0.075 2.3 s 92 % Más exacto en tipos complejos, ligeramente más lento.
Gemini‑1.5 (Google) $0.02 / $0.06 2.0 s 85 % Buen equilibrio, integración fácil con Vertex AI.
LLaMA‑2‑70B (local) $0 (solo hardware) 1.5 s (GPU RTX 3080) 90 % Requiere GPU ≥12 GB, sin costes de API.

Recomendación: para proyectos pequeños usa la API de Claude‑3.5 (precisión) y para pipelines de


Herramienta mencionada: Groq Cloud

Top comments (0)