FreeObfuscator.NET protection

.NET · C# · DLL · EXE

Ofuscar .NET sin romper JSON ni contratos de reflexión

Fija los nombres del documento y prueba consumidores reales para detectar propiedades o tipos que dejan de encontrarse.

Abrir el ofuscador

La carga de archivos, la cuenta y el pago utilizan la interfaz en inglés.

Separa JSON y nombres de C#

Los consumidores JSON dependen del documento intercambiado. JsonPropertyName de System.Text.Json establece explícitamente el nombre JSON de una propiedad. Verifica escritura y lectura: producir un documento correcto solo prueba la mitad del contrato. Ese atributo no garantiza que cualquier ofuscador conserve todos los constructores o miembros usados por reflexión.

Haz una prueba de ida y vuelta

Compila el código de abajo en una consola .NET 8. Debe imprimir json-contract=OK antes y después de proteger el ensamblado. Usa una copia del directorio de salida y sustituye solo el archivo correspondiente. El ejemplo comprueba order_id y la lectura del DTO. Amplíalo con políticas de nombres, enumeraciones, constructores y convertidores que realmente utilices.

Busca nombres almacenados como texto

Type.GetType, GetMethod, configuración y descubrimiento de complementos pueden evitar las referencias compiladas normales. No supongas que todas las cadenas se reescriben. Prefiere registros explícitos cuando sea viable, pero prueba el mecanismo de producción. Conservar una API pública ayuda a consumidores compilados, sin garantizar las búsquedas internas por reflexión.

Comprueba versiones y errores

Lee documentos guardados de una versión anterior con la versión protegida. Usa un consumidor sin recompilar, carga un complemento y abre pantallas reales. Incluye valores ausentes y nulos. La serialización generada puede reducir parte de la reflexión, pero no corrige cualquier cambio de nombres. Si no puedes mantener un contrato necesario, reduce la protección o utiliza un flujo que lo admita.

using System;
using System.Text.Json;
using System.Text.Json.Serialization;
public sealed class OrderDto
{
    [JsonPropertyName("order_id")]
    public int Id { get; set; }
}
public static class Program
{
    public static void Main()
    {
        string json = JsonSerializer.Serialize(new OrderDto { Id = 42 });
        var copy = JsonSerializer.Deserialize<OrderDto>(json);
        if (json != "{\"order_id\":42}" || copy?.Id != 42)
            throw new InvalidOperationException("JSON contract changed");
        Console.WriteLine("json-contract=OK");
    }
}

Guías de protección