Saltar al contenido principal

Ofuscar código Dart

Cómo eliminar nombres de funciones y clases de tu binario de Dart.

¿Qué es la ofuscación de código?

#

La ofuscación de código es el proceso de modificar el binario de una aplicación para que sea más difícil de entender para los humanos. La ofuscación oculta los nombres de funciones y clases en tu código Dart compilado, reemplazando cada símbolo con otro símbolo, lo que dificulta que un atacante aplique ingeniería inversa a tu aplicación propietaria.

Limitaciones y advertencias

#

Flutter's code obfuscation works only on a compilación de lanzamiento.

Ofuscar tu código no encripta los recursos ni protege contra la ingeniería inversa. Solo renombra los símbolos con nombres más oscuros.

Las aplicaciones web no admiten la ofuscación. Una aplicación web se puede minimizar, lo que proporciona un resultado similar. Cuando compilas una versión de lanzamiento de una aplicación web Flutter, el compilador web minimiza la aplicación. Para obtener más información, consulta Compilar y lanzar una aplicación web.

Destinos compatibles

#

Los siguientes destinos de compilación admiten el proceso de ofuscación descrito en esta página:

  • aar
  • apk
  • appbundle
  • ios
  • ios-framework
  • ipa
  • linux
  • macos
  • macos-framework
  • windows

Para obtener información detallada sobre las opciones de línea de comandos disponibles para un destino de compilación, ejecuta el siguiente comando. Las opciones --obfuscate y --split-debug-info deberían aparecer en la salida. Si no lo hacen, deberás instalar una versión más reciente de Flutter para ofuscar tu código.

flutter build <build-target> -h
  • <build-target>: El destino de compilación. Por ejemplo, apk.

Ofuscar tu aplicación

#

Para ofuscar tu aplicación y crear un mapa de símbolos, usa el comando flutter build en modo release con las opciones --obfuscate y --split-debug-info. Si deseas depurar tu aplicación ofuscada en el futuro, necesitarás el mapa de símbolos.

  1. Ejecuta el siguiente comando para ofuscar tu aplicación y generar un archivo de SÍMBOLOS:

    flutter build <build-target> \
       --obfuscate \
       --split-debug-info=/<symbols-directory>
    
    • <build-target>: El destino de compilación. Por ejemplo, apk.
    • <symbols-directory>: El directorio donde se debe colocar el archivo de SÍMBOLOS. Por ejemplo, out/android.
  2. Una vez que hayas ofuscado tu binario, realiza una copia de seguridad del archivo de SÍMBOLOS. Es posible que necesites esto si pierdes tu archivo de SÍMBOLOS original y deseas desofuscar una traza de pila.

Leer una traza de pila ofuscada

#

Para depurar una traza de pila creada por una aplicación ofuscada, sigue los siguientes pasos para hacerla legible para los humanos:

  1. Busca el archivo de SÍMBOLOS coincidente. Por ejemplo, un fallo de un dispositivo Android arm64 necesitaría app.android-arm64.symbols.

  2. Proporciona tanto la traza de pila (almacenada en un archivo) como el archivo de SÍMBOLOS al comando flutter symbolize.

    flutter symbolize \
       -i <stack-trace-file> \
       -d <obfuscated-symbols-file>
    
    • <stack-trace-file>: La ruta del archivo para la traza de pila. Por ejemplo, ???.
    • <obfuscated-symbols-file>: La ruta del archivo para el archivo de símbolos que contiene los símbolos ofuscados. Por ejemplo, out/android/app.android-arm64.symbols.

    Para obtener más información sobre el comando symbolize, ejecuta flutter symbolize -h.

Leer un nombre ofuscado

#

Puedes generar un archivo JSON que contenga un mapa de ofuscación. Un mapa de ofuscación es un array JSON con pares de nombres originales y nombres ofuscados. Por ejemplo, ["MaterialApp", "ex", "Scaffold", "ey"], donde ex es el nombre ofuscado de MaterialApp.

Para generar un mapa de ofuscación, usa el siguiente comando:

flutter build <build-target> \
   --obfuscate \
   --split-debug-info=/<symbols-directory> \
   --extra-gen-snapshot-options=--save-obfuscation-map=/<obfuscation-map-file>
  • <build-target>: El destino de compilación. Por ejemplo, apk.
  • <symbols-directory>: El directorio donde se deben colocar los símbolos. Por ejemplo, out/android
  • <obfuscation-map-file>: La ruta del archivo donde se debe colocar el mapa de ofuscación JSON. Por ejemplo, out/android/map.json

Advertencia

#

Ten en cuenta lo siguiente al codificar una aplicación que eventualmente será un binario ofuscado.

  • El código que se basa en la coincidencia de nombres específicos de clases, funciones o bibliotecas fallará. Por ejemplo, la siguiente llamada a expect() no funcionará en un binario ofuscado:

    dart
    expect(foo.runtimeType.toString(), equals('Foo'));
    
  • Los nombres de los enum no se ofuscan actualmente.