Dead Code Injection

El dead code injection añade bloques de código sin significado a tu aplicación que parecen legítimos, de modo que un atacante no pueda distinguir la lógica real del señuelo.

  • JavaScriptJavaScript
  • AndroidAndroid
  • AppleiOS
TL;DR

El dead code injection inserta en tu aplicación código que nunca se ejecuta, o que se ejecuta sin efecto. El código inyectado está hecho para parecer exactamente lógica real. Un decompilador lo reproduce todo, y un atacante tiene que analizar cada bloque para descubrir que la mayor parte no hace nada.

Definición

¿Qué es el dead code injection?

El dead code injection es una técnica de ofuscación que añade código sin significado a una aplicación sin cambiar su comportamiento. El código inyectado es o bien inalcanzable, o bien no tiene ningún efecto observable.

Cuando un atacante decompila tu aplicación, quiere encontrar los pocos métodos que importan. El dead code injection entierra esos métodos en un volumen mucho mayor de código que parece igual de plausible.

La aplicación se ejecuta exactamente igual, porque el código inyectado es inerte. Lo que cambia es el coste del análisis: un atacante ya no puede ojear el código, tiene que evaluar cada bloque para saber cuáles son reales.

Mecanismo

Cómo funciona el dead code injection

El dead code injection aplica varias técnicas:

  • Bloques inalcanzables. Se añaden rutas de código a las que nunca se puede llegar, protegidas por condiciones que siempre se evalúan igual.

  • Código sin efecto. Se insertan entre las sentencias reales operaciones que calculan valores que nunca se usan.

  • Señuelos plausibles. El código inyectado se moldea para parecerse a lógica de negocio real, de modo que no se pueda filtrar por patrones.

El código inyectado está diseñado para sobrevivir a la decompilación con aspecto legítimo, y eso es lo que lo hace eficaz.

Ejemplo

Ejemplo de dead code injection

El mismo método, antes y después del dead code injection. El comportamiento es idéntico. La cantidad de código que un atacante tiene que triar, no.

Original

Un método decompilado breve y centrado. Un atacante identifica la lógica que importa en segundos.

Con señuelos inyectados

El mismo método rodeado de bloques de código plausibles pero inertes. La lógica real sigue ahí, pero encontrarla implica analizarlo todo.

Original
public decimal Discount(int years)
{
    if (years > 5) return 0.30m;
    return 0m;
}
Con señuelos inyectados
public decimal Discount(int years)
{
    int k = years * 7919;
    if (k < 0 && k >= 0) return -1m;
    if (years > 5) return 0.30m;
    var _ = (k ^ 0x4F2A) + 17;
    return 0m;
}

Casos de uso

Cuándo usar dead code injection

El dead code injection es especialmente útil cuando tu aplicación:

  • Contiene una cantidad pequeña de lógica de alto valor que merece la pena esconder en volumen.
  • Ya está renombrada y con strings cifrados; el dead code añade otra capa.
  • Necesita ralentizar específicamente el análisis manual.

Funciona mejor combinado con control flow obfuscation: uno añade código señuelo, el otro enmaraña la estructura del código real.

Disponibilidad por plataforma

Dead code injection según la plataforma

  • JavaScript

    Dead code injection en los bundles de cliente.

  • Android

    Rutas de código señuelo insertadas en el bytecode.

  • iOS

    Inserción de dead code en el binario compilado.

Preguntas frecuentes

¿Qué es el dead code injection?
El dead code injection es una técnica de ofuscación que añade a una aplicación código inerte y sin significado. El código nunca afecta al comportamiento, pero parece legítimo y obliga al atacante a analizarlo para descubrir que no hace nada.
¿El dead code injection afecta al rendimiento?
El impacto es pequeño. El código inalcanzable nunca se ejecuta, y el código sin efecto se mantiene ligero, así que los usuarios no notan una diferencia apreciable.
¿El dead code injection aumenta el tamaño de la aplicación?
Añade algo de tamaño, porque el código inyectado es código real. La cantidad es configurable, así puedes equilibrar la protección con el peso.
¿Puede un atacante eliminar el dead code?
Eliminarlo exige identificarlo primero, que es justo el trabajo que la técnica pretende imponer. Combinado con control flow obfuscation, distinguir el código real del señuelo se vuelve mucho más difícil.
¿Qué plataformas soportan el dead code injection?
ByteHide Shield ofrece dead code injection para JavaScript, Android e iOS.
+10.000 desarrolladores y empresas protegen sus aplicaciones con ByteHide

Protege tu aplicación con
ByteHide Shield

El dead code injection es una de las más de 20 protecciones de ByteHide Shield. Aplícalo a tu aplicación JavaScript, Android o iOS.

ByteHide runtime dashboard showing live threat monitoring and protection metrics