FreeObfuscator.NET protection

.NET · C# · DLL · EXE

.NET 混淆怎样不破坏 JSON 与反射契约

用明确的 JSON 字段名和真实调用测试,发现改名导致的属性、类型或插件查找失败。

打开混淆工具

文件上传、账户和付款流程目前使用英文界面。

区分 JSON 名称与 C# 名称

JSON 调用方依赖的是交换文档。System.Text.Json 的 JsonPropertyName 可以给属性指定明确的 JSON 名称。序列化和反序列化都要检查:只生成正确文档,只验证了一半契约。这个特性并不保证任意混淆器都保留所有经反射访问的成员、构造函数或转换器。

先跑一个可复现的双向测试

把下方代码放进 .NET 8 控制台项目,混淆前后都应输出 json-contract=OK。使用输出目录副本,只替换对应应用程序集。例子检查 order_id 名称和 DTO 回读,但不能推导出所有 DTO 都兼容。应补上项目实际采用的命名策略、枚举格式、构造函数选择和自定义转换器。

盘点以文本保存的类型与成员名称

Type.GetType、GetMethod、配置项和插件发现可能绕过普通编译引用。不要假设工具会改写任意字符串;条件允许时优先使用明确注册或类型引用,但仍须测试生产加载方式。类库保留公共 API 有助于已有编译调用方,并不自动保证内部反射查找正确。

同时测试新旧版本与异常输入

用受保护版本读取旧版保存的文档,让不重新编译的调用方使用新 DLL,并实际加载插件和打开相关界面。加入缺失值、null 和错误输入。源生成序列化可以减少部分反射,但不能自动修复任意改名。如果现有选项不能维持必要契约,应降低保护范围或使用能保留该契约的流程。

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");
    }
}

程序集保护指南