A Linux daemon that patches running game server processes in memory without modifying binaries on disk. Uses ptrace for process attachment, /proc/PID/mem for memory I/O, and remote mmap syscall execution to allocate executable code caves inside target processes.
Built to extend and fix a legacy 32-bit x86 Linux game server (no source code available) by injecting custom logic at runtime.
- Non-invasive: all patches are in-memory only, fully reversible on detach or process restart
- 40+ modular gameplay patches (combat, items, PvP, quality-of-life)
- Hot-reloadable config: re-reads config file every 2 seconds, toggles patches live
- Automatic process detection via
/procscanning - PID recycling detection using
/proc/PID/statstart-time comparison - Hand-assembled x86 machine code for code caves (no compiler/assembler dependency at runtime)
- Graceful degradation: failed patches don't block others from applying
+------------------+
| Daemon Loop | (runs continuously)
+--------+---------+
|
+------------+------------+
| | |
Config Reload Proc Scan Apply Patches
(every 2s) (/proc) (per process)
|
+------------+------------+
| | |
ptrace attach read/write ptrace detach
/proc/PID/mem
|
+--------+--------+
| |
Direct writes Code caves
(value patches) (logic patches)
| |
overwrite bytes mmap remote →
at known addrs build shellcode →
write cave →
JMP hook install
- Language: C (POSIX / Linux-specific)
- Process control:
ptrace(PTRACE_ATTACH/DETACH/GETREGS/SETREGS/SINGLESTEP) - Memory I/O:
/proc/PID/mem(read/write viapread/pwrite) - Code injection: Remote
mmapvia syscall hijacking, hand-assembled x86 shellcode - Process discovery:
/procfilesystem scanning,/proc/PID/statparsing - Configuration: Custom key=value parser with live reload
| Module | Description |
|---|---|
| ptrace-core/ | Process attach/detach via ptrace |
| memory-io/ | Read/write process memory via /proc/PID/mem |
| code-caves/ | Remote mmap allocation via syscall injection |
| process-scanner/ | Automatic process detection + PID recycle guard |
| config/ | Hot-reloadable key=value config parser |
| patch-example/ | Complete patch example: shellcode + JMP hook |
| daemon/ | Main daemon loop orchestrating everything |
- Daemon detects the target process via
/procscanning - ptrace attaches to the process, stopping it
- Remote mmap allocates an executable memory región (code cave) inside the target
- Shellcode is hand-assembled and written into the code cave via
/proc/PID/mem - A JMP hook is installed at the original function, redirecting execution to the cave
- The cave runs custom logic, then jumps back to the original code flow
- ptrace detaches, the process resumes with the patch active
This is a showcase/portfolio repository with educational code excerpts. Each module is self-contained and demonstrates a specific technique. The code compiles on any Linux system with standard headers:
gcc -Wall -Wextra -O2 -o patcher ptrace-core/process_attach.c memory-io/memory_rw.c ...Educational / Portfolio use. See individual files for details.
Un demonio Linux que parchea procesos de servidores de juegos en memoria sin modificar los binarios en disco. Usa ptrace para adjuntarse a procesos, /proc/PID/mem para lectura/escritura de memoria, y ejecución remota de mmap vía syscall para asignar cuevas de código ejecutable dentro de los procesos objetivo.
Construido para extender y corregir un servidor de juegos legacy x86 de 32 bits en Linux (sin código fuente disponible), inyectando lógica personalizada en tiempo de ejecución.
- No invasivo: todos los parches son solo en memoria, completamente reversibles al desconectar o reiniciar el proceso
- 40+ parches modulares de gameplay (combate, objetos, PvP, calidad de vida)
- Configuración recargable en caliente: relee el archivo de configuración cada 2 segundos, activa/desactiva parches en vivo
- Detección automática de procesos vía escaneo de
/proc - Detección de reciclaje de PID usando comparación de tiempo de inicio en
/proc/PID/stat - Código máquina x86 ensamblado a mano para cuevas de código (sin dependencia de compilador/ensamblador en runtime)
- Degradación elegante: parches fallidos no bloquean a los demás
+------------------+
| Bucle Demonio | (ejecuta continuamente)
+--------+---------+
|
+------------+------------+
| | |
Recarga Config Escaneo Proc Aplicar Parches
(cada 2s) (/proc) (por proceso)
|
+------------+------------+
| | |
ptrace attach leer/escribir ptrace detach
/proc/PID/mem
|
+--------+--------+
| |
Escrituras directas Cuevas de código
(parches de valor) (parches de lógica)
- Lenguaje: C (POSIX / específico de Linux)
- Control de procesos:
ptrace(PTRACE_ATTACH/DETACH/GETREGS/SETREGS/SINGLESTEP) - E/S de memoria:
/proc/PID/mem(lectura/escritura víapread/pwrite) - Inyección de código:
mmapremoto vía secuestro de syscall, shellcode x86 ensamblado a mano - Descubrimiento de procesos: escaneo del filesystem
/proc, parseo de/proc/PID/stat - Configuración: Parser key=value personalizado con recarga en vivo
| Módulo | Descripción |
|---|---|
| ptrace-core/ | Attach/detach de procesos vía ptrace |
| memory-io/ | Leer/escribir memoria de proceso vía /proc/PID/mem |
| code-caves/ | Asignación remota de mmap vía inyección de syscall |
| process-scanner/ | Detección automática de procesos + guardia contra reciclaje de PID |
| config/ | Parser de configuración key=value recargable en caliente |
| patch-example/ | Ejemplo completo de parche: shellcode + JMP hook |
| daemon/ | Bucle principal del demonio orquestando todo |
- El demonio detecta el proceso objetivo vía escaneo de
/proc - ptrace se adjunta al proceso, deteniéndolo
- mmap remoto asigna una región de memoria ejecutable (cueva de código) dentro del objetivo
- El shellcode se ensambla a mano y se escribe en la cueva vía
/proc/PID/mem - Se instala un JMP hook en la función original, redirigiendo la ejecución a la cueva
- La cueva ejecuta lógica personalizada, luego salta de vuelta al flujo original
- ptrace se desconecta, el proceso continúa con el parche activo