Glosario de ofuscación

El vocabulario de la documentación de AfterPack: polimorfismo, no materialización, clases de reversión y el resto, definidos una sola vez.

La documentación de AfterPack usa estos términos con los significados que se definen aquí.

Los dos ejes

La protección de AfterPack se describe a lo largo de dos ejes independientes: cuánto cuesta revertir un build y cuánto difieren los builds entre sí. Puedes subir uno sin el otro.

Complejidad

Cuánto cuesta revertir un único build: la profundidad de la protección dentro de un artefacto. La establece complexity, directamente o a partir de un preset.

Polimorfismo por build

Cuánto difiere cada build del anterior. Lo fija la semilla: seed en la configuración del motor, --seed en la línea de comandos. Es la defensa principal de AfterPack. Cada build tiene una forma distinta, así que las herramientas escritas contra los patrones de un build fallan en el siguiente. Quien ejecuta el código puede seguir leyendo los valores que usa. Consulta Cómo funciona AfterPack.

Configuración

Preset

Un conjunto con nombre de ajustes de protección, que se selecciona con un solo flag: minify, light, medium, hard, extreme. El valor por defecto es light. Un solo nombre de preset establece el objetivo de complexity. El objetivo que fija cada peldaño está en Presets.

complexity

El grado de entrelazado de la salida; consulta Configuración. No tiene límite superior. Un inflation.max explícito que lo bloquea hace fallar el build; si no se establece, el objetivo por sí solo decide hasta dónde crece la salida. Los valores de cada preset están en Presets.

Directivas

Comentarios de bloque en el código fuente que ajustan la protección de la construcción a la que se asocian. Un /* @afterpack preset=extreme */ en línea cubre el literal que le sigue. Una forma de bloque, /* @afterpack <key>=<value> */ … /* @afterpack end */, se abre con el marcador solo en su línea y se cierra con el end correspondiente, cubriendo un tramo explícito. Un comentario de línea // no se analiza. skip reduce la protección donde necesitas compatibilidad; preset=hard o preset=extreme la aumentan. Solo un motor Pro respeta una región; consulta Builds Free. Una exclusión en Free usa en su lugar paths.exclude o identifiers.reserved. Consulta Directivas.

preset=hard

Una directiva (/* @afterpack preset=hard */) que eleva una región a complexity 12, el peldaño hard, y fuerza el mínimo de cadenas en esa región independientemente del preset global. /* @afterpack preset=extreme */ hace lo mismo con objetivo 25.

Reversión y el modelo de atacante

Estructura fija

Una forma que se mantiene igual entre builds: un array de cadenas (incluso cifrado), un intérprete de VM, un bootstrap de decodificador idéntico en cada build. Esa forma es lo que una herramienta como webcrack, o un modelo, aprende una vez y reutiliza en cada build que la comparte. Cualquier ofuscador puede variar constantes entre builds; lo que importa es si debajo sigue habiendo una forma así. AfterPack toma sus formas, nombres, constantes y disposición de nuevo de la semilla de cada build, así que un reconocedor escrito contra los patrones de un build falla en el siguiente. No oculta valores a quien ejecuta el código. Consulta Por qué fallan las capas de ofuscación fijas.

Clases de reversión

Tres clases de atacante estático que describen con qué se queda quien lee los bytes, grep, las herramientas de AST o un LLM a ciegas que no ejecuta el código: renombrado y codificado, aplanado y fusionado, y destruido y fusionado. Un atacante dinámico que ejecuta el código es un caso aparte y más fuerte. La tabla de clases y lo que cada una le aporta a un atacante están en Clases de reversión. Hoy solo la primera, renombrado y codificado, la produce alguna transformación publicada; aplanado y fusionado, y destruido y fusionado, quedan reservadas.

No materialización

El mecanismo que protege un secreto, distinto de las clases de reversión anteriores, que recuperan estructura y no valores. Lo proporciona transforms.comparisonHardening.enabled, que reescribe una comprobación de igualdad de cadenas como una verificación de digest unidireccional, de modo que el literal no está en el artefacto. Esto se diferencia del mínimo de cadenas, que codifica un literal pero lo reconstruye al usarlo. Vence a un lector estático y a un LLM a ciegas. No vence a un atacante que ejecuta el código en un runtime instrumentado; ningún ofuscador en tiempo de build cambia eso. Consulta Cómo sobreviven los secretos.

Entrega, semilla y niveles

Semilla

El parámetro de build que selecciona qué salida polimórfica se produce. Aleatoria por defecto. No es un secreto: el artefacto publicado es público de todos modos, y conocer la semilla de un build no ayuda a revertirlo. Varíala en cada versión en producción. Fíjala (--seed=git) solo cuando necesites una salida idéntica byte a byte, para la caché de CI o una auditoría reproducible. Consulta seed y Builds y versiones.

Source maps

Correspondencias que enlazan la salida ofuscada con tu código fuente original. Útiles para depurar en local. Un .map público le da a un atacante un camino directo a tu código fuente. Nunca publiques uno en producción. AfterPack desactiva los source maps por defecto en un build de producción, elimina el comentario sourceMappingURL y borra los mapas que escribió tu bundler.

Protection Map

El informe que colorea cada token de tu código fuente según su puntuación de complejidad y nombra la clase de reversión de cada región. Lo decide el motor por defecto; lo diriges tú en cuanto marcas regiones en Pro. Se controla con protectionMap.enabled. Consulta Protection Map o abre la demo en vivo.

Niveles

Free, Extra MB, Indie, Team, Studio, Enterprise. Free aplica protección con toda su fuerza de manera uniforme en todo el bundle. Los niveles de pago también pueden fijar un preset más pesado o más ligero en una función o un archivo, con una directiva. Los precios, las asignaciones y los límites de proyectos están en Planes y niveles.

Fail-closed

La regla de que un build Pro nunca publica una protección más débil de la que pediste. Si la nube Pro no es accesible tras los reintentos, o la asignación se agota a mitad de un lote, AfterPack se detiene con un código de salida distinto de cero. No recurre a una salida del nivel Free ni a texto sin ofuscar. Consulta Códigos de salida y fail-closed.

Siguiente

  • Cómo funciona AfterPack: donde se usan en contexto la mayoría de estos términos.
  • Configuración: cada opción y qué forma puede establecerla.
  • Directivas: la gramática completa de @afterpack y qué claves se aplican.
  • Presets: la escala de la que vienen los valores objetivo anteriores.
  • Diagnósticos: los códigos DIAG_* en los que aparecen estos términos.