Cómo ofuscar una aplicación .NET MAUI (sin romperla)
Una aplicación .NET MAUI distribuye tus ensamblados administrados a cada dispositivo, donde se decompilan de vuelta a C#. Aquí tienes qué queda expuesto en cada plataforma, cómo ofuscar una aplicación MAUI con Nebula.NET y las trampas de los enlaces de XAML y de iOS que debes evitar.
.NET MAUI te permite distribuir una sola base de código en C# a Windows, Android, iOS y macOS. Eso es estupendo para la productividad — y significa que tu lógica propietaria ahora viaja a un montón de dispositivos que no controlas. Si algo de ese código vale la pena proteger (una comprobación de licencia, una regla de precios, un algoritmo), deberías ofuscar una aplicación MAUI igual que harías con cualquier cliente que distribuyes. Aquí tienes cómo, y las trampas específicas de MAUI que debes evitar.
Por qué una aplicación MAUI está expuesta
Una aplicación MAUI no es código nativo mágico — se construye a partir de ensamblados .NET corrientes, y lo expuestos que estén depende de la plataforma a la que distribuyas:
- Windows — tus archivos
.dlladministrados se distribuyen en el paquete. Extrae y decompila, y recuperas tu C#, exactamente como se cubre en ¿se puede decompilar el código .NET?. - Android — el
.apk/.aabcontiene tus ensamblados .NET (individualmente o agrupados). Son legibles una vez desempaquetados; un decompilador hace el resto. - iOS / macOS (AOT) — estos se compilan de forma anticipada (AOT) a código nativo, que es más difícil de decompilar que el IL. Eso eleva el listón, pero no es una razón para dejar los ensamblados de las demás plataformas de par en par.
En resumen: en las plataformas que distribuyen IL (Windows, Android), tu aplicación MAUI es tan decompilable como cualquier ensamblado .NET. La ofuscación es lo que cierra eso.
Cómo ofuscar una aplicación MAUI con Nebula
El trabajo consiste en ofuscar los ensamblados administrados de tu aplicación como parte de la compilación, antes de que se empaqueten. Apunta Nebula a tu salida publicada con una configuración ajustada para MAUI:
dotnet publish -c Release -f net8.0-windows10.0.19041.0
nebula --config nebula.config.json --input publish/YourApp.dll
Conéctalo a MSBuild/CI para que se ejecute en cada compilación de versión. Todos los detalles — incluidas las notas por plataforma — están en Proteger aplicaciones .NET MAUI y Xamarin.
Las trampas específicas de MAUI
MAUI se apoya mucho en la reflexión y en los nombres en tiempo de ejecución, así que un renombrado descuidado romperá la aplicación en lugar de protegerla. Mantén estos a salvo:
- Objetivos de enlace de datos de XAML. Los enlaces resuelven las propiedades del modelo de vista por nombre. Si renombras una propiedad enlazada, el enlace falla en silencio. Preserva los miembros enlazados públicos de tus modelos de vista (o toda la API pública de los tipos de modelo de vista).
- Inyección de dependencias. Los tipos que registras y resuelves mediante el contenedor de DI se construyen por tipo — mantén las identidades de esos tipos donde el contenedor las necesita.
- Reflexión / serialización. Cualquier cosa cargada por nombre — convertidores, miembros generados al estilo
[ObservableProperty], modelos JSON — debe preservarse, igual que en WPF. - iOS es AOT. iOS no genera código en tiempo de ejecución, así que el cifrado de métodos (IL) no funcionará ahí — necesita el JIT. Usa en iOS renombrado, aplanado del flujo de control, cifrado de cadenas y virtualización de código en su lugar; no dependen del JIT.
La regla de oro con cualquier framework de interfaz: ofusca, luego ejecuta la aplicación en un dispositivo real y navega por ella. Los fallos de enlace de MAUI son silenciosos, así que una pasada manual rápida (más tus pruebas de interfaz) es como confirmas que la compilación protegida se comporta de forma idéntica.
Qué proteger
No necesitas virtualizar toda tu aplicación — protege el código que es el producto. Renombra y aplana de forma amplia, cifra las cadenas (los endpoints de API, las claves y los mensajes adoran esconderse en las aplicaciones MAUI), y reserva la protección más pesada como la virtualización de código para el puñado de métodos que un atacante atacaría primero — un validador de licencia, un paso de derivación de claves, un cálculo propietario. Y, como siempre, cualquier cosa que deba ser verdaderamente secreta pertenece a un servidor, no distribuida a un teléfono.
Pruébalo
Si distribuyes una aplicación MAUI, desempaqueta tu propio .aab de Android o abre la .dll de una compilación de Windows en el decompilador gratuito Glass.NET y lee una pantalla que consideres propietaria — es un despertar rápido. Luego pásala por Nebula y mira de nuevo.
Descarga Nebula.NET gratis para probarlo en tu propia compilación de MAUI, o lee la guía de protección de MAUI.
Prueba Nebula.NET
Endurece tu código .NET en minutos — empieza con la edición gratuita.