Qué puede recuperar un atacante (clases de reversión)

Las clases de atacante estático en las que encajan las transformaciones de AfterPack y qué obtiene un atacante al recuperar cada una.

AfterPack agrupa sus protecciones en clases. Cada clase eleva el coste de la reversión de una forma distinta. Saber qué clase cubre una región de tu código te dice qué recupera un atacante si la lee. El Protection Map colorea cada token según su puntuación de complejidad y nombra la clase del código que selecciones.

Atacante estático, definición

Son clases de atacante estático. Describen a qué se enfrenta alguien que lee los bytes: grep, herramientas de AST, una pasada de desofuscador o un LLM que explica el código sin ejecutarlo. Un atacante que ejecuta el artefacto con instrumentación es un caso aparte y más fuerte, que se trata en el modelo de amenaza.

The three reversal-complexity classesRenamed & encodedPolynomial-injectiveAttacker gets:the structure, after real workFreeFlattened & fusedPolynomial-non-injectiveAttacker gets:an equivalent program, not yoursReservedDestroyed & fusedExponential — provenance, staticAttacker gets:behaviour, not your structureReservedFree spans the first two classes. Provenance-destroying fusion is planned and not available on any tier today.Each class is a cost, not a wall — and the cost is charged again on your next build.

Las clases

ClaseQué recupera un atacante estáticoNivel
Renombrado y codificado (polinómico-inyectivo)La estructura, con esfuerzo. Los nombres, los literales, el flujo de control aplanado y las identidades fusionadas exigen un trabajo real de reconocimiento de patrones. Ese trabajo hay que rehacerlo en cada build.Free
Aplanado y fusionado (polinómico-no inyectivo)Un programa equivalente con el mismo comportamiento. La lógica se reescribe para que varios cálculos originales distintos colapsen en la misma salida, y la correspondencia de vuelta con el que tú escribiste desaparece. Ninguna transformación publicada alcanza hoy esta clase.—

El nivel Free produce la clase renombrado y codificado en todo tu bundle (la matriz completa está en Planes y niveles). Los presets más altos empujan más dentro de esa clase. El preset por defecto es light (objetivo de complejidad 5); un preset más fuerte como --preset=hard empuja más y multiplica el tiempo de arranque de la página en todo el bundle (coste de carga). A partir de medium, el motor añade aplanamiento del flujo de control, fusión de identidades y destrucción de constantes de manera uniforme en todo el bundle, todo dentro de la clase renombrado y codificado.

Hoy no se producen ni aplanado y fusionado ni destruido y fusionado

Ningún build las alcanza y ninguna región se clasifica nunca como "aplanado y fusionado" ni como "destruido y fusionado". /* @afterpack preset=extreme */ eleva una región al objetivo de complejidad 25 con el mínimo de cadenas activado, lo que supone una protección real y medible dentro de la clase renombrado y codificado.

Qué obtiene un atacante al recuperar una clase

Lo que una clase le aporta a un atacante depende de lo que buscaba.

  • Un secreto (una clave de API, un umbral de licencia, una tabla incrustada en el código): ninguna de las dos clases lo oculta por sí sola. Un secreto sale de cualquier programa que se comporte como el tuyo, incluido el que se recupera de una región protegida. Proteger un secreto requiere otro mecanismo. Consulta Proteger un secreto.
  • Entender y clonar tu código: un lector estático puede recuperar un equivalente funcional y legible, pero solo después del trabajo real de reconocimiento de patrones que cuesta la clase renombrado y codificado, y ese trabajo hay que rehacerlo en cada build. Consulta Qué no reemplaza AfterPack para ver los límites de esta propiedad.
  • Localizar y parchear una comprobación (desactivar un paywall, invertir un return true): ninguna de las dos clases ayuda mucho por sí sola. El atacante solo necesita encontrar ese nodo. Volver a encontrarlo cuesta algo, y ese coste se reinicia en cada release. La autointegridad (transforms.selfIntegrity.enabled) no lo detecta: solo detecta cambios en su propia tabla de comprobación. Consulta Buenas prácticas sobre la rotación.

Compruébalo en tu propio build

El Protection Map muestra la prueba token a token: tu código fuente original, coloreado según la puntuación de complejidad de cada token, con la clase y la pila de transformaciones detrás al pasar el ratón. Abre la demo en vivo o genera el tuyo con npx afterpack@latest.

Siguiente

  • Modelo de amenaza: la escala de adversarios con respecto a la que se definen estas clases.
  • Protection Map: la vista token a token de tu propio build.
  • Buenas prácticas: qué marcar y por qué.
  • Directivas: los marcadores que mueven una región de una clase a otra.
  • Presets: la escala y el objetivo de complejidad que fija cada peldaño.